是否可以根据日志记录级别过滤掉 serilog 事件的属性

时间:2021-05-27 14:32:42

标签: serilog serilog-filter

在 Serilog 中,我们可以根据日志记录级别或使用 serilog expressions 过滤掉事件。

"Serilog": {
    "MinimumLevel": {
      "Default": "Debug"
    },

我想知道是否也可以根据日志记录级别过滤掉事件的属性。我们有一个我们想要记录通信细节的场景。大多数情况下,ASCII 格式的通信文本已经足够好,但有时 hex 格式会有所帮助。我希望我们只能在日志级别为 hex 时记录 Verbose 格式属性。可能吗?

Event
{
  "ascii": "Hello World
",
  "hex": "48 65 6c 6c 6f 20 57 6f 72 6c 64 0d 0a"
}

1 个答案:

答案 0 :(得分:2)

您可以通过添加自定义解构策略来转换事件来实现此目的。获取当前日志级别。检测是否启用了 Verbose。如果是,则返回一个包含十六进制值的对象。如果不是,则返回一个不包含十六进制值的对象。这是一个工作示例:

using System;
using Serilog;
using Serilog.Events;

namespace HelloConsoleCore
{
    class MyEventToLog
    {
        public string SomeText { get; set; }

        public string SomeHex { get; set; }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Log.Logger = new LoggerConfiguration()
                //.MinimumLevel.Verbose //change your minimum level to see the effect
                .MinimumLevel.Debug()
                .WriteTo.Console()
                .Destructure.ByTransforming((MyEventToLog ev) => {

                    if (Log.IsEnabled(LogEventLevel.Verbose))
                    {
                        return new { ev.SomeHex, ev.SomeText };
                    }

                    return new { ev.SomeText };
                    })
                .CreateLogger();

            var eventIWantToLog = new MyEventToLog
            {
                SomeHex = "48 65 6c 6c 6f 20 57 6f 72 6c 64 0d 0a",
                SomeText = "Hello World"
            };

            Log.Information("Let's log an event... {@EventIWantToLog}", eventIWantToLog);

            Console.WriteLine("Press any key to exit");
            Console.ReadKey();
        }
    }
}