Beispiel #1
0
        /// <summary>
        /// Does the actual writing of the XML.
        /// </summary>
        /// <param name="writer">The writer to use to output the event to.</param>
        /// <param name="loggingEvent">The event to write.</param>
        /// <remarks>
        /// <para>
        /// Override the base class <see cref="XmlLayoutBase.FormatXml"/> method
        /// to write the <see cref="LoggingEvent"/> to the <see cref="XmlWriter"/>.
        /// </para>
        /// </remarks>
        override protected void FormatXml(XmlWriter writer, LoggingEvent loggingEvent)
        {
            writer.WriteStartElement(m_elmEvent);
            writer.WriteAttributeString(ATTR_LOGGER, loggingEvent.LoggerName);

#if NET_2_0 || NETCF_2_0 || MONO_2_0 || UNITY_4_3 || UNITY_5
            writer.WriteAttributeString(ATTR_TIMESTAMP, XmlConvert.ToString(loggingEvent.TimeStamp, XmlDateTimeSerializationMode.Local));
#else
            writer.WriteAttributeString(ATTR_TIMESTAMP, XmlConvert.ToString(loggingEvent.TimeStamp));
#endif

            writer.WriteAttributeString(ATTR_LEVEL, loggingEvent.Level.DisplayName);
            writer.WriteAttributeString(ATTR_THREAD, loggingEvent.ThreadName);

            if (loggingEvent.Domain != null && loggingEvent.Domain.Length > 0)
            {
                writer.WriteAttributeString(ATTR_DOMAIN, loggingEvent.Domain);
            }
            if (loggingEvent.Identity != null && loggingEvent.Identity.Length > 0)
            {
                writer.WriteAttributeString(ATTR_IDENTITY, loggingEvent.Identity);
            }
            if (loggingEvent.UserName != null && loggingEvent.UserName.Length > 0)
            {
                writer.WriteAttributeString(ATTR_USERNAME, loggingEvent.UserName);
            }

            // Append the message text
            writer.WriteStartElement(m_elmMessage);
            if (!this.Base64EncodeMessage)
            {
#if UNITY_4_3 || UNITY_5
                TransformLog4Net.WriteEscapedXmlString(writer, loggingEvent.RenderedMessage, this.InvalidCharReplacement);
#else
                Transform.WriteEscapedXmlString(writer, loggingEvent.RenderedMessage, this.InvalidCharReplacement);
#endif
            }
            else
            {
                byte[] messageBytes  = Encoding.UTF8.GetBytes(loggingEvent.RenderedMessage);
                string base64Message = Convert.ToBase64String(messageBytes, 0, messageBytes.Length);
#if UNITY_4_3 || UNITY_5
                TransformLog4Net.WriteEscapedXmlString(writer, base64Message, this.InvalidCharReplacement);
#else
                Transform.WriteEscapedXmlString(writer, base64Message, this.InvalidCharReplacement);
#endif
            }
            writer.WriteEndElement();

            PropertiesDictionary properties = loggingEvent.GetProperties();

            // Append the properties text
            if (properties.Count > 0)
            {
                writer.WriteStartElement(m_elmProperties);
                foreach (System.Collections.DictionaryEntry entry in properties)
                {
                    writer.WriteStartElement(m_elmData);
#if UNITY_4_3 || UNITY_5
                    writer.WriteAttributeString(ATTR_NAME, TransformLog4Net.MaskXmlInvalidCharacters((string)entry.Key, this.InvalidCharReplacement));
#else
                    writer.WriteAttributeString(ATTR_NAME, Transform.MaskXmlInvalidCharacters((string)entry.Key, this.InvalidCharReplacement));
#endif

                    // Use an ObjectRenderer to convert the object to a string
                    string valueStr = null;
                    if (!this.Base64EncodeProperties)
                    {
#if UNITY_4_3 || UNITY_5
                        valueStr = TransformLog4Net.MaskXmlInvalidCharacters(loggingEvent.Repository.RendererMap.FindAndRender(entry.Value), this.InvalidCharReplacement);
#else
                        valueStr = Transform.MaskXmlInvalidCharacters(loggingEvent.Repository.RendererMap.FindAndRender(entry.Value), this.InvalidCharReplacement);
#endif
                    }
                    else
                    {
                        byte[] propertyValueBytes = Encoding.UTF8.GetBytes(loggingEvent.Repository.RendererMap.FindAndRender(entry.Value));
                        valueStr = Convert.ToBase64String(propertyValueBytes, 0, propertyValueBytes.Length);
                    }
                    writer.WriteAttributeString(ATTR_VALUE, valueStr);

                    writer.WriteEndElement();
                }
                writer.WriteEndElement();
            }

            string exceptionStr = loggingEvent.GetExceptionString();
            if (exceptionStr != null && exceptionStr.Length > 0)
            {
                // Append the stack trace line
                writer.WriteStartElement(m_elmException);
#if UNITY_4_3 || UNITY_5
                TransformLog4Net.WriteEscapedXmlString(writer, exceptionStr, this.InvalidCharReplacement);
#else
                Transform.WriteEscapedXmlString(writer, exceptionStr, this.InvalidCharReplacement);
#endif
                writer.WriteEndElement();
            }

            if (LocationInfo)
            {
                LocationInfo locationInfo = loggingEvent.LocationInformation;

                writer.WriteStartElement(m_elmLocation);
                writer.WriteAttributeString(ATTR_CLASS, locationInfo.ClassName);
                writer.WriteAttributeString(ATTR_METHOD, locationInfo.MethodName);
                writer.WriteAttributeString(ATTR_FILE, locationInfo.FileName);
                writer.WriteAttributeString(ATTR_LINE, locationInfo.LineNumber);
                writer.WriteEndElement();
            }

            writer.WriteEndElement();
        }
