2015-06-04 2 views
4

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

Я хотел бы сделать это:

logger.Information("Doing stuff {Foo} with the thing {Bar}. {User}", foo, bar, user) 

но без {User} в шаблоне.

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

Я также знаю, что я могу использовать низкоуровневый API logger.Write(LogEvent evnt), чтобы фактически контролировать, какие свойства включены, но это похоже на слишком много кода для того, что я пытаюсь выполнить.

Я уверен, что есть короткий и элегантный способ, что это супер очевидно, но я не нашел :)

UPDATE:

я узнал только потом, что этот вопрос более или менее аналогичен: Add custom properties to Serilog

ответ

3

Я мог бы это выяснить самостоятельно!

Вы можете использовать свободный способ .ForContext(propertyName, propertyValue) при одном звонке на один из методов .LogXXX().

Например:

logger.ForContext("User", user) 
     .Information("Doing stuff {Foo} with the thing {Bar}", foo, bar) 

Свойство добавляется к событию не относятся только к случаю, и они больше не присутствует на следующем вызове logger.LogXXX() метода

UPDATE

Статья Николаса Блумхардта объясняет это довольно хорошо: Context and correlation – structured logging concepts in .NET (5)

Смежные вопросы