在 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"
}
答案 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();
}
}
}