NLog - как я могу зашифровать записанную трассировку стека в базе данных - PullRequest
6 голосов
/ 25 октября 2011

Я использую последнюю версию NLog (из nuget) и настраиваю ее программно.В настоящее время он сохраняется в моей базе данных, но я бы хотел, чтобы он зашифровал мой параметр stacktrace.

Есть ли способ, которым NLog делает это автоматически?Учитывая, что у меня есть простая функция для шифрования трассировки стека, есть ли простой способ применить ее?

Ответы [ 2 ]

7 голосов
/ 25 октября 2011

Я бы предложил написать LayoutRendererWrapper . LayoutRendererWrapper позволяет вам «обернуть» LayoutRenderer, чтобы вы могли применить обработку к выводу. В случае шифрования трассировки стека вы можете настроить NLog для добавления StackTrace к выводу, но вы можете обернуть рендерер макета StackTrace, чтобы применить шифрование.

Вы видите примеры LayuoutRendererWrappers в хранилище исходного кода NLog .

На самом деле, общая природа 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}

Я не уверен, как бы вы сконфигурировали его программно, поскольку я обычно не использую программную конфигурацию.

1 голос
/ 25 октября 2011

Предполагая , что у вас есть метод расширения с именем 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);
    }
}
...