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

War*_*ley 2 serilog

所以我正在将日志框架从Log4Net交换到Serilog,我们在那里注销文本文件.

我希望文本文件的格式与之前完全相同,因此用户可以无缝迁移.

所以使用Serilog文件接收器,我能够修改它outputTemplate以满足我的需要,但是我无法让Serilogs日志级别与Log4Net中的完全相同.

我希望:

  • 错误
  • 信息
  • 警告
  • DEBUG
  • 等等...

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

对于更紧凑的级别名称,请分别对三个字符的大写或小写级别名称使用{Level:u3}或{Level:w3}等格式.

所以我尝试了以下尝试获得5个大写的字母{Level:u5}然后回来:

  • Infor公司
  • 错误
  • Warni
  • 调试
  • 等等..

请问有人指点这个吗?

War*_*ley 5

在深入了解Serilog的源代码之后,我发现了u3,w3等的简写格式正在发生并提交了一个PR,以便根据需要输出5个字符长度的日志级别.

在Serilog维护人员的礼貌回应之后,他们给了我一个更简单的实现我自己的解决方案,ILogEventEnricher在日志中添加一个新属性,例如{Log4NetLevel}Enricher代码可以映射Serilog Levels以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));
    }
}
Run Code Online (Sandbox Code Playgroud)

然后我只需要更新我的Serilog配置来使用我的richher,一个更清洁的解决方案.谢谢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();
Run Code Online (Sandbox Code Playgroud)