NLog - 如何加密数据库中记录的堆栈跟踪

时间:2011-10-25 10:29:57

标签: c# sql-server-2008 nlog

我正在使用最新版本的NLog(来自nuget),我以编程方式配置它。 目前它保存在我的数据库中,但我希望它加密我的stacktrace参数。

NLog有什么办法自动执行此操作? 鉴于我有一个简单的函数来加密堆栈跟踪是否有一种简单的方法来应用它?

3 个答案:

答案 0 :(得分: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}

我不确定如何以编程方式配置它,因为我通常不使用编程配置。

答案 1 :(得分: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);
    }
}

答案 2 :(得分:0)

Nlog没有内置的机制来对其日志进行加密,但是它提供了一个简单的包装程序,就像将原始文本转换为加密文本的管道一样。

https://icefoxes.github.io/2018/01/05/How-to-Encrypt-NLog/