Logging serilog拦截日志并修改日志

Logging serilog拦截日志并修改日志,logging,serilog,Logging,Serilog,我想截取serilog将要编写的日志,并根据一些逻辑对其进行修改,即在日志中查找一些敏感信息并将其屏蔽 到目前为止,我最接近的目标就是找到伊洛格文特里奇 public class LogEnricher : ILogEventEnricher { public void Enrich(LogEvent logEvent, ILogEventPropertyFactory propertyFactory) { //do something here, but what

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

到目前为止,我最接近的目标就是找到伊洛格文特里奇

public class LogEnricher : ILogEventEnricher
{
    public void Enrich(LogEvent logEvent, ILogEventPropertyFactory propertyFactory)
    {
       //do something here, but what?
    }
}
但是LogEvent的属性MessagTemplate是只读的。
知道我如何截取日志并在记录之前修改它们吗。

使用Serilog处理这一问题的常用方法是告诉Serilog在分解对象时不要记录某些属性

例如,通过:

您可以在这篇博文中阅读更多内容:


你也可以通过

Log.Logger=new LoggerConfiguration()
.Destructure.ByIgnoringProperties(u=>u.Password)
//其他记录器配置
.CreateLogger()

制作一个接收器,将WriteTo.Sink添加到配置中,并使用ILogEvent属性变异函数在那里进行变异(但请不要在太迟的时候陷入修复东西的兔子洞-这种变异需要在源代码处发生)已经在使用serilog.console.sinks并在文件系统和控制台上写入,我不想添加自定义接收器,但只想修改写入文件和控制台的内容。公平点(我想你是对的,enricher在变异方面也有相同的功能(我重复一遍,你应该避免!)-阅读serilog/serilog的来源-模板很有可能无法触摸,但
logEvent
应允许您重新排列/删除/更改属性,不是吗?做了一件与您所追求的类似的事情(请查看
Main()
方法以查看所有连接)-但是,请及时将此作为答案写下来,抱歉。嗯!如果我记录对象,这将是一个完美的解决方案,但我不是这样。我在将有效负载发送到消息总线之前记录它,因为该有效负载是一个字符串,使用属性是不可能的,唯一的方法是在记录之前拦截该有效负载,如果它包含敏感信息,则对其进行修改。另一种情况是使用所有HTTP请求。出于某种原因,一些敏感信息被作为查询字符串(设计错误)和OAuth令牌传递,来自HTTP请求和OAuth令牌的这些敏感信息也不是很好的日志候选
public class LoginCommand
{
    public string Username { get; set; }

    [NotLogged]
    public string Password { get; set; }
}
Log.Logger = new LoggerConfiguration()
    .Destructure.ByIgnoringProperties<User>(u => u.Password)
    // Other logger configuration
    .CreateLogger()