2011-10-25 116 views
6

我正在使用最新版本的NLog(來自nuget),並以編程方式進行配置。 目前它保存在我的數據庫中,但我希望它能加密我的stacktrace參數。NLog - 如何加密數據庫中記錄的堆棧跟蹤

NLog是否有任何方法自動執行此操作? 鑑於我有一個簡單的函數來加密堆棧跟蹤是否有一個簡單的方法來應用它?

回答

7

我建議寫LayoutRendererWrapper。一個LayoutRendererWrapper允許你「包裝」一個LayoutRenderer,這樣你就可以對輸出進行處理。在對堆棧跟蹤進行加密的情況下,您可以配置NLog以將StackTrace添加到輸出,但可以將StackTrace佈局渲染器包裝起來,以便應用加密。

您會在NLog's source code repository中看到LayuoutRendererWrappers的示例。

實際上,LayoutRendererWrapper的一般性質意味着您可以編寫一個加密包裝並將其應用於任何LayoutRenderer。因此,例如,您可以加密堆棧跟蹤和消息,但將其餘字段保留爲明文。

這裏是一個如何編寫一個加密LayoutRendererWrapper一個例子(未經測試):

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

我認爲它會在NLog.config文件進行配置是這樣的:

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

我不知道如何以編程方式配置它,因爲我通常不使用編程配置。

+0

謝謝,我認爲這是它。 –

+0

謝謝。你必須添加到你的main:'ConfigurationItemFactory.Default.LayoutRenderers .RegisterDefinition(「Encrypt」,typeof(NLog.LayoutRenderers.Wrappers.EncryptLayoutRendererWrapper));' – daniel

1

假設你有一個擴展方法稱爲Encrypt您可以在String對象調用,

我看到了兩個解決方案:

  • 要麼你在你的代碼登錄時打電話給你的加密功能:

 

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

 

  • 或者你可以創建新的方法來記錄事件,並呼籲他們,而不是基本NLog.Log()方法:

 

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

這是一個體面的替代 –