Serilog:如何进一步增强appsettings.json中的筛选器表达式



我有两个带有Serilog的记录器,它们保存到不同的文件中。我想通过appsettings.json而不是代码来创建记录器。

当我通过Startup.cs配置创建日志时,我会得到一个更具体的日志,我更喜欢这样做,因为它更清晰,可以让其他人在不需要太多技术知识的情况下检查日志并了解发生了什么。但是,我想将此应用于appsettings,这样我就可以将代码迁移到我可能使用的任何其他项目中。仅供参考:我不想覆盖日志级别

例如,使用代码,我创建了这样的记录器:

Log.Logger = new LoggerConfiguration()
.WriteTo.ColoredConsole()
.WriteTo.Logger(lc => lc
.Filter.ByExcluding(Matching.FromSource("Microsoft"))
.WriteTo.File("Serilogs/Program_log_.txt", rollingInterval: RollingInterval.Day)
.MinimumLevel.Information()
.MinimumLevel.Override("Microsoft", LogEventLevel.Information))
.WriteTo.Logger(lc => lc
.Filter.ByIncludingOnly(Matching.FromSource("Microsoft"))
.WriteTo.File("Serilogs/ServerTrace_log_.txt", rollingInterval: RollingInterval.Day)
.MinimumLevel.Information()
.MinimumLevel.Override("Microsoft", LogEventLevel.Information))
.CreateLogger();

这将生成两个我喜欢格式化的独立输出:File 1:可读、自定义日志:

2019-01-18 11:18:09.873 +00:00 [INF] //Some custom log information
2019-01-18 11:18:09.875 +00:00 [INF] //Some more custom log information

File 2:堆栈跟踪,服务器信息:

2019-01-18 11:17:56.378 +00:00 [INF] User profile is available. Using '//A path' as key repository and Windows DPAPI to encrypt keys at rest.
2019-01-18 11:17:57.840 +00:00 [INF] Request starting HTTP/1.1 GET https://localhost:5001/swagger/index.html  
2019-01-18 11:17:58.074 +00:00 [INF] Request finished in 235.5796ms 200 text/html
2019-01-18 11:17:58.326 +00:00 [INF] Request starting HTTP/1.1 GET https://localhost:5001/swagger/v1/swagger.json  
2019-01-18 11:17:58.452 +00:00 [INF] Request finished in 126.2127ms 200 application/json;charset=utf-8 

当我使用JSON应用程序设置时,它看起来是这样的:

"Serilog": {
"Using": [
"Serilog.Sinks.File",
"Serilog.Filters.Expressions",
"Serilog.Settings.Configuration"
],
"WriteTo": [
{
"Name": "Logger",
"Args": {
"configureLogger": {
"Filter": [
{
"Name": "ByIncluding",
"Args": {
"expression": "SourceContext = 'Microsoft'"
}
}
],
"WriteTo": [
{
"Name": "File",
"Args": {
"path": "./Serilogs/server_logs_.log",
"rollingInterval": "Day"
}
}
]
}
}
},
{
"Name": "Logger",
"Args": {
"configureLogger": {
"Filter": [
{
"Name": "ByExcluding",
"Args": {
"expression": "SourceContext = 'Microsoft.AspNetCore.Hosting.Internal.WebHost'"
}
}
],
"WriteTo": [
{
"Name": "File",
"Args": {
"path": "./Serilogs/program_logs_.log",
"rollingInterval": "Day"
}
}
]
}
}
}
]
}

这将生成两个文件。File 1:可读、自定义日志:

