【问题标题】:NLog structuring logging maskingNLog 结构化日志屏蔽
【发布时间】:2020-04-20 19:19:26
【问题描述】:

假设我们正在编写以下结构化日志消息

logger.Info("User's Password is {Password}", "1234567890");

我想屏蔽密码属性,因为它是敏感数据。我找到了this issue,但我认为这是一个非常困难的方法。

例如,我发现the extension 可以解决serilog 的类似任务。使用起来非常简单。但是我没有找到任何对 Nlog 有用的信息。

如何用 nlog 库来实现? 如有任何建议,我将不胜感激。

【问题讨论】:

  • 链接的 GitHub 问题 1155 告诉您为此使用 replace layout renderer。你试过用吗,遇到了什么问题?
  • @PavelAnukhouski,我不完全了解如何将替换布局渲染用于结构化日志消息。我的洞可以有任何价值。在这种情况下我需要指定的搜索字符串值是什么。
  • 现在我认为 NLog 只有 JsonLayout-property ExcludeProperties${all-event-properties}Exclude。想不出任何当前选项可以让人们控制格式化消息中包含哪些属性。PullRequests 总是受欢迎的。
  • 您可以使用RegisterObjectTransformation 做到这一点吗?见nlog-project.org/2020/03/28/nlog-4-7-has-been-released.html。需要反射,但可以转换为插件。
  • @Julian,还不知道,谢谢提示

标签: c# nlog


【解决方案1】:

您可以使用RegisterObjectTransformationintroduced in NLog 4.7

例如:

LogManager.Setup().SetupSerialization(s => 
    s.RegisterObjectTransformation<object>(o =>
    {
        var props = o.GetType().GetProperties();
        var propsDict = props.ToDictionary(p => p.Name, p => p.GetValue(o));

        propsDict.Remove("password");

        return propsDict;
   }));

请注意,在性能方面,您可能需要反射缓存和智能优化之类的东西。

【讨论】:

  • 它只会处理对象的属性。它不会处理消息模板直接提供的属性。
  • 是的,它仅适用于属性,例如来自链接扩展的Log.Information("Logged on {@User}", new User { Username = "sudo", Password = "SuperAdmin" }); (github.com/evjenio/masking.serilog)
【解决方案2】:

我建议您将秘密密码包装在这样的对象中:

public class SecretWrapper : IFormatable
{
    private readonly string _secret;

    public SecretWrapper(string secret)
    {
        _secret  = secret;
    }

    public string GetSecret() => _secret; // Not a property to avoid basic reflection

    public override string ToString() => "******"

    public string ToString (string format, IFormatProvider formatProvider) => ToString();
}

NLog 永远不会输出秘密值:

logger.Info("User's Password is {Password}", new SecretWrapper("1234567890"));

【讨论】:

    猜你喜欢
    • 2018-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多