2011-10-25 20 views

risposta

7

Vorrei suggerire a scrivere una LayoutRendererWrapper. A LayoutRendererWrapper consente di "avvolgere" un Layoutenderer in modo da poter applicare l'elaborazione all'output. In caso di crittografia dello stack trace, è possibile configurare NLog per aggiungere StackTrace all'output, ma è possibile racchiudere il renderer di layout StackTrace in modo da poter applicare la crittografia.

Si vedono esempi di LayuoutRendererWrappers in NLog's source code repository.

In realtà, la natura generale di LayoutRendererWrapper significa che è possibile scrivere un wrapper di crittografia e applicarlo a qualsiasi LayoutRenderer. Quindi, ad esempio, è possibile crittografare la traccia dello stack e il messaggio, ma lasciare il resto dei campi come testo in chiaro.

Ecco un esempio (non testata) di come si potrebbe scrivere un LayoutRendererWrapper crittografia:

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

penso che sarebbe essere configurato in questo modo nel file NLog.config:

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

I Non sono sicuro di come lo si configurerà a livello di codice, in quanto normalmente non utilizzo la configurazione programmatica.

+0

grazie, penso che sia così. –

+0

grazie. Devi aggiungere al tuo principale: 'ConfigurationItemFactory.Default.LayoutRenderers .RegisterDefinition (" Encrypt ", typeof (NLog.LayoutRenderers.Wrappers.EncryptLayoutRendererWrapper));' – daniel

1

Supponendo che si dispone di un metodo di estensione chiamato Encrypt che si può chiamare su un oggetto String,

Vedo due soluzioni:

  • O si chiama la funzione crittografare quando si accede nel codice :

 

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

 

  • Oppure è possibile creare nuovi metodi per registrare gli eventi e li chiamano invece dei fondamentali NLog.Log() metodi:

 

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

questo è un discreto alt –

Problemi correlati