gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 20:29:53 27 4
gpt4 key购买 nike

所以我正在将日志框架从 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/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com