2019-01-18 11:22:52.903 +00:00 [INF] User profile is available. Using '// A path' as key repository and Windows DPAPI to encrypt keys at rest.
2019-01-18 11:22:59.229 +00:00 [INF] Route matched with {action = "PollForStatusUpdate", controller = "StatusMessage"}. Executing action {apiname}.{controller}.{method}.PollForStatusUpdate ({apiname})
2019-01-18 11:22:59.505 +00:00 [INF] Executing action method {apiname}.{controller}.{method}.PollForStatusUpdate ({apiname}) with arguments (["{apiname}.{controller}.{method}.MessageResult"]) - Validation state: "Valid"
2019-01-18 11:22:59.632 +00:00 [INF] //Some custom log information
2019-01-18 11:22:59.639 +00:00 [INF] //Some more custom log information
{apiname}.{controller}.{method}.PollForStatusUpdate ({apiname}), returned result Microsoft.AspNetCore.Mvc.OkObjectResult in 516.8129ms.
2019-01-18 11:23:00.040 +00:00 [INF] Executing ObjectResult, writing value of type '{apiname}.{controller}.{method}.MessageResult'.
2019-01-18 11:23:00.048 +00:00 [INF] Executed action {apiname}.{controller}.{method}.PollForStatusUpdate ({apiname}) in 813.08940000000007ms

File 2:堆栈跟踪,服务器信息:

2019-01-18 11:22:52.903 +00:00 [INF] User profile is available. Using 'C:UsersmsharpAppDataLocalASP.NETDataProtection-Keys' as key repository and Windows DPAPI to encrypt keys at rest.
2019-01-18 11:22:54.263 +00:00 [INF] Request starting HTTP/1.1 GET https://localhost:5001/swagger/index.html  
2019-01-18 11:22:54.473 +00:00 [INF] Request finished in 211.831ms 200 text/html
2019-01-18 11:22:54.737 +00:00 [INF] Request starting HTTP/1.1 GET https://localhost:5001/swagger/v1/swagger.json  
2019-01-18 11:22:54.838 +00:00 [INF] Request finished in 100.8892ms 200 application/json;charset=utf-8
2019-01-18 11:22:59.205 +00:00 [INF] Request starting HTTP/1.1 POST https://localhost:5001/api/StatusMessage/PollForStatusUpdate application/json-patch+json 180
2019-01-18 11:22:59.229 +00:00 [INF] Route matched with {action = "PollForStatusUpdate", controller = "StatusMessage"}. Executing action PureValuationsApi.Controllers.StatusMessageController.PollForStatusUpdate (PureValuationsApi)
2019-01-18 11:22:59.505 +00:00 [INF] Executing action method {apiname}.{controller}.{method}.PollForStatusUpdate ({apiname}) with arguments (["{apiname}.{controller}.{method}.MessageResult"]) - Validation state: "Valid"
2019-01-18 11:22:59.632 +00:00 [INF] //Some custom lof information
2019-01-18 11:22:59.639 +00:00 [INF] //Some more custom log information
{apiname}.{controller}.{method}.PollForStatusUpdate ({apiname}), returned result Microsoft.AspNetCore.Mvc.OkObjectResult in 516.8129ms.
2019-01-18 11:23:00.040 +00:00 [INF] Executing ObjectResult, writing value of type '{apiname}.{controller}.{method}.MessageResult'.
2019-01-18 11:23:00.048 +00:00 [INF] Executed action {apiname}.{controller}.{method}.PollForStatusUpdate ({apiname}) in 813.08940000000007ms
2019-01-18 11:23:00.052 +00:00 [INF] Request finished in 847.5964ms 200 application/json; charset=utf-8

因此,通过应用感觉相同的技术,结果是不同的,因为File 1现在包含更多的操作信息,而File 2包含堆栈自定义日志信息,尽管我希望它们完全分离。

我认为您的过滤器不太正确。

过滤器表达式应为:

"expression": "SourceContext = 'Microsoft' or StartsWith(SourceContext, 'Microsoft.')"

(我想你可以在没有最后一个点的情况下执行StartsWith(SourceContext, 'Microsoft'),但对于像MicrosoftOrIsItReally.MyNamespace这样的名称空间来说,这可能不正常)

(内部Matching.ForSource进行SourceContext.StartsWith(..)类型的过滤,如来源所示)

要确认它,您可能需要编辑文件接收器的outputTemplate以显示SourceContext属性并查看日志事件的来源。(默认值为"{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level:u3}] {Message:lj}{NewLine}{Exception}")。您可以将其更改为"{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level:u3}]<{SourceContext}> {Message:lj}{NewLine}{Exception}"以包含SourceContext属性。


顺便说一下,您有一个额外的、不需要的"Using"指令。"Serilog.Settings.Configuration"不是必需的

最新更新