Log4Net, मेरे लॉगिंग में एक कस्टम फ़ील्ड कैसे जोड़ें


98

मैं log4net.Appender.AdoNetAppender ऐपेंडर का उपयोग करता हूं।
मेरी log4net टेबल निम्नलिखित क्षेत्र हैं[Date],[Thread],[Level],[Logger],[Message],[Exception]

मुझे log4net तालिका (जैसे SalesId) में एक और फ़ील्ड जोड़ने की आवश्यकता होगी, लेकिन मैं किसी त्रुटि या जानकारी संदेश को लॉग करते समय "SalesId" लॉग करने के लिए अपने xml और कोड में कैसे निर्दिष्ट करूंगा?

जैसे log.Info("SomeMessage", SalesId)

यहाँ log4net xml है

  <appender name="SalesDBAppender" type="log4net.Appender.AdoNetAppender">
    <bufferSize value="1" />
    <connectionType value ="System.Data.SqlClient.SqlConnection" />
    <connectionString value="Data Source=..." />
    <commandText value="INSERT INTO Log4Net ([Date],[Thread],[Level],[Logger],[Message],[Exception]) VALUES (@log_date, @thread, @log_level, @logger, @message, @exception)" />
    <parameter>
      <parameterName value="@log_date" />
      <dbType value="DateTime" />
      <layout type="log4net.Layout.RawTimeStampLayout" />
    </parameter>
    <parameter>
      <parameterName value="@thread" />
      <dbType value="String" />
      <size value="255" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%thread" />
      </layout>
    </parameter>
    <parameter>
      <parameterName value="@log_level" />
      <dbType value="String" />
      <size value="50" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%level" />
      </layout>
    </parameter>
    <parameter>
      <parameterName value="@logger" />
      <dbType value="String" />
      <size value="255" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%logger" />
      </layout>
    </parameter>
    <parameter>
      <parameterName value="@message" />
      <dbType value="String" />
      <size value="4000" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%message" />
      </layout>
    </parameter>
    <parameter>
      <parameterName value="@exception" />
      <dbType value="String" />
      <size value="2000" />
      <layout type="log4net.Layout.ExceptionLayout" />
    </parameter>
  </appender>

जवाबों:


190

1) कमांड टेक्स्ट को संशोधित करें: INSERT INTO Log4Net ([Date],[Thread],[Level],[Logger],[Message],[Exception],[MyColumn]) VALUES (@log_date, @thread, @log_level, @logger, @message, @exception, @CustomColumn)

2) कस्टम कॉलम के लिए पैरामीटर परिभाषा जोड़ें:

<parameter>
   <parameterName value="@CustomColumn"/>
   <dbType value="String" />
   <size value="255" />
   <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%property{CustomColumn}" />
  </layout>
</parameter>

3) फिर पैरामीटर में मूल्यों को स्थानांतरित करने के लिए log4net के संदर्भों में से एक का उपयोग करें:

// thread properties...
log4net.LogicalThreadContext.Properties["CustomColumn"] = "Custom value";
log.Info("Message"); 

// ...or global properties
log4net.GlobalContext.Properties["CustomColumn"] = "Custom value";

2
क्या कोई सुझाव दे सकता है कि ब्राउज़र क्षमताओं को लॉग करने के लिए कौन सा संदर्भ सबसे अच्छा है।
विवेकदेव

1
@ डंबडेव, आमतौर पर आप थ्रेड संदर्भ का उपयोग करेंगे। GlobalContext उन गुणों को सेट करने के लिए उपयोगी है जो बहुत बार नहीं बदलते हैं।
मार्सेलो डे ज़ेन

1
किसी वेब अनुप्रयोग में थ्रेडकोनेट का उपयोग करते समय आपको बहुत सावधान रहना चाहिए, हालांकि चूंकि ये थ्रेड्स जंप करते हैं और थ्रेडकोटेक्स्ट को इसके साथ स्थानांतरित नहीं किया जाएगा।
रोबा

4
@ विंडसर LogicalThreadContextटास्क के साथ उपयोग करने के लिए ठीक है ThreadContext, हालांकि इसका उपयोग करना ठीक नहीं है , क्योंकि यह हमेशा एक विशेष धागे से बंधा होता है ।
मार्सेलो डे ज़ेन

5
यह मेरी राय है, लेकिन यह इस तरह से थोड़ा अजीब लगता है, मुझे एक अतिभार की उम्मीद थी जो नए LoggingEvent उदाहरण में जोड़ने के लिए अधिक तर्क लेता है ..
A77

6

