我们希望获得以下日志:
所有这些都在 appsettings.json 中配置。
这是应用程序的 appsettings.json 文件:
{
"Serilog": {
"Using": [ "Serilog.Sinks.Literate", "Serilog.Sinks.File", "Serilog.Filters.Expressions" ],
"MinimumLevel": "Verbose",
"WriteTo": [
{
"Name": "LiterateConsole"
},
{
"Name": "File",
"Args": {
"path": "%TEMP%\\Logs\\FileWithoutFilter-.log",
"outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss.fff} [{Level:u3}] {Message:lj}{NewLine}{Exception}",
"rollingInterval": "Day"
}
},
{
"Name": "File",
"Args": {
"path": "%TEMP%\\Logs\\UPLOADERROR-.log",
"outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss.fff} [{Level:u3}] {Message:lj}{NewLine}{Exception}"
},
"Filter": [
{
"Name": "ByIncludingOnly",
"Args": {
"expression": "@Level = 'Error' and UploadError is not null"
}
}
]
}
]
}
}
但是,尽管控制台和文件(不带过滤)运行良好,带过滤的文件正在记录所有行,就像文件(不带过滤器)一样。
我们正在用 C# 代码发送此 log.error 行:
Log.Error("Fichero con error {@UploadError}", true);
但是,我说过,所有行都会记录到 UPLOADERROR 文件中
知道 appsettings.file 有什么问题吗?
问候。
解决方案是使用 sublogger 和 serilog。然后,您必须使用过滤和接收器配置子记录器。
仔细阅读与常规、配置和过滤器相关的 serilog 文档就是诀窍。
{
"Serilog": {
"Using": [ "Serilog.Sinks.Literate", "Serilog.Sinks.File", "Serilog.Filters.Expressions" ],
"MinimumLevel": "Verbose",
"WriteTo": [
{
"Name": "LiterateConsole"
},
{
"Name": "File",
"Args": {
"path": "%TEMP%\\Logs\\FileWithoutFilter-.log",
"outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss.fff} [{Level:u3}] {Message:lj}{NewLine}{Exception}",
"rollingInterval": "Day"
}
},
{
"Name": "Logger",
"Args": {
"configureLogger": {
"Filter": [
{
"Name": "ByIncludingOnly",
"Args": {
"expression": "@Level = 'Error' and UploadError is not null"
}
}
],
"WriteTo": [
{
"Name": "File",
"Args": {
"path": "%TEMP%\\Logs\\UPLOADERROR-.log",
"outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss.fff} [{Level:u3}] {Message:lj}{NewLine}{Exception}"
}
}
]
}
}
}
]
}
}
使用之前的配置,现在一切正常。
实际 Serilog 的酷 appsettings.yaml 配置。
Serilog:
"Using": ["Serilog.Expressions"]
MinimumLevel: Information
Enrich:
- FromLogContext
WriteTo:
- Name: Logger
Args:
configureLogger:
MinimumLevel: Information
Filter:
- Name: ByIncludingOnly
Args:
#Static: Log.Logger = mainLogger.ForContext("SourceContext", "Static");
expression: StartsWith(SourceContext, 'Microsoft.Hosting.Lifetime') or StartsWith(SourceContext, 'Static') or @l = 'Error' or @l = 'Critical' or @l = 'Warning'
WriteTo:
- Name: Console
Args:
outputTemplate: "[{Timestamp:HH:mm:ss}] [{Level:u3}] [{SourceContext}] {Message:lj}{NewLine}{Exception}"
- Name: File
Args:
path: logs/important.txt
outputTemplate: "[{Timestamp:HH:mm:ss}] [{Level:u3}] [{SourceContext}] {Message:lj}{NewLine}{Exception}"
- Name: Logger
Args:
configureLogger:
MinimumLevel: Debug
WriteTo:
- Name: File
Args:
path: logs/full.txt
rollingInterval: Day
outputTemplate: "[{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz}] [{Level:u3}] [{SourceContext}] {Message:lj}{NewLine}{Exception}"
- Name: Logger
Args:
configureLogger:
MinimumLevel: Warning
WriteTo:
- Name: File
Args:
path: logs/problems.txt
outputTemplate: "[{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz}] [{Level:u3}] [{SourceContext}] {Message:lj}{NewLine}{Exception}"