Beispiel #2
0
        /* Example log4j schema event
         *
         * <log4j:event logger="first logger" level="ERROR" thread="Thread-3" timestamp="1051494121460">
         * <log4j:message><![CDATA[errormsg 3]]></log4j:message>
         * <log4j:NDC><![CDATA[third]]></log4j:NDC>
         * <log4j:MDC>
         * <log4j:data name="some string" value="some valuethird"/>
         * </log4j:MDC>
         * <log4j:throwable><![CDATA[java.lang.Exception: someexception-third
         * at org.apache.log4j.chainsaw.Generator.run(Generator.java:94)
         * ]]></log4j:throwable>
         * <log4j:locationInfo class="org.apache.log4j.chainsaw.Generator"
         * method="run" file="Generator.java" line="94"/>
         * <log4j:properties>
         * <log4j:data name="log4jmachinename" value="windows"/>
         * <log4j:data name="log4japp" value="udp-generator"/>
         * </log4j:properties>
         * </log4j:event>
         *
         */

        /* Since log4j 1.3 the log4j:MDC has been combined into the log4j:properties element */

        /// <summary>
        /// Actually do the writing of the xml
        /// </summary>
        /// <param name="writer">the writer to use</param>
        /// <param name="loggingEvent">the event to write</param>
        /// <remarks>
        /// <para>
        /// Generate XML that is compatible with the log4j schema.
        /// </para>
        /// </remarks>
        override protected void FormatXml(XmlWriter writer, LoggingEvent loggingEvent)
        {
            // Translate logging events for log4j

            // Translate hostname property
            if (loggingEvent.LookupProperty(LoggingEvent.HostNameProperty) != null &&
                loggingEvent.LookupProperty("log4jmachinename") == null)
            {
                loggingEvent.GetProperties()["log4jmachinename"] = loggingEvent.LookupProperty(LoggingEvent.HostNameProperty);
            }

            // translate appdomain name
            if (loggingEvent.LookupProperty("log4japp") == null &&
                loggingEvent.Domain != null &&
                loggingEvent.Domain.Length > 0)
            {
                loggingEvent.GetProperties()["log4japp"] = loggingEvent.Domain;
            }

            // translate identity name
            if (loggingEvent.Identity != null &&
                loggingEvent.Identity.Length > 0 &&
                loggingEvent.LookupProperty(LoggingEvent.IdentityProperty) == null)
            {
                loggingEvent.GetProperties()[LoggingEvent.IdentityProperty] = loggingEvent.Identity;
            }

            // translate user name
            if (loggingEvent.UserName != null &&
                loggingEvent.UserName.Length > 0 &&
                loggingEvent.LookupProperty(LoggingEvent.UserNameProperty) == null)
            {
                loggingEvent.GetProperties()[LoggingEvent.UserNameProperty] = loggingEvent.UserName;
            }

            // Write the start element
            writer.WriteStartElement("log4j:event");
            writer.WriteAttributeString("logger", loggingEvent.LoggerName);

            // Calculate the timestamp as the number of milliseconds since january 1970
            //
            // We must convert the TimeStamp to UTC before performing any mathematical
            // operations. This allows use to take into account discontinuities
            // caused by daylight savings time transitions.
            TimeSpan timeSince1970 = loggingEvent.TimeStamp.ToUniversalTime() - s_date1970;

            writer.WriteAttributeString("timestamp", XmlConvert.ToString((long)timeSince1970.TotalMilliseconds));
            writer.WriteAttributeString("level", loggingEvent.Level.DisplayName);
            writer.WriteAttributeString("thread", loggingEvent.ThreadName);

            // Append the message text
            writer.WriteStartElement("log4j:message");
#if UNITY_4_3
            TransformLog4Net.WriteEscapedXmlString(writer, loggingEvent.RenderedMessage, this.InvalidCharReplacement);
#else
            Transform.WriteEscapedXmlString(writer, loggingEvent.RenderedMessage, this.InvalidCharReplacement);
#endif
            writer.WriteEndElement();

            object ndcObj = loggingEvent.LookupProperty("NDC");
            if (ndcObj != null)
            {
                string valueStr = loggingEvent.Repository.RendererMap.FindAndRender(ndcObj);

                if (valueStr != null && valueStr.Length > 0)
                {
                    // Append the NDC text
                    writer.WriteStartElement("log4j:NDC");
#if UNITY_4_3
                    TransformLog4Net.WriteEscapedXmlString(writer, valueStr, this.InvalidCharReplacement);
#else
                    Transform.WriteEscapedXmlString(writer, valueStr, this.InvalidCharReplacement);
#endif
                    writer.WriteEndElement();
                }
            }

            // Append the properties text
            PropertiesDictionary properties = loggingEvent.GetProperties();
            if (properties.Count > 0)
            {
                writer.WriteStartElement("log4j:properties");
                foreach (System.Collections.DictionaryEntry entry in properties)
                {
                    writer.WriteStartElement("log4j:data");
                    writer.WriteAttributeString("name", (string)entry.Key);

                    // Use an ObjectRenderer to convert the object to a string
                    string valueStr = loggingEvent.Repository.RendererMap.FindAndRender(entry.Value);
                    writer.WriteAttributeString("value", valueStr);

                    writer.WriteEndElement();
                }
                writer.WriteEndElement();
            }

            string exceptionStr = loggingEvent.GetExceptionString();
            if (exceptionStr != null && exceptionStr.Length > 0)
            {
                // Append the stack trace line
                writer.WriteStartElement("log4j:throwable");
#if UNITY_4_3
                TransformLog4Net.WriteEscapedXmlString(writer, exceptionStr, this.InvalidCharReplacement);
#else
                Transform.WriteEscapedXmlString(writer, exceptionStr, this.InvalidCharReplacement);
#endif
                writer.WriteEndElement();
            }

            if (LocationInfo)
            {
                LocationInfo locationInfo = loggingEvent.LocationInformation;

                writer.WriteStartElement("log4j:locationInfo");
                writer.WriteAttributeString("class", locationInfo.ClassName);
                writer.WriteAttributeString("method", locationInfo.MethodName);
                writer.WriteAttributeString("file", locationInfo.FileName);
                writer.WriteAttributeString("line", locationInfo.LineNumber);
                writer.WriteEndElement();
            }

            writer.WriteEndElement();
        }