【问题标题】:serilog intercept logs and modify logserilog 拦截日志和修改日志
【发布时间】:2019-03-12 04:25:58
【问题描述】:

我想截取serilog即将写入的日志,并根据一些逻辑对其进行修改,即在日志中查找一些敏感信息并将其屏蔽。

到目前为止,我最接近的是找到 ILogEventEnricher

public class LogEnricher : ILogEventEnricher
{
    public void Enrich(LogEvent logEvent, ILogEventPropertyFactory propertyFactory)
    {
       //do something here, but what?
    }
}

但是LogEvent 的MessagTemplate 属性是只读的。 任何想法如何在记录之前拦截日志并修改它们。

【问题讨论】:

  • 制作一个接收器,将 WriteTo.Sink 添加到配置中,并使用 ILogEvent 属性突变函数在那里进行突变(但是当为时已晚时,请不要陷入修复东西的兔子洞 - 这种突变需要发生在源头)
  • 已经使用 serilog.console.sinks 并在文件系统和控制台上写入,我不想添加自定义接收器,但只想修改正在写入文件和控制台的内容。
  • 公平点(我认为你是对的,浓缩者在变异方面具有相同的设施(我重复一遍,你应该设法避免!)) - 有阅读 serilog/serilog 的来源 - 很有可能无法触及模板,但 logEvent 应该允许您 arr/remove/change 属性,不是吗?
  • github.com/nblumhardt/serilog-sinks-timewarp/blob/master/… 与您所追求的类似(查看Main() 方法以查看所有内容)-尽管现在时间紧迫,但现在将其写成答案, 对不起。 HTH!

标签: logging serilog


【解决方案1】:

处理 Serilog 的常用方法是告诉 Serilog 在解构对象时不要记录某些属性。

例如,通过Destructurama.Attributed

public class LoginCommand
{
    public string Username { get; set; }

    [NotLogged]
    public string Password { get; set; }
}

您可以在这篇博文中了解更多信息:Using attributes to control destructuring in Serilog


你也可以通过Destructurama.ByIgnoring做类似的事情

Log.Logger = new LoggerConfiguration()
    .Destructure.ByIgnoringProperties<User>(u => u.Password)
    // Other logger configuration
    .CreateLogger()

【讨论】:

  • 如果我正在记录对象,这将是一个完美的解决方案,但对我来说并非如此。我在将有效负载发送到消息总线之前对其进行记录,因为此有效负载是一个字符串,因此排除了使用属性,我唯一的方法是在记录之前拦截此有效负载并在它包含敏感信息时对其进行修改另一种情况是正在使用所有 HTTP 请求。由于某种原因,一些敏感信息作为查询字符串(糟糕的设计)和 OAuth 令牌传递,这些来自 HTTP 请求和 oAuth 令牌的敏感信息也不是很好的日志记录候选者
猜你喜欢
  • 2016-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多