2011-10-25 3 views
6

NLog의 최신 버전 (Nuget에서)을 사용하고 프로그래밍 방식으로 구성합니다. 현재 데이터베이스에 저장되어 있지만 stacktrace 매개 변수를 암호화하고 싶습니다.NLog - 데이터베이스의 기록 된 스택 트레이스를 암호화하는 방법

NLog가 자동으로 수행하는 방법이 있습니까? stacktrace를 암호화하는 간단한 함수가 있으므로이를 적용하기 쉬운 방법이 있습니까?

답변

7

이 난을 작성하는 제안을 LayoutRendererWrapper. LayoutRendererWrapper를 사용하면 출력에 처리를 적용 할 수 있도록 LayoutRenderer를 "래핑"할 수 있습니다. 스택 추적을 암호화하는 경우 NLog를 구성하여 StackTrace를 출력에 추가 할 수 있지만 암호화를 적용 할 수 있도록 StackTrace 레이아웃 렌더러를 래핑 할 수 있습니다.

LayuoutRendererWrappers의 예제는 NLog's source code repository에 있습니다.

사실, LayoutRendererWrapper의 일반적인 특성은 암호화 래퍼를 작성하여 모든 LayoutRenderer에 적용 할 수 있음을 의미합니다. 예를 들어 스택 추적과 메시지를 암호화 할 수 있지만 나머지 필드는 일반 텍스트로 남겨 둘 수 있습니다.

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} 

내가 여기

는 암호화의 LayoutRendererWrapper를 작성하는 방법의 예 (안된)입니다 일반적으로 프로그래밍 방식의 구성을 사용하지 않으므로 프로그래밍 방식으로 어떻게 구성할지 모르겠습니다.

+0

덕분에, 나는 이것이라고 생각한다. 감사합니다. –

+0

. 메인에 추가해야합니다 :'ConfigurationItemFactory.Default.LayoutRenderers .RegisterDefinition ("Encrypt", typeof (NLog.LayoutRenderers.Wrappers.EncryptLayoutRendererWrapper));' – daniel

1

나는이 개 솔루션을 참조하면 확장 방법은 당신이 String 객체를 호출 할 수 있습니다 Encrypt라는이,

가정 :

  • 을 어느 코드에 로그인 할 때 당신은 당신의 암호화 함수를 호출 :

 

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

이것은 알맞은 alt –

관련 문제