Может ли Serilog разрушать сложные объекты, передаваемые в BeginScope? - PullRequest
1 голос
/ 15 января 2020

Я использую Serilog.Extensions.Logging и вывод на консоль с этим outputTemplate:

"{Timestamp:HH:mm} [{Level:u3}] {Message} {Properties:j} {NewLine}"

Я хотел бы видеть, что сложные объекты, установленные с помощью BeginScope, распадаются на Properties. Вместо этого, кажется, используется имя типа.

var data = new Data { Id = 42, Name = "Hitchhiker" };
using (logger.BeginScope(new Dictionary<string, object> { { "Data", data } }))
{
    logger.LogInformation("Hello world!");
}

Результат:

10:40 [INF] Hello world! {"SourceContext": "ConsoleApp3.Program", "Data": "ConsoleApp3.Data"}

Что я хочу:

10:40 [INF] Hello world! {"SourceContext": "ConsoleApp3.Program", "Data": { "Id" = 42, "Name" = "Hitchhiker"} }

Мне не хватает настройки конфигурации, или это просто невозможно?

edit

Только что заметил, что это может быть достигнуто vanil Serilog:

var dataLogger = logger.ForContext("Data", data, true);

Здесь последний параметр сообщает Serilog, что он должен разрушить сложный тип.

1 Ответ

1 голос
/ 15 января 2020

Сложный тип будет деструктурирован, если ключу предшествует символ @. Итак:

using (logger.BeginScope(new Dictionary<string, object> { { "@Data", data } }))

делает свое дело: -)

...