2011-10-25 4 views
6

veritabanında nasıl şifreleyebilirim NLog'un (nuget'ten) en son sürümünü kullanıyorum ve program aracılığıyla yapılandırıyorum. Şu anda veritabanımda kaydediyor, ancak stacktrace parametemi şifrelemesini istiyorum.NLog - Kayıtlı stacktrace'i

NLog'un bunu otomatik olarak yaptığı bir yolu var mı? Stacktrace'i şifrelemek için basit bir işleve sahip olduğumu düşünmek, onu uygulamak için kolay bir yol var mı?

cevap

7

Ben yazmaya öneririm LayoutRendererWrapper. Bir LayoutRendererWrapper, bir LayoutRenderer'ı "işleyebilmenizi" sağlar; böylece işleme çıktıya uygulayabilirsiniz. Yığın izinin şifrelenmesi durumunda, StackTrace'i çıktıya eklemek için NLog'u yapılandırabilirsiniz, ancak şifrenizi uygulayabilmeniz için StackTrace düzen oluşturucusunu sarabilirsiniz.

NLog's source code repository içinde LayuoutRendererWrappers örneklerini görebilirsiniz.

Aslında, LayoutRendererWrapper'ın genel yapısı, şifreleme sargısını yazabileceğiniz ve bunu herhangi bir LayoutRenderer'a uygulayabileceğiniz anlamına gelir. Yani, örneğin yığın izini ve iletiyi şifreleyebilirsiniz, ancak alanların geri kalanını açık metin olarak bırakabilirsiniz.

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

Ben NLog.config dosyasında böyle yapılandırılmış olacağını düşünüyorum:

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

Ben İşte

bir şifreleme LayoutRendererWrapper yazmak nasıl bir örnek (denenmemiş) 'dir Normalde programatik yapılandırmayı kullanmadığımdan programlı olarak nasıl yapılandıracağınızdan emin değilim.

+0

teşekkürler, sanırım bu kadar. –

+0

teşekkürler. Ana sayfanıza eklemeniz gerekir: 'ConfigurationItemFactory.Default.LayoutRenderers .RegisterDefinition (" Encrypt ", typeof (NLog.LayoutRenderers.Wrappers.EncryptLayoutRendererWrapper)); – daniel

1

İki çözümleri görmek bir uzantı yöntemi bir String nesne üzerinde çağırabilir Encrypt çağırdım,

varsayarsak:

  • Ya kod giriş yaparken sizin şifrelemek işlevini çağırmak :

 

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

  •   Yoksa olayları günlüğe ve temel NLog.Log() yöntemlerinin yerine onları aramak için yeni yöntemler oluşturabilirsiniz:

 

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

Bu iyi bir alt –