2011-10-25 14 views
6

Tôi đang sử dụng phiên bản mới nhất của NLog (từ nuget) và tôi định cấu hình nó theo lập trình. Hiện tại nó lưu trong cơ sở dữ liệu của tôi nhưng tôi muốn nó mã hóa tham số stacktrace của tôi.NLog - làm thế nào tôi có thể mã hóa stacktrace đã đăng nhập trong cơ sở dữ liệu

Có cách nào NLog thực hiện điều này tự động không? Cho rằng tôi có một chức năng đơn giản để mã hóa stacktrace là có một cách dễ dàng để áp dụng nó?

Trả lời

7

tôi sẽ đề nghị viết một LayoutRendererWrapper. LayoutRendererWrapper cho phép bạn "bọc" một LayoutRenderer để bạn có thể áp dụng việc xử lý cho đầu ra. Trong trường hợp mã hóa dấu vết ngăn xếp, bạn có thể định cấu hình NLog để thêm StackTrace vào đầu ra, nhưng bạn có thể bọc trình kết xuất bố cục StackTrace để bạn có thể áp dụng mã hóa của mình.

Bạn xem ví dụ về LayuoutRendererWrappers trong NLog's source code repository.

Thực ra, tính chất chung của LayoutRendererWrapper có nghĩa là bạn có thể viết trình bao bọc mã hóa và áp dụng nó cho bất kỳ LayoutRenderer nào. Vì vậy, bạn có thể, ví dụ, mã hóa các dấu vết stack và tin nhắn, nhưng để lại phần còn lại của các lĩnh vực như văn bản rõ ràng.

Dưới đây là một ví dụ (chưa được kiểm tra) về cách bạn có thể viết một LayoutRendererWrapper mã hóa:

namespace NLog.LayoutRenderers.Wrappers 
{ 
    using System.ComponentModel; 
    using System.Globalization; 
    using NLog.Config; 

    [LayoutRenderer("Encrypt")] 
    [AmbientProperty("Encrypt")] 
    [ThreadAgnostic] 
    public sealed class EncryptLayoutRendererWrapper : WrapperLayoutRendererBase  
    { 
    public EncryptLayoutRendererWrapper() 
    { 
     this.Culture = CultureInfo.InvariantCulture; 
     this.Encrypt = true; 
    } 

    [DefaultValue(true)] 
    public bool Encrypt { get; set; } 

    public CultureInfo Culture { get; set; } 

    protected override string Transform(string text) 
    { 
     return this.Encrypt ? Encrypt(text) : text; 
    } 

    protected string Encrypt(string text) 
    { 
     //Encrypt your text here. 
    } 
    } 
} 

Tôi nghĩ rằng nó sẽ được cấu hình như thế này trong các tập tin NLog.config:

${longdate} | ${logger} | ${level} | ${encrypt:${stacktrace}} | ${message} 

tôi 'không chắc chắn làm thế nào bạn sẽ cấu hình nó lập trình như tôi thường không sử dụng cấu hình có lập trình.

+0

cảm ơn, tôi nghĩ rằng đây là nó. –

+0

cảm ơn. Bạn phải thêm vào chính của bạn: 'ConfigurationItemFactory.Default.LayoutRenderers .RegisterDefinition (" Encrypt ", typeof (NLog.LayoutRenderers.Wrappers.EncryptLayoutRendererWrapper));' – daniel

1

Giả sử rằng bạn có một phương pháp mở rộng gọi là Encrypt rằng bạn có thể gọi về một đối tượng String,

tôi thấy hai giải pháp:

  • Hoặc bạn gọi chức năng mã hóa của bạn khi đăng nhập vào mã của bạn :

 

logger.Trace("Sample trace message".Encrypt()); 

 

  • Hoặc bạn có thể tạo ra những phương pháp mới để đăng nhập các sự kiện và gọi cho họ thay vì NLog.Log() phương pháp cơ bản:

 

class Log { 

    public static void TraceEncrypt(Logger logger, String message) { 
     LogEncrypt(logger, LogLevel.Trace, message); 
    } 

    public static void DebugEncrypt(Logger logger, String message) { 
     LogEncrypt(logger, LogLevel.Debug, message); 
    } 

    public static void InfoEncrypt(Logger logger, String message) { 
     LogEncrypt(logger, LogLevel.Info, message); 
    } 

    public static void WarnEncrypt(Logger logger, String message) { 
     LogEncrypt(logger, LogLevel.Warn, message); 
    } 

    public static void ErrorEncrypt(Logger logger, String message) { 
     LogEncrypt(logger, LogLevel.Error, message); 
    } 

    public static void FatalEncrypt(Logger logger, String message) { 
     LogEncrypt(logger, LogLevel.Fatal, message); 
    } 

    public static void LogEncrypt(Logger logger, LogLevel logLevel, String message) { 
     // Prepare log event 
     LogEventInfo logEvent = new LogEventInfo(logLevel, logger.Name, message.Encrypt()); 
     // Log data 
     logger.Log(logEvent); 
    } 
} 
+0

đây là một alt khá phù hợp –