我有一个Microsoft Asp.Net Web Api项目,我正在尝试设置serilog日志记录。我已经为Serilog,Serilog.Sinks.File,SerilogWeb.Classic和SerilogWeb.Classic.WebApi安装了Nuget软件包。请注意,我无法使用.Net Core。
我的问题是我试图使用SerilogWeb.CLassic.WebApi包中的richhers,但它们并没有改变我的输出。我确信我所做的是一个简单的错误,但我找不到其他人在网上使用同样的增强器的例子(我发现的所有内容都在.Net Core上)。
Log.Logger = new LoggerConfiguration()
.Enrich.WithWebApiActionName()
.WriteTo.File("D:/mytestresults.txt")
.CreateLogger();
上面的代码片段来自我的Startup.cs文件。当我运行http请求时会记录到文件中,但添加和删除Enrich行没有任何区别。下面是一个示例文件输出
2019-03-26 10:09:11.215 -04:00 [INF] HTTP GET /api/actions/ responded 200 in 17ms
2019-03-26 10:09:13.621 -04:00 [INF] HTTP GET /api/actions/ responded 200 in 9ms
请注意,我确实想要使用其他的浓缩物,但我已经将其简化了一些,以弄清楚我做错了什么。
为了清楚我正在使用的软件包,以下是我的一些packages.config
<package id="Microsoft.AspNet.WebApi" version="5.2.3" targetFramework="net461" />
<package id="Microsoft.AspNet.WebApi.Client" version="5.2.3" targetFramework="net461" />
<package id="Microsoft.AspNet.WebApi.Core" version="5.2.3" targetFramework="net461" />
<package id="Microsoft.AspNet.WebApi.Owin" version="5.2.3" targetFramework="net461" />
<package id="Microsoft.AspNet.WebApi.WebHost" version="5.2.3" targetFramework="net461" />
<package id="Serilog" version="2.8.0" targetFramework="net461" />
<package id="Serilog.Sinks.File" version="4.0.0" targetFramework="net461" />
<package id="Serilog.Sinks.MSSqlServer" version="5.1.2" targetFramework="net461" />
<package id="Serilog.Sinks.PeriodicBatching" version="2.1.1" targetFramework="net461" />
<package id="SerilogWeb.Classic" version="5.0.48" targetFramework="net461" />
<package id="SerilogWeb.Classic.WebApi" version="4.0.5" targetFramework="net461" />
编辑
以下是我建议更改后的代码,虽然有些富集程序正在运行,但我没有得到操作和控制器名称:
Log.Logger = new LoggerConfiguration()
.Enrich.FromLogContext()
.Enrich.WithUserName()
.Enrich.WithWebApiRouteData()
.Enrich.WithWebApiControllerName()
.Enrich.WithWebApiRouteTemplate()
.Enrich.WithWebApiActionName()
.Enrich.WithHttpRequestUrl()
.WriteTo.MSSqlServer(connectionString, tableName, restrictedToMinimumLevel: Serilog.Events.LogEventLevel.Information, autoCreateSqlTable: true)
.WriteTo.File("D:/mynewlog.txt", outputTemplate: "<{WebApiAction}> Time: {Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} Level:[{Level:u3}] Message:{Message:lj}Properties:{Properties}{NewLine}{Exception}")
.CreateLogger();
以下是此时记录到文件的内容(sql是相同的)
<> Time: 2019-03-27 10:34:47.842 -04:00 Level:[INF] Message:HTTP GET /api/actions/reviews responded 200 in 7msProperties:{ SourceContext: "SerilogWeb.Classic.ApplicationLifecycleModule", UserName: "theUsernameWasHere", HttpRequestUrl: "http://localhost:61111/api/actions/reviews" }
我认为现在正在发生的事情是你的“日志事件”正确地丰富了所有信息,但File
接收器没有正确配置来显示该信息。
File
接收器的默认输出模板是{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} \[{Level:u3}\] {Message:lj}{NewLine}{Exception}
,这意味着它将正确显示“呈现的消息”(消息模板+消息模板中引用的属性的值)。
您需要做的是以一种方式配置它,以便显示所有额外属性(在富集时添加到每个日志事件的属性)。
对于File
接收器,您可以在输出模板中添加特殊的{Properties}
directive,这将显示附加到事件的所有属性,但不会呈现为消息模板的一部分。
那看起来像是:
Log.Logger = new LoggerConfiguration()
.Enrich.WithWebApiActionName()
.WriteTo.File("D:/mytestresults.txt", outputTemplate: "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} \[{Level:u3}\] {Message:lj}{Properties}{NewLine}{Exception}")
.CreateLogger();
(或者{Properties:j}
将它们格式化为JSON)。
这将输出附加到事件但不位于输出模板中任何其他位置的所有属性。
如果你只对WebApiAction
感兴趣,你也可以这样做:
Log.Logger = new LoggerConfiguration()
.Enrich.WithWebApiActionName()
.WriteTo.File("D:/mytestresults.txt", outputTemplate: "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} \[{Level:u3}\]<{WebApiAction}> {Message:lj}{NewLine}{Exception}")
.CreateLogger();
...然后你会在输出中得到这样的行:
2019-03-26 10:09:13.621 -04:00 [INF]<MyActionName> HTTP GET /api/actions/ responded 200 in 9ms
UPDATE
看起来这不是“输出格式”问题,因为您可以正确显示一些附加属性...
.WithUserName
和.WithRequestUrl
不是特定于WebApi的,可以轻松地为任何ASP.NET应用程序收集。 .WithWebApi*
扩展依赖于我们在Web API IAuthenticationFilter
中声明的on start up,感谢to this line ...
以下是可能解释缺乏丰富度的可能场景: - 由于某种原因,PreApplicationStartMethod
汇编属性无法按预期工作 - 由于某种原因在Web API中注册StoreWebApInfoInHttpContextAuthenticationFilter
不起作用 - 由于某种原因我们无法从ActionContext
中提取信息
你是否可以在启动时注册AuthenticationFilter
s做“奇怪”的事情?
作为您在此处报道的问题的一部分,尝试跟踪它可能更好:https://github.com/serilog-web/classic-webapi/issues/18;)