簡體   English   中英

帶有 Asp.net Web Api 的 Serilog 不使用豐富器

[英]Serilog with Asp.net Web Api not using enricher

我有一個 Microsoft Asp.Net Web Api 項目,我試圖在其中設置 serilog 日志記錄。 我已經為 Serilog、Serilog.Sinks.File、SerilogWeb.Classic 和 SerilogWeb.Classic.WebApi 安裝了 Nuget 包。 請注意,我無法使用 .Net Core。

我的問題是我試圖使用 SerilogWeb.CLassic.WebApi 包中的豐富器,但它們並沒有改變我的輸出。 我確信我所做的是一個簡單的錯誤,但我在網上找不到任何其他人使用相同濃縮器的例子(我找到的所有東西都在 .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 sink 的默認輸出模板{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} \\[{Level:u3}\\] {Message:lj}{NewLine}{Exception} ,這意味着它將正確顯示“呈現的消息”(消息模板 + 消息模板中引用的屬性值)。

您需要做的是將它配置為所有額外屬性(當它被豐富時添加到每個日志事件的那些)也被顯示。

例如,對於File器,您可以在輸出模板中添加特殊的{Properties}指令,這將顯示附加到事件的所有屬性,但不會作為消息模板的一部分呈現。

那看起來像:

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*擴展依賴於IAuthenticationFilter我們在網頁API聲明在啟動時由於這條線...

以下是可以解釋缺乏豐富性的可能情況: - 由於某種原因PreApplicationStartMethod程序集屬性沒有按預期工作 - 由於某種原因在 Web API 中注冊StoreWebApInfoInHttpContextAuthenticationFilter不起作用 - 由於某種原因我們無法從ActionContext提取信息

您是否可能在啟動時使用已注冊的AuthenticationFilter做“奇怪”的事情?

最好嘗試將其作為您在此處報告的問題的一部分進行跟蹤: https : //github.com/serilog-web/classic-webapi/issues/18 ;)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM