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

Is it possible to filter out properties of serilog events based on the logging level

在 Serilog 中,我们可以根据日志记录级别或使用 serilog expressions.

过滤掉事件
"Serilog": {
    "MinimumLevel": {
      "Default": "Debug"
    },

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

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

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

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();
        }
    }
}