与Asp.net Web Api的Serilog不使用浓缩器

时间:2019-03-26 14:21:21

标签: c# asp.net asp.net-web-api serilog

我有一个Microsoft Asp.Net Web Api项目,我正在其中尝试设置serilog日志记录。我已经为Serilog,Serilog.Sinks.File,SerilogWeb.Classic和SerilogWeb.Classic.WebApi安装了Nuget软件包。请注意,我无法使用.Net Core。

我的问题是我试图使用SerilogWeb.CLassic.WebApi包中的浓缩器,但是它们没有改变我的输出。我确信我在做什么是一个简单的错误,但是我无法在网上找到使用同一浓缩器的其他任何示例(我发现的所有内容都位于.Net Core上)。

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

上面的代码段来自我的Startup.cs文件。当我运行http请求时,会将请求记录到文件中,但是添加和删除Enrich行没有任何区别。下面是示例文件输出

<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" />

请注意,我确实想使用其他浓缩器,但是为了弄清楚我做错了什么,我对此进行了简化。

为清楚起见,我使用了一些package.config

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

编辑

以下是我提出更改后的代码,虽然一些浓缩器正在工作,但我没有获得动作和控制器名称:

<> 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" }

以下是此时正在记录到文件的内容(sql相同)

f14615e

1 个答案:

答案 0 :(得分:1)

我认为现在正在发生的事是您的“日志事件”已正确地包含所有信息,但是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

更新

这似乎不是“输出格式”问题,因为您可以正确显示一些附加属性...

.WithUserName.WithRequestUrl不是WebApi特定的,可以很容易地为任何 ASP.NET应用程序收集。 .WithWebApi*扩展依赖于我们在Web API IAuthenticationFilter中声明的on start up,谢谢to this line ...

在以下情况下,可以解释缺乏浓缩的情况: -由于某些原因,PreApplicationStartMethod程序集属性无法正常工作 -由于某些原因,无法在Web API中注册StoreWebApInfoInHttpContextAuthenticationFilter -由于某些原因,我们无法从ActionContext

中提取信息

您是否可能在启动时使用已注册的AuthenticationFilter做“奇怪”的事情?

作为您在此处报告的问题的一部分,尝试对其进行跟踪可能更好:https://github.com/serilog-web/classic-webapi/issues/18;)