Log4Net में तीन प्रकार के लॉगिंग संदर्भ उपलब्ध हैं।

  1. Log4Net.GlobalContext: - यह संदर्भ सभी एप्लिकेशन थ्रेड और डोमेन में साझा किया जाता है। यदि दो धागे GlobalContext पर एक ही प्रॉपर्टी सेट करते हैं, तो एक मान दूसरे को ओवरराइड करेगा।

  2. Log4Net.ThreadContext: - यह संदर्भ दायरा कॉलिंग थ्रेड तक सीमित है। यहां दो धागे एक ही संपत्ति को एक-दूसरे को ओवरराइड किए बिना अलग-अलग मूल्यों पर सेट कर सकते हैं।

  3. Log4Net.ThreadLogicalContext: - यह संदर्भ थ्रेडकोटेक्स्ट के समान व्यवहार करता है। यदि आप एक कस्टम थ्रेड पूल एल्गोरिथ्म के साथ काम कर रहे हैं या सीएलआर की मेजबानी कर रहे हैं, तो आपको इसके लिए कुछ उपयोग मिल सकता है।

अपने program.cs फ़ाइल में निम्न कोड जोड़ें:

static void Main( string[] args )
{
    log4net.Config.XmlConfigurator.Configure();
    log4net.ThreadContext.Properties[ "myContext" ] = "Logging from Main";
    Log.Info( "this is an info message" );
    Console.ReadLine();
}

2) कस्टम कॉलम के लिए पैरामीटर परिभाषा जोड़ें:

  <log4net>      
    <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender">
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%logger (%property{myContext}) [%level]- %message%newline" />
      </layout>
    </appender> 
  </log4net>

3

यहां कुछ व्यक्तिगत वरीयताओं के साथ एक कार्यशील संस्करण है। मैंने एक जेनरेट अपवाद कोड को संग्रहीत करने के लिए एक कस्टम कॉलम जोड़ा।

1) Log4net config में अपना कस्टम कॉलम (अपवाद यहाँ जोड़ें):

<commandText value="INSERT INTO Log([Date],[Thread],[Level],[Logger],[Message],[Exception],[ExceptionCode]) 
VALUES (@log_date, @thread, @log_level, @logger, @message, @exception,@exceptionCode)" />

<parameter>
    <parameterName value="@exceptionCode" />
    <dbType value="String" />
    <size value="11" />
    <layout type="Common.Utils.LogHelper.Log4NetExtentedLoggingPatternLayout">
        <conversionPattern value="%exceptionCode{Code}" />
    </layout>
</parameter>

2) Log4NetExtentedLoggingCustomParameters.cs

namespace Common.Utils.LogHelper
{
    public class Log4NetExtentedLoggingCustomParameters
    {
        public string ExceptionCode { get; set; }

        public string Message { get; set; }

        public override string ToString()
        {
            return Message;
        }
    }
}

3) Log4NetExtentedLoggingPatternConverter.cs

namespace Common.Utils.LogHelper
{
    public class Log4NetExtentedLoggingPatternConverter : PatternConverter
    {
        protected override void Convert(TextWriter writer, object state)
        {
            if (state == null)
            {
                writer.Write(SystemInfo.NullText);
                return;
            }

            var loggingEvent = state as LoggingEvent;
            var messageObj = loggingEvent.MessageObject as Log4NetExtentedLoggingCustomParameters;

            if (messageObj == null)
            {
                writer.Write(SystemInfo.NullText);
            }
            else
            {
                switch (this.Option.ToLower()) //this.Option = "Code"
                {
                    case "code": //config conversionPattern parameter -> %exceptionCode{Code}
                        writer.Write(messageObj.ExceptionCode);
                        break;  
                    default:
                        writer.Write(SystemInfo.NullText);
                        break;
                }
            }
        }
    }
}

4) Log4NetExtentedLoggingPatternLayout.cs

namespace Common.Utils.LogHelper
{
    public class Log4NetExtentedLoggingPatternLayout : PatternLayout
    {
        public Log4NetExtentedLoggingPatternLayout()
        {
            var customConverter = new log4net.Util.ConverterInfo()
            {
                Name = "exceptionCode",
                Type = typeof(Log4NetExtentedLoggingPatternConverter)
            };

            AddConverter(customConverter);
        }
    }
}

5) Logger.cs // नए कॉलम के साथ अपने लकड़हारे का आनंद लें! :)

namespace Common.Utils.LogHelper
{
    public class Logger
    {
        static ILog Logger = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

        public static string LogError(string message, Exception exception = null)
        {
            var logWithErrCode = GetLogWithErrorCode(message);
            Logger.Error(logWithErrCode, exception);
            return logWithErrCode.ExceptionCode;
        }

        private static Log4NetExtentedLoggingCustomParameters GetLogWithErrorCode(string message)
        {
            var logWithErrCode = new Log4NetExtentedLoggingCustomParameters();
            logWithErrCode.ExceptionCode = GenerateErrorCode(); //this method is absent for simplicity. Use your own implementation
            logWithErrCode.Message = message;
            return logWithErrCode;
        }
    }
}

संदर्भ:

http://blog.stvjam.es/2014/01/logging-custom-objects-and-fields-with

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.