Serilog, ExceptionDetails и outputTemplate
Я работаю с.Net Core 3.1 и Serilog, но у меня есть небольшая, но неприятная проблема с выводом журнала.
Конфигурация
Мой appsettings.json
является
{
"Serilog": {
"Properties": {
"Application": "Testing GZip"
},
"WriteTo": [
{
"Name": "Debug",
"Args": {
"outputTemplate": "[{Timestamp:o}] [{Level,3:u}] [{MachineName}/{ProcessName}:{ProcessId}/{ThreadName}:{ThreadId}] [{Application}/{SourceContext}] {Message}{NewLine}{Exception}{Properties:j}"
}
}
],
"Enrich": [ "WithMachineName", "WithProcessName", "WithProcessId", "WithThreadName", "WithThreadId", "WithExceptionDetails" ]
}
}
Эта проблема
Как видите, мой outputTemplate
заканчивается {NewLine}{Exception}{Properties:j}
и это обязательно, если вы хотите регистрировать исключения и сведения об исключениях.
К сожалению, я заметил, что вывод не отформатирован. Взгляните сюда:
[2020-04-10T13:58:16.5592267+02:00] [INFORMATION] [PRO4-AEG/Test_Serilog_Logging:8096/:1] [Testing GZip/object] Start logging
{}[2020-04-10T13:58:16.6547724+02:00] [INFORMATION] [PRO4-AEG/Test_Serilog_Logging:8096/:1] [Testing GZip/object] Test1
{}Exception thrown: 'System.ArgumentNullException' in Test_Serilog_Logging.dll
{}[2020-04-10T13:58:16.6755158+02:00] [ERROR] [PRO4-AEG/Test_Serilog_Logging:8096/:1] [Testing GZip/object] You wrote 'THIS IS A TEST!' - Test_Serilog_Logging.TestClass
System.ArgumentNullException: Value cannot be null. (Parameter 'argument')
at Test_Serilog_Logging.TestClass.TestLogging() in C:\Users\attil\source\repos\Test_Serilog_Logging\Test_Serilog_Logging\TestClass.cs:line 25
{"ExceptionDetail":{"Type":"System.ArgumentNullException","HResult":-2147467261,"Message":"Value cannot be null. (Parameter 'argument')","Source":"Test_Serilog_Logging","ParamName":"argument"}}[2020-04-10T13:58:16.7337262+02:00] [INFORMATION] [PRO4-AEG/Test_Serilog_Logging:8096/:1] [Testing GZip/object] Stop logging
{}The program '[8096] Test_Serilog_Logging.exe' has exited with code 0 (0x0).
Как вы можете видеть после первого события журнала, Serilog начинает префикс строки с двумя символами {}
, который исчезнет, если я удалю {Properties:j}
из моего файла конфигурации.
Есть идеи по решению проблемы?
Спасибо. Аттилио
2 ответа
В {}
в начале каждой строки находится содержимое вашего Properties
как JSON (пустой объект), потому что для этих сообщений журнала не определены свойства. Он появляется в начале следующей строки из-за того, как вы определили шаблон вывода:
{Message}{NewLine}{Exception}{Properties:j}
Это вызывает {NewLine}
будет добавлено перед деталями исключения и свойствами.
Если вы добавите {NewLine}
в конец вашего выходного шаблона вместо этого вы получите {}
на той же линии...
{Message}{Exception}{Properties:j}{NewLine}
Один из вариантов, который вы могли бы рассмотреть, - использовать средство форматирования Serilog, такое какSerilog.Formatting.Json.JsonFormatter
или Serilog.Formatting.Compact.CompactJsonFormatter
- см. вики Serilog для получения дополнительной информации о форматировании вывода, а также изображение ниже о том, как настроить этот файл appsettings.json. В качестве альтернативы вы можете создать свой собственный модуль форматирования - см. Пример в CompactJsonFormatter.