如何修改Serilog日志级别以与Log4Net匹配?

时间:2018-08-01 09:10:29

标签: serilog

因此,我正在将日志框架从Log4Net交换到Serilog,然后我们注销到文本文件。

我希望文本文件的格式与以前完全相同,以便用户无缝迁移。

因此,使用Serilog文件接收器,我可以修改outputTemplate以适合自己的需要,但是我无法获得Serilogs日志级别以完全匹配Log4Net。

我希望拥有:

  • 错误
  • INFO
  • 警告
  • 调试
  • 等...

通过阅读outputTemplates的文档 https://github.com/serilog/serilog/wiki/Configuration-Basics#output-templates

  

要获得更紧凑的级别名称,请分别使用{Level:u3}或{Level:w3}这样的格式来表示三个字符的大写或小写级别名称。

因此,我尝试了以下方法,尝试获取5个字母大写的{Level:u5}并返回:

  • Infor
  • 错误
  • Warni
  • 调试
  • 等。

有人能给我一个指导吗?

1 个答案:

答案 0 :(得分:5)

仔细阅读Serilog的源代码后,我发现u3,w3等的简写格式发生了什么地方,并提交了PR,以便根据需要输出5个字符长度的日志级别。

在收到Serilog维护者的礼貌回应之后,他们给了我一个更简单的解决方案,实现我自己的ILogEventEnricher以向日志中添加一个新属性,例如{Log4NetLevel},其中Enricher代码可以映射Serilog级别以Log4Net使用的确切格式输出。

然后,我可以更新outputTemplate以使用我的新属性{Log4NetLevel}而不是{Level:u5}

这是一个基本示例

/// <summary>
/// This is used to create a new property in Logs called 'Log4NetLevel'
/// So that we can map Serilog levels to Log4Net levels - so log files stay consistent
/// </summary>
public class Log4NetLevelMapperEnricher : ILogEventEnricher
{
    public void Enrich(LogEvent logEvent, ILogEventPropertyFactory propertyFactory)
    {
        var log4NetLevel = string.Empty;

        switch (logEvent.Level)
        {
            case LogEventLevel.Debug:
                log4NetLevel = "DEBUG";
                break;

            case LogEventLevel.Error:
                log4NetLevel = "ERROR";
                break;

            case LogEventLevel.Fatal:
                log4NetLevel = "FATAL";
                break;

            case LogEventLevel.Information:
                log4NetLevel = "INFO";
                break;

            case LogEventLevel.Verbose:
                log4NetLevel = "ALL";
                break;

            case LogEventLevel.Warning:
                log4NetLevel = "WARN";
                break;
        }

        logEvent.AddPropertyIfAbsent(propertyFactory.CreateProperty("Log4NetLevel", log4NetLevel));
    }
}

然后,我只需要更新我的Serilog配置即可使用我的richer,这是一种更加干净的解决方案。 谢谢Serilog团队!

Log.Logger = new LoggerConfiguration()
    .MinimumLevel.Debug()
    .Enrich.With<Log4NetLevelMapperEnricher>()
    .WriteTo.File(
        $@"{AppDomain.CurrentDomain.BaseDirectory}\App_Data\Logs\UmbracoTraceLog.{Environment.MachineName}.txt",
        rollingInterval: RollingInterval.Day,
        restrictedToMinimumLevel: LogEventLevel.Debug,
        retainedFileCountLimit: null,
        outputTemplate:
        "{Timestamp:yyyy-MM-dd HH:mm:ss,fff} [P{ProcessId}/D{AppDomainId}/T{ThreadId}] {Log4NetLevel}  {Message:lj}{NewLine}{Exception}")
    .CreateLogger();
相关问题