Это легко объясняется:
Итак:
def x(a=0, b=[], c=[], d=0):
a = a + 1
b = b + [1]
c.append(1)
print a, b, c
a
не изменяется - каждый вызов назначения создает новый объект int - печатается новый объект b
не изменяется - новый массив создается из значения по умолчанию и печатается c
изменения - операция выполняется на одном и том же объекте - и печатается Я думаю, что сейчас происходит то, что ваши «события журнала» должным образом обогащены всей информацией, но приемник 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 ; )