Отображение деструктурированных объектов как экранированных 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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Что означает профиль (compact1, Compact2, Compact 3) в документации Java API?
    Anonymous » » в форуме JAVA
    0 Ответы
    8 Просмотры
    Последнее сообщение Anonymous
  • Swiftui Compact Count Down Timer на основе даты живой активности iOS
    Anonymous » » в форуме IOS
    0 Ответы
    14 Просмотры
    Последнее сообщение Anonymous
  • Предупреждение: преобразование массива в строку в C:\xampp\htdocs\keebid\wp-includes\formatting.php в строке 1108.
    Anonymous » » в форуме Php
    0 Ответы
    36 Просмотры
    Последнее сообщение Anonymous
  • Анализ экранированных смешанных кавычек в файле csv
    Anonymous » » в форуме C#
    0 Ответы
    19 Просмотры
    Последнее сообщение Anonymous
  • Необработанные строки, чем они отличаются от экранированных строк и где их следует использовать
    Anonymous » » в форуме Android
    0 Ответы
    49 Просмотры
    Последнее сообщение Anonymous

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