Serilog с Asp.net Web Api не использует обогащение

Это легко объясняется:

  1. Объявление функции (класс и т. д.) выполняется только один раз, создавая все объекты значения по умолчанию
  2. , все передается по ссылке

Итак:

def x(a=0, b=[], c=[], d=0):
    a = a + 1
    b = b + [1]
    c.append(1)
    print a, b, c
  1. a не изменяется - каждый вызов назначения создает новый объект int - печатается новый объект
  2. b не изменяется - новый массив создается из значения по умолчанию и печатается
  3. c изменения - операция выполняется на одном и том же объекте - и печатается
2
задан dmoore1181 27 March 2019 в 14:51
поделиться

1 ответ

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

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

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

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

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

0
ответ дан tsimbalar 27 March 2019 в 14:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: