.net - 如何修改 Serilog 日志级别以匹配 Log4Net?

标签 .net serilog

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

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

因此,使用 Serilog 文件接收器,我可以修改 outputTemplate以满足我的需求,但是我无法使 Serilogs 日志级别与 Log4Net 中的完全相同。

我希望有:

  • 错误
  • 信息
  • 警告
  • 调试
  • 等等...

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

    For more compact level names, use a format such as {Level:u3} or {Level:w3} for three-character upper- or lowercase level names, respectively.



    所以我尝试了以下方法来尝试获得 5 个大写字母 {Level:u5}回来了:
  • 信息
  • 错误
  • 华尼
  • 调试
  • 等等。

  • 有没有人能给我指点一下?

    最佳答案

    在挖掘了 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 配置以使用我的浓缩器,一个更干净的解决方案。
    感谢 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();
    

    关于.net - 如何修改 Serilog 日志级别以匹配 Log4Net?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51629436/

    相关文章:

    .net - Powershell/.Net : Get a reference to an object returned by a method

    c# - 你将如何在 VB.net 中编写这个?我没有得到索引++

    c# - ClickOnce 应用程序在验证应用程序需求时退出

    serilog - 如何实现 Serilog Custom Sink outputTemplate 参数

    Serilog 未在生产服务器上创建日志文件

    .net - 如何在运行时激活日志记录而不重新启动应用程序?

    c# - 查询为空时的最大返回值

    serilog - 如何将 LibLog 与自定义 Serilog LoggerConfiguration 一起使用?

    c# - 使用 Serilog 登录到事件查看器时动态设置 EventID

    c# - 单击富文本框中的链接后如何打开新的浏览器窗口(C#)