Может ли Serilog деструктурировать сложные объекты, переданные в BeginScope?

Я использую 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"} }

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

редактировать

Только что заметил, что это можно сделать с помощью vanilla Serilog:

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

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

1 ответ

Сложный тип будет деструктурирован, если перед ключом будет стоять префикс. @характер. Так:

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

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

Другие вопросы по тегам