Serilog с Asp.net Web Api не использует обогащение - PullRequest
2 голосов
/ 26 марта 2019

У меня есть проект Microsoft Asp.Net Web Api, в котором я пытаюсь настроить ведение журнала Serilog.Я установил пакеты Nuget для Serilog, Serilog.Sinks.File, SerilogWeb.Classic и SerilogWeb.Classic.WebApi.Обратите внимание, что я не могу использовать .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

Обратите внимание, что я хочу использовать другие обогащающие устройства, но я упростил это до некоторой степени, чтобы выяснить, что я делаю неправильно.

Для ясности о пакетах, которые я использую, ниже приведены некоторые из моих пакетов .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" />

EDIT

Ниже приведен мой код послепредложенные изменения, и хотя некоторые обогатители работают, я не получаю имена действий и контроллеров:

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

1 Ответ

1 голос
/ 26 марта 2019

Я думаю, что сейчас происходит то, что ваши "события журнала" правильно обогащены всей информацией, но приемник File не настроен должным образом для отображения этой информации.

Значение по умолчанию шаблон вывода приемника File равен {Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} \[{Level:u3}\] {Message:lj}{NewLine}{Exception}, что означает, что он будет правильно отображать «обработанное сообщение» (шаблон сообщения + значение свойств, на которые есть ссылки вшаблон сообщения).

Вам необходимо настроить его таким образом, чтобы все дополнительные свойства (те, которые добавляются к каждому событию журнала при его обогащении) также отображались.

ДляFile раковина, вы можете, например, добавить специальную директиву {Properties} в ваш шаблон вывода, которая будет показывать все свойства, которые прикреплены к событию, но не отображаются как часть сообщения.template.

Это будет выглядеть следующим образом:

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, который мы объявляем в Web API при запуске благодаря этой строке ...

Вот возможные сценарии, которые могут объяснить отсутствие обогащения: - по какой-то причине атрибут сборки PreApplicationStartMethod не работает должным образом - по какой-то причине регистрация StoreWebApInfoInHttpContextAuthenticationFilter в Web API не работает - по какой-то причине мы не можем извлечьинформация из ActionContext

Возможно, вы делаете "странные" вещи с зарегистрированными AuthenticationFilter при запуске?

Вероятно, лучше попытаться отследить это как часть проблемы, о которой вы сообщили здесь: https://github.com/serilog-web/classic-webapi/issues/18;)

...