【问题标题】:Serilog Filter Sink by Custom Property自定义属性的 Serilog 过滤器接收器
【发布时间】:2022-06-27 18:53:45
【问题描述】:

我想使用Serilog.Expressions 过滤我的日志记录以查找特定接收器。在这种情况下,如果我的自定义属性MethodName 等于“SomeOtherTask”,我只想登录到控制台接收器。 Serilog 仍在为DoSomeWork 和SomeOtherTask 记录到两个接收器。我的过滤器表达式是否有问题,或者我如何实现自定义属性 MethodName 或其他问题?

appsettings.json:

{
    "Serilog": {
        "Using": [ "Serilog.Sinks.Console", "Serilog.Sinks.File", "Serilog.Expressions" ],
        "MinimumLevel": "Debug",
        "WriteTo": [
            {
                "Name": "Console",
                "Filter": [
                    {
                        "Name": "ByIncludingOnly",
                        "Args": {
                            "expression": "MethodName = 'SomeOtherTask'"
                        }
                    }
                ]
            },
            {
                "Name": "File",
                "Args": {
                    "path": "Logs/log.txt"
                }
            }
        ],
        "Enrich": [ "FromLogContext", "WithMachineName", "WithThreadId" ],
        "Properties": {
            "Application": "SerilogSplitLogTest"
        }
    }
}

程序.cs:

internal class Program
{
    static void Main()
    {
        var builder = new ConfigurationBuilder()
            .AddJsonFile("appsettings.json", true, true);
        
        var config = builder.Build();

        var logger = new LoggerConfiguration()
            .ReadFrom.Configuration(config)
            .CreateLogger();

        new Program().Run(logger);

        Console.ReadKey(true);
    }

    public void Run(ILogger logger)
    {
        DoSomeWork(logger);
        SomeOtherTask(logger);
    }

    public void DoSomeWork(ILogger logger)
    {
        logger.Information("This should log to File");
    }

    public void SomeOtherTask(ILogger logger)
    {
        using (LogContext.PushProperty("MethodName", nameof(SomeOtherTask)))
        {
            logger.Information("This should log to Console");
        }
    }
}

【问题讨论】:

  • 你解决过这个问题吗?我正在解决同样的问题。
  • 嗨@USMC6072 不,我没有。如果您找到解决方案,请发布答案。

标签: c# serilog serilog-filter serilog-expressions


【解决方案1】:

我在写入 2 个文件时遇到了类似的问题,其中 1 个是所有日志记录,还有一个是通过属性过滤的,因此它是一种压缩日志。这是我的做法。

首先,确保安装Serilog.Expressions。单独执行此操作可能会解决您的问题,如果没有,那么这是我使用的配置的 WriteTo 部分。

注意:Marker 是我过滤的自定义属性。

"WriteTo": [
  {
    "Name": "Logger",
    "Args": {
      "configureLogger": {
        "Filter": [
          {
            "Name": "ByIncludingOnly",
            "Args": {
              "expression": "Marker is not null"
            }
          }
        ],
        "WriteTo": [
          {
            "Name": "File",
            "Args": {
              "path": "D:\\Temp\\SerilogTesting.txt",
              "outputTemplate": "[{Timestamp:yyyy-MM-dd HH:mm:ss.fff}] - [{Level:u3}] - [{SourceContext}.{Method}] - {Message:lj}{NewLine:1}{Exception:1}",
              "rollingInterval": "Day",
              "retainedFileCountLimit": 7,
              "shared": true
            }
          }
        ]
      }
    }
  },
  {
    "Name": "File",
    "Args": {
      "path": "D:\\Temp\\SerilogTesting.log",
      "outputTemplate": "[{Timestamp:yyyy-MM-dd HH:mm:ss.fff}] - [{Level:u3}] - [{SourceContext}.{Method}] - {Message:lj}{NewLine:1}{Exception:1}",
      "rollingInterval": "Day",
      "retainedFileCountLimit": 7,
      "shared": true
    }
  },
  {
    "Name": "Console",
    "Args": {
      "theme": "Serilog.Sinks.SystemConsole.Themes.AnsiConsoleTheme::Code, Serilog.Sinks.Console",
      "outputTemplate": "[{Marker}][{Timestamp:yyyy-MM-dd HH:mm:ss.fff}] - [{Level:u3}] - [{SourceContext}.{Method}] - {Message:lj}{NewLine:1}{Exception:1}"
    }
  }
]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-06
    • 2021-08-12
    • 1970-01-01
    相关资源
    最近更新 更多