2010-10-18 33 views
6

Có thể tạo một mẫu tùy chỉnh LogLnet mẫu cho phép đặt giá trị "chỉ mục" không? Tôi biết về "tài sản" chuỗi chuyển đổi cho phép bạn viết mã như thế này:Thuộc tính log4net tùy chỉnh PatternLayoutConverter (có chỉ mục)

ThreadContext.Properties["ID"] = yourID; 

Và chỉ định như thế này:

%property{ID} 

Đó là giá trị cần được đưa vào đầu ra.

Điều gì sẽ xảy ra nếu các giá trị tôi muốn đăng nhập nằm trong một số "từ điển" khác? Tôi cho rằng tôi có thể viết một số logic để sao chép các giá trị đó từ từ điển sang một trong các bối cảnh log4net và sau đó chỉ sử dụng mã thông báo được xây dựng trong %property. Điều gì sẽ xảy ra nếu tôi muốn log4net đăng nhập các giá trị trực tiếp từ "từ điển" của riêng tôi dựa trên giá trị chỉ mục được chỉ định trong tệp cấu hình?

Tôi có thể viết PatternLayoutConverter của riêng tôi mà sẽ cho phép tôi để cấu hình một cái gì đó như thế này:

%myproperty{ID} 

Và sau đó kéo "ID" giá trị tương ứng từ "từ điển" của riêng tôi?

Đối với bất cứ ai quan tâm, nó là khá dễ dàng để làm điều tương tự với NLog:

[LayoutRenderer("MyGDC")] 
    class GdcLayoutRenderer : LayoutRenderer 
    { 
    [RequiredParameter] 
    [DefaultParameter] 
    public string Item { get; set; } 

    protected override void Append(StringBuilder builder, LogEventInfo logEvent) 
    { 
     string msg = GDC.Get(this.Item); 
     builder.Append(msg); 
    } 

    protected override int GetEstimatedBufferSize(LogEventInfo logEvent) 
    { 
     return 10; 
    } 
    } 

Và cấu hình như thế này:

Nói NLog về bất kỳ lắp ráp với phần mở rộng:

<extensions> 
    <add assembly="NLog.Extensions"/> 
    </extensions> 

Sử dụng thuộc tính "được lập chỉ mục" trong bố cục:

<layout="${longdate} | ${MyGDC:item=name} | ${message}"/> 

Trong ví dụ này, tôi đang sử dụng đối tượng GDC của NLog làm từ điển, nhưng tôi minh họa cách tôi có thể viết LayoutRenderer "indexable" của riêng mình (tương đương hoặc ít hơn tương đương với PatternLayoutConverter của log4net) để truy cập vào một giá trị được chỉ mục bởi một giá trị trong tệp cấu hình.

[EDIT] Tôi nhận được câu trả lời mình muốn. Tôi đã bao gồm mã cho TemplateLayoutRenderer mẫu của tôi ở đây. Trong bài kiểm tra của tôi, tôi có một từ điển tĩnh trong lớp biểu mẫu chính của tôi, nơi tôi có thể lưu trữ "cài đặt ứng dụng". Tôi đã tạo một PatternLayoutConverter có thể chấp nhận một khóa làm tham số để trình chuyển đổi có thể tìm kiếm giá trị chính xác trong từ điển. Tôi có thể đạt được chức năng tương tự bằng cách sử dụng đối tượng bối cảnh log4net (hoặc NLog), nhưng trong ứng dụng của chúng tôi, chúng tôi có thể có một số cài đặt hoặc thông tin phiên mà ứng dụng sẽ giữ cho các mục đích khác và chúng tôi muốn có thể thêm vào đăng nhập đầu ra. Vì nó sẽ có trong một cấu trúc tra cứu, nó sẽ là tốt đẹp để có thể tham khảo dữ liệu trực tiếp hơn là phải sao chép rõ ràng nó vào log4net (hoặc bối cảnh NLog).

Dù sao, đây là mã:

namespace Log4NetTest 
{ 
    class KeyLookupPatternConverter : PatternLayoutConverter 
    { 
    protected override void Convert(System.IO.TextWriter writer, LoggingEvent loggingEvent) 
    { 
     //Use the value in Option as a key into the "application settings" stored on the main form. 
     string setting; 
     if (Form1.AppSettings.TryGetValue(Option, out setting)) 
     { 
     writer.Write(setting); 
     } 
    } 
    } 
} 

Layout cấu hình:

//Log the "sessionid" and "userid" values from our "application settings" object 
    <layout type="log4net.Layout.PatternLayout"> 
    <param name="ConversionPattern" value="%d [%t] %-5p [session = %KLPC{sessionid}] [user = %KLPC{userid}] %m%n"/> 
    <converter> 
     <name value="KLPC" /> 
     <type value="Log4NetTest.KeyLookupPatternConverter" /> 
    </converter> 
    </layout> 

Trả lời

4

Tôi không thử nó nhưng điều này nên làm việc.Trong log4net bạn có thể vượt qua một chuỗi tùy chọn để chuyển đổi mô hình như thế này:

%converterName{converterOptions} 

Bộ chuyển đổi ngày mẫu ví dụ có thể được sử dụng như thế này:

%date{HH:mm:ss,fff} 

Điều này có nghĩa bạn có thể viết Chuyển đổi mô hình của bạn cách bạn đề xuất. Một ví dụ đơn giản cho bộ chuyển đổi như vậy có thể được tìm thấy here.

Trong phương thức Convert bạn có thể truy cập chuỗi thuộc tính bằng thuộc tính 'Tùy chọn' (được định nghĩa trong lớp PatternConverter) và sử dụng ngữ cảnh chuỗi để nhận mục nhập mong muốn từ từ điển. Bạn cũng có thể thực hiện giao diện IOptionHandler nếu các tùy chọn của bạn bao gồm nhiều hơn thì chỉ cần nhập từ điển: Bằng cách này bạn có thể phân tích các tùy chọn khi kích hoạt cấu hình log4net.

+0

Cảm ơn! Điều đó đã làm chính xác những gì tôi muốn làm. Tôi sẽ thêm LayoutPatternConverter thử nghiệm vào câu hỏi của tôi để tham khảo trong trường hợp ai đó quan tâm. – wageoghe

Các vấn đề liên quan