Логування комплексних обʼєктів
У посібнику Початок роботи з OpenTelemetry .NET Logs — Консоль ми дізналися, як реєструвати примітивні типи даних. У цьому посібнику ви дізнаєтеся, як реєструвати комплексі обʼєкти.
Логування комплексних обʼєктів у .NET
Логування комплексних обʼєктів було запроваджене в .NET 8.0 через атрибут LogPropertiesAttribute. Цей атрибут та відповідна логіка генерації коду надаються пакунком розширенням Microsoft.Extensions.Telemetry.Abstractions.
Попередні вимоги
- Ознайомитись з посібником Початок роботи з Консоллю навчальний посібник.
Кроки реалізації
1. Встановіть необхідний пакунок
Встановіть пакунок Microsoft.Extensions.Telemetry.Abstractions:
dotnet add package Microsoft.Extensions.Telemetry.Abstractions
2. Визначте комплексний тип даних
Створіть структуру для представлення вашого комплексного обʼєкта:
public struct FoodRecallNotice
{
public string? BrandName { get; set; }
public string? ProductDescription { get; set; }
public string? ProductType { get; set; }
public string? RecallReasonDescription { get; set; }
public string? CompanyName { get; set; }
}
3. Створіть метод розширення для логера з атрибутом LogProperties
Визначте метод розширення для вашого логера, який використовує атрибут LogProperties.
using Microsoft.Extensions.Logging;
internal static partial class LoggerExtensions
{
[LoggerMessage(LogLevel.Critical)]
public static partial void FoodRecallNotice(
this ILogger logger,
[LogProperties(OmitReferenceName = true)] in FoodRecallNotice foodRecallNotice);
}
Атрибут [LogProperties(OmitReferenceName = true)] вказує генератору джерела:
- Включити всі властивості
FoodRecallNoticeяк окремі атрибути журналу - Опустити імʼя посилання (імʼя параметра) з ключів атрибутів
4. Логування комплексного обʼєкта
Створіть екземпляр вашого комплексного обʼєкта та зареєструйте його:
// Створіть комплексний обʼєкт
var foodRecallNotice = new FoodRecallNotice
{
BrandName = "Contoso",
ProductDescription = "Salads",
ProductType = "Food & Beverages",
RecallReasonDescription = "due to a possible health risk from Listeria monocytogenes",
CompanyName = "Contoso Fresh Vegetables, Inc.",
};
// Логування комплексного обʼєкта
logger.FoodRecallNotice(foodRecallNotice);
5. Запустіть програму
Запустіть програму, наприклад, за допомогою dotnet run, і ви повинні побачити вивід журналу в консолі:
LogRecord.Timestamp: 2024-01-12T19:01:16.0604084Z
LogRecord.CategoryName: Program
LogRecord.Severity: Fatal
LogRecord.SeverityText: Critical
LogRecord.FormattedMessage:
LogRecord.Body:
LogRecord.Attributes (Key:Value):
CompanyName: Contoso Fresh Vegetables, Inc.
RecallReasonDescription: due to a possible health risk from Listeria monocytogenes
ProductType: Food & Beverages
ProductDescription: Salads
BrandName: Contoso
LogRecord.EventId: 252550133
LogRecord.EventName: FoodRecallNotice
Зверніть увагу, що кожна властивість обʼєкта FoodRecallNotice відображається як окремий атрибут у записі журналу.
Параметри LogPropertiesAttribute
Атрибут LogPropertiesAttribute надає кілька параметрів для контролю того, як властивості включаються до журналів:
OmitReferenceName: Коли встановлено в
true, імʼя параметра опускається з ключів атрибутів. У наведеному вище прикладі ключі атрибутів — це просто імена властивостей (наприклад, “BrandName”), а не “foodRecallNotice.BrandName”.IncludeProperties: Використовується для вказівки, які властивості слід включити. Якщо не вказано, всі властивості включаються.
ExcludeProperties: Використовується для вказівки, які властивості слід виключити з журналювання.
IncludeSensitive: Коли встановлено в
true, властивості, позначені атрибутом[Sensitive], включаються до журналів. Стандартне значення —false.
Повний приклад
Ось повний приклад, який обʼєднує все:
using System;
using Microsoft.Extensions.Logging;
using OpenTelemetry;
using OpenTelemetry.Logs;
// Визначення комплексного обʼєкта
public struct FoodRecallNotice
{
public string? BrandName { get; set; }
public string? ProductDescription { get; set; }
public string? ProductType { get; set; }
public string? RecallReasonDescription { get; set; }
public string? CompanyName { get; set; }
}
// Метод розширення Logger
internal static partial class LoggerExtensions
{
[LoggerMessage(LogLevel.Critical)]
public static partial void FoodRecallNotice(
this ILogger logger,
[LogProperties(OmitReferenceName = true)] in FoodRecallNotice foodRecallNotice);
}
// Головна програма
class Program
{
static void Main(string[] args)
{
// Створіть фабрику логів з OpenTelemetry
using var loggerFactory = LoggerFactory.Create(builder =>
{
builder.AddOpenTelemetry(options =>
{
options.AddConsoleExporter();
});
});
// Отримайте екземпляр логера
var logger = loggerFactory.CreateLogger<Program>();
// Створіть комплексний обʼєкт
var foodRecallNotice = new FoodRecallNotice
{
BrandName = "Contoso",
ProductDescription = "Salads",
ProductType = "Food & Beverages",
RecallReasonDescription = "due to a possible health risk from Listeria monocytogenes",
CompanyName = "Contoso Fresh Vegetables, Inc.",
};
// Записати комплексний обʼєкт
logger.FoodRecallNotice(foodRecallNotice);
Console.WriteLine("Press any key to exit");
Console.ReadKey();
}
}
Дізнайтеся більше
- Microsoft.Extensions.Logging.LogPropertiesAttribute
- Microsoft.Extensions.Telemetry.Abstractions
- Кореляція логів OpenTelemetry .NET
- Модель даних логів OpenTelemetry
Зворотний зв’язок
Чи була ця сторінка корисною?
Дякуємо. Ми цінуємо ваші відгуки!
Будь ласка, дайте нам знати як ми можемо покращити цю сторінку. Ми цінуємо ваші відгуки!