Log4Net, cách thêm trường tùy chỉnh vào nhật ký của tôi


98

Tôi sử dụng appender log4net.Appender.AdoNetAppender.
Bảng log4net của tôi là các trường sau[Date],[Thread],[Level],[Logger],[Message],[Exception]

Tôi cần thêm một trường khác vào bảng log4net (ví dụ: SalesId), nhưng làm cách nào để chỉ định trong mã xml và trong mã của tôi để ghi "SalesId" khi ghi thông báo Lỗi hoặc Thông tin?

ví dụ log.Info("SomeMessage", SalesId)

Đây là 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>

Câu trả lời:


190

1) Sửa đổi văn bản lệnh: INSERT INTO Log4Net ([Date],[Thread],[Level],[Logger],[Message],[Exception],[MyColumn]) VALUES (@log_date, @thread, @log_level, @logger, @message, @exception, @CustomColumn)

2) Thêm định nghĩa tham số cho cột tùy chỉnh:

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

3) Sau đó, sử dụng một trong các ngữ cảnh của log4net để chuyển các giá trị đến tham số:

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

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

2
Ai đó có thể đề xuất Ngữ cảnh nào là tốt nhất để ghi nhật ký các khả năng của trình duyệt.
VivekDev

1
@DumbDev, thường thì bạn sẽ sử dụng ngữ cảnh Thread. GlobalContext rất hữu ích để thiết lập các thuộc tính không thường xuyên thay đổi.
Marcelo De Zen

1
Tuy nhiên, bạn nên hết sức cẩn thận khi sử dụng ThreadContext trong Ứng dụng Web vì chúng có xu hướng nhảy các luồng và ThreadContext sẽ không được di chuyển cùng với nó.
Robba

4
@theberserker LogicalThreadContextcó thể sử dụng với Tasks, Tuy nhiên, không được sử dụng ThreadContextvì nó luôn bị ràng buộc với một chủ đề cụ thể.
Marcelo De Zen

5
Đó là quan điểm của tôi, nhưng nó có vẻ hơi lạ theo cách này, tôi mong đợi một tình trạng quá tải mà phải mất nhiều lý lẽ để thêm vào dụ LoggingEvent mới ..
A77

6

Ba loại ngữ cảnh ghi nhật ký có sẵn trong Log4Net.

  1. Log4Net.GlobalContext: - Ngữ cảnh này được chia sẻ trên tất cả các chuỗi ứng dụng và miền. Nếu hai luồng đặt cùng một thuộc tính trên GlobalContext, một giá trị sẽ ghi đè lên giá trị kia.

  2. Log4Net.ThreadContext: - Phạm vi ngữ cảnh này giới hạn trong việc gọi luồng. Ở đây hai luồng có thể đặt cùng một thuộc tính thành các giá trị khác nhau mà không cần ghi đè lên nhau.

  3. Log4Net.ThreadLogicalContext: - Ngữ cảnh này hoạt động tương tự như ThreadContext. nếu bạn đang làm việc với thuật toán nhóm luồng tùy chỉnh hoặc lưu trữ CLR, bạn có thể thấy một số công dụng cho thuật toán này.

Thêm mã sau vào tệp program.cs của bạn:

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) Thêm định nghĩa tham số cho cột tùy chỉnh:

  <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

Đây là một phiên bản làm việc với một số tùy chọn được cá nhân hóa. Tôi đã thêm một cột tùy chỉnh để lưu trữ mã ngoại lệ đã tạo.

1) Thêm cột tùy chỉnh của bạn (Mã ngoại lệ tại đây) vào cấu hình Log4net:

<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 // Tận hưởng trình ghi nhật ký của bạn với cột mới! :)

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;
        }
    }
}

người giới thiệu:

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.