লগ 4 নেট, কীভাবে আমার লগিংয়ে একটি কাস্টম ফিল্ড যুক্ত করা যায়


98

আমি লগ 4 নেট.অ্যাপেন্ডার.এডনেট অ্যাপেন্ডার অ্যাপেন্ডার ব্যবহার করি।
আমার লগ 4 নেট টেবিলটি নিম্নলিখিত ক্ষেত্রগুলি[Date],[Thread],[Level],[Logger],[Message],[Exception]

আমাকে লগ 4 নেট টেবিলটিতে (যেমন সেলসআইডি) আরও একটি ক্ষেত্র যুক্ত করা দরকার, তবে ত্রুটি বা তথ্য বার্তায় লগ করার সময় আমি কীভাবে আমার এক্সএমএল এবং কোডটিতে "সেলসআইডি" লগ করব?

যেমন log.Info("SomeMessage", SalesId)

এখানে লগ 4 নেট এক্সএমএল

  <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) তারপরে প্যারামিটারে মান স্থানান্তর করতে লগ 4 নেট এর একটি প্রসঙ্গ ব্যবহার করুন:

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

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

4
লগিং ব্রাউজারের সক্ষমতার জন্য কোন প্রসঙ্গটি সেরা তা কেউ পরামর্শ দিতে পারে?
বিবেকদেভ

4
@ ডাম্বডেভ, সাধারণত আপনি থ্রেড প্রসঙ্গটি ব্যবহার করবেন। গ্লোবাল কনটেক্সট এমন বৈশিষ্ট্যগুলি সেট করতে দরকারী যা খুব ঘন ঘন পরিবর্তিত হয় না।
মার্সেলো দে জেন

4
কোনও ওয়েব অ্যাপ্লিকেশনটিতে থ্রেডকন্টেক্সট ব্যবহার করার সময় আপনাকে খুব সতর্কতা অবলম্বন করা উচিত যদিও এগুলি থ্রেডগুলি ঝাঁপিয়ে পড়ে এবং থ্রেডকন্টেক্সট এটির সাথে সরানো হবে না।
রব্বা

4
@ থাইবার্সকারটি LogicalThreadContextটাস্কগুলির সাথে ব্যবহার করা ঠিক আছে, তবে এটি ব্যবহার করা ঠিক নয় ThreadContext, কারণ এটি সর্বদা একটি নির্দিষ্ট থ্রেডের সাথে আবদ্ধ।
মার্সেলো দে জেন

4
এটি আমার মতামত, তবে এটি কিছুটা অদ্ভুত বলে মনে হচ্ছে, আমি একটি ওভারলোডের প্রত্যাশা করছিলাম যা নতুন লগিংএভেন্ট ইভেন্টে যুক্ত হতে আরও যুক্তি দেখায় ..
77

6

লগ 4 নেট এ তিন ধরণের লগিং প্রসঙ্গ পাওয়া যায়।

  1. লগ 4 নেট.গ্লোবাল কনটেক্সট: - এই প্রসঙ্গে সমস্ত অ্যাপ্লিকেশন থ্রেড এবং ডোমেন জুড়ে ভাগ করা হয়েছে two যদি দুটি থ্রেড একই সম্পত্তি গ্লোবালকন্টেক্সটে সেট করে, একটি মান অন্যটিকে ওভাররাইড করে।

  2. লগ 4 নেট.ট্রেডকন্টেক্সট: - এই প্রসঙ্গের সুযোগটি কল করার থ্রেডের মধ্যে সীমাবদ্ধ। এখানে দুটি থ্রেড একে অপরকে ওভাররাইড না করে বিভিন্ন মানগুলিতে একই সম্পত্তি সেট করতে পারে।

  3. লগ 4 নেট.ট্রেডলজিক্যাল কনটেক্সট: - এই প্রসঙ্গে থ্রেডকন্টেক্সটের অনুরূপ আচরণ করে। আপনি যদি কাস্টম থ্রেড পুল অ্যালগরিদম বা সিএলআর হোস্টিংয়ের সাথে কাজ করছেন তবে আপনি এটির জন্য কিছু ব্যবহার পেতে পারেন।

আপনার 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

এখানে কিছু ব্যক্তিগতকৃত পছন্দ সহ একটি কার্যকারী সংস্করণ is উত্পন্ন ব্যতিক্রম কোড সঞ্চয় করার জন্য আমি একটি কাস্টম কলাম যুক্ত করেছি।

1) লোগোনেট কনফিগারেশনে আপনার কাস্টম কলাম (ব্যতিক্রম কোড এখানে) যুক্ত করুন:

<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) লগ 4 নেট এক্সটেনটেডলগিং কাস্টমপ্যারামিটারস সি

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

        public string Message { get; set; }

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

3) লগ 4 নেট এক্সটেনটেডলগিংপ্যাটারনকনভার্টার সি

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) লগ 4 নেট এক্সটেনটেডলগিংপ্যাটার্ন লেআউট সি

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

            AddConverter(customConverter);
        }
    }
}

5) লগার সিএস // নতুন কলাম দিয়ে আপনার লগার উপভোগ করুন! :)

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

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.