Написание структурированных журналов с Serilog
Я попробовал следующий журнал с Serilog:
this.logger.Debug("Incoming metrics data {ClientId}", new { clientid = 54732 });
Serilog произвел этот вывод:
Incoming metrics data "{ clientid = 54732 }"
Serilog - структурированный логгер, я ожидал, что он выдаст что-то вроде этого:
Incoming metrics data {ClientId}, {clientId: 54732}
Я делаю что-то не так или я неправильно понимаю Serilog / структурированное ведение журнала?
1 ответ
Две вещи; во-первых, чтобы сериализовать такую структуру, вам нужно использовать оператор захвата структуры @
:
this.logger.Debug("Incoming metrics data {@Client}", new { ClientId = 54732 });
Это захватит отдельные свойства переданного объекта, поэтому событие в переписанном примере будет иметь Client
собственность с ClientId
суб-недвижимость.
Это даст вам вывод, как:
Incoming metrics data {"ClientId": 54732}
(Предполагается, что вы используете последний консольный приемник Serilog с шаблоном по умолчанию; другие конфигурации могут не печатать внедренные данные в стиле JSON.)
Второе соображение заключается в том, что полная структура события не показана в текстовом выводе Serilog - это "дружественное к человеку" лицо Serilog. Если вы хотите записать структуру, вы можете подключить CompactJsonFormatter
вот так (опять же при условии консольной раковины):
.WriteTo.Console(new CompactJsonFormatter())
Это работает и для файлов и т. Д. - подробности на https://github.com/serilog/serilog-formatting-compact.