Serilog截获日志并修改日志

3
我想拦截即将由Serilog写入的日志,并根据某些逻辑进行修改,例如查找日志中的某些敏感信息并进行屏蔽。
到目前为止,我最接近的方法是找到了ILogEventEnricher。
最初的回答:
我希望拦截Serilog即将写入的日志并根据一些逻辑进行修改,例如查找日志中的敏感信息并进行遮蔽。目前我找到的最接近的方法是使用ILogEventEnricher。请注意保留HTML标记。
public class LogEnricher : ILogEventEnricher
{
    public void Enrich(LogEvent logEvent, ILogEventPropertyFactory propertyFactory)
    {
       //do something here, but what?
    }
}

但是LogEvent的MessagTemplate属性只读。有没有办法在记录日志之前拦截日志并修改它们。

有什么想法吗?

原始答案:最初的回答


1
创建一个Sink,将WriteTo.Sink添加到配置中,并使用ILogEvent属性变异函数在那里进行变异(但请不要陷入修复已经太晚的问题的兔子洞 - 这样的变异需要在源头发生)。 - Ruben Bartelink
已经在使用Serilog.Console.Sinks,并且将日志写入文件系统和控制台,我不想添加自定义的Sink,但希望只修改写入文件和控制台的内容。 - Pankaj
说得对(我_认为_你是对的,丰富器在变异方面有相同的功能(我再次强调,你应该尽量避免!))- 读一下serilog/serilog的源代码吧 - 很有可能模板不能被修改,但logEvent应该允许你添加/删除/更改属性,对吧? - Ruben Bartelink
https://github.com/nblumhardt/serilog-sinks-timewarp/blob/master/Serilog.Sinks.TimeWarp/Program.cs 这个链接提供了一个类似于你所需要的功能(查看Main()方法以了解其完整实现)- 现在时间有点紧,暂时无法为你写出详细答案,抱歉。希望对你有所帮助! - Nicholas Blumhardt
1个回答

2

在Serilog中处理这个问题的常见方法是告诉Serilog在解构对象时不记录某些属性。

例如,通过Destructurama.Attributed

最初的回答

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

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

你可以在这篇博客文章中了解更多: 使用属性控制Serilog中的解构
你也可以通过Destructurama.ByIgnoring做类似的事情。
Log.Logger = new LoggerConfiguration()
    .Destructure.ByIgnoringProperties<User>(u => u.Password)
    // Other logger configuration
    .CreateLogger()

3
这本来是一个完美的解决方案,如果我记录的是对象的话,但对我来说并非如此。 在将负载发送到消息总线之前,我会记录负载。由于负载是字符串,所以无法使用属性,唯一的方法是在记录之前拦截负载,并在其中包含敏感信息时进行修改。 另一种情况是所有的HTTP请求都被使用。由于某种原因,一些敏感信息作为查询字符串(设计不良)和OAuth令牌传递,这些来自HTTP请求和OAuth令牌的敏感信息也不适合记录。 - Pankaj

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接