Отображение деструктурированных объектов как экранированных JSON в Serilog.Formatting.Compact.RenderedCompactJsonFormattC#

Место общения программистов C#
Anonymous
Отображение деструктурированных объектов как экранированных JSON в Serilog.Formatting.Compact.RenderedCompactJsonFormatt

Сообщение Anonymous »

В рамках использования более структурированного ведения журналов в Serilog нам необходимо изменить формат вывода журналов, чтобы их можно было легко копировать в формате JSON, где это возможно.
Если я настраиваю базовую службу Worker приложение и зарегистрируйте Serilog:

Код: Выделить всё

builder.Services.AddSerilog(loggerConfig =>
{
loggerConfig
.WriteTo.File(new RenderedCompactJsonFormatter(), "output.json");
});
А затем записать данные двумя разными способами:

Код: Выделить всё

using System.Text.Json;

namespace LoggingTests;

public class Worker : BackgroundService
{
private readonly ILogger _logger;
private readonly IHostApplicationLifetime _hostApplicationLifetime;

public Worker(ILogger logger, IHostApplicationLifetime hostApplicationLifetime)
{
_logger = logger;
_hostApplicationLifetime = hostApplicationLifetime;
}

protected override Task ExecuteAsync(CancellationToken stoppingToken)
{
var message = new ExampleMessage(
ExampleText: "Test Message",
ExampleNumber: 120,
ExamplePerson: new Person("John", "Smith"),
OtherPeople: [new Person("Another", "Person"), new Person("YetAnother", "Person")]
);
_logger.LogWarning("Example Structured Payload: {@Message}", message);
_logger.LogWarning("Example Structured Payload: {@Message}", JsonSerializer.Serialize(message));
_hostApplicationLifetime.StopApplication();

return Task.CompletedTask;
}

record ExampleMessage(string ExampleText, int ExampleNumber, Person ExamplePerson, IEnumerable OtherPeople);
record Person(string FirstName, string LastName);
}

Последний способ регистрации сообщения не является правильным способом его регистрации, и мы по-прежнему хотим, чтобы свойства были деструктурированы и включены в контекст, однако мне интересно, как форматировать сообщение Я бы добился сериализации объекта как экранированного JSON, как в случае с последним сообщением. Чтобы сравнить их:

Код: Выделить всё

{
"@t": "2024-04-24T01:28:25.4060384Z",
"@m": "Example Structured Payload: ExampleMessage { ExampleText: \"Test Message\", ExampleNumber: 120, ExamplePerson: Person { FirstName: \"John\", LastName: \"Smith\" }, OtherPeople: [Person { FirstName: \"Another\", LastName: \"Person\" }, Person { FirstName: \"YetAnother\", LastName: \"Person\"  }] }",
"@i": "1227d6a4",
"@l": "Warning",
"Message": {
"ExampleText": "Test Message",
"ExampleNumber": 120,
"ExamplePerson": {
"FirstName": "John",
"LastName": "Smith",
"$type": "Person"
},
"OtherPeople": [
{
"FirstName": "Another",
"LastName": "Person",
"$type": "Person"
},
{
"FirstName": "YetAnother",
"LastName": "Person",
"$type": "Person"
}
],
"$type": "ExampleMessage"
},
"SourceContext": "LoggingTests.Worker"
}

Код: Выделить всё

{
"@t": "2024-04-24T01:28:25.4326606Z",
"@m": "Example Structured Payload: \"{\\\"ExampleText\\\":\\\"Test Message\\\",\\\"ExampleNumber\\\":120,\\\"ExamplePerson\\\":{\\\"FirstName\\\":\\\"John\\\",\\\"LastName\\\":\\\"Smith\\\"},\\\"OtherPeople\\\":[{\\\"FirstName\\\":\\\"Another\\\",\\\"LastName\\\":\\\"Person\\\"},{\\\"FirstName\\\":\\\"YetAnother\\\",\\\"LastName\\\":\\\"Person\\\"}]}\"",
"@i": "1227d6a4",
"@l": "Warning",
"Message": "{\"ExampleText\":\"Test Message\",\"ExampleNumber\":120,\"ExamplePerson\":{\"FirstName\":\"John\",\"LastName\":\"Smith\"},\"OtherPeople\":[{\"FirstName\":\"Another\",\"LastName\":\"Person\"},{\"FirstName\":\"YetAnother\",\"LastName\":\"Person\"}]}",
"SourceContext": "LoggingTests.Worker"
}
В идеальном случае сообщение журнала будет выглядеть так:

Код: Выделить всё

{
"@t": "2024-04-24T01:28:25.4326606Z",
"@m": "Example Structured Payload: \"{\\\"ExampleText\\\":\\\"Test Message\\\",\\\"ExampleNumber\\\":120,\\\"ExamplePerson\\\":{\\\"FirstName\\\":\\\"John\\\",\\\"LastName\\\":\\\"Smith\\\"},\\\"OtherPeople\\\":[{\\\"FirstName\\\":\\\"Another\\\",\\\"LastName\\\":\\\"Person\\\"},{\\\"FirstName\\\":\\\"YetAnother\\\",\\\"LastName\\\":\\\"Person\\\"}]}\"",
"@i": "1227d6a4",
"@l": "Warning",
"Message": {
"ExampleText": "Test Message",
"ExampleNumber": 120,
"ExamplePerson": {
"FirstName": "John",
"LastName": "Smith",
"$type": "Person"
},
"OtherPeople": [
{
"FirstName": "Another",
"LastName": "Person",
"$type": "Person"
},
{
"FirstName": "YetAnother",
"LastName": "Person",
"$type": "Person"
}
],
"$type": "ExampleMessage"
},
"SourceContext": "LoggingTests.Worker"
}
Любая помощь приветствуется, существует множество документации по ведению журналов с помощью средства форматирования текста по умолчанию в JSON, но включение экранированного JSON в сообщение JSON, судя по всему, является крайним случаем.
>

Подробнее здесь: https://stackoverflow.com/questions/783 ... act-render

Вернуться в «C#»