入门日志 - 控制台

了解如何在 .NET 控制台应用程序中使用 OpenTelemetry 日志

本指南将向您展示如何在几分钟内开始在控制台应用程序中使用 OpenTelemetry .NET 日志。

先决条件

创建控制台应用程序

创建新的控制台应用程序并运行它

dotnet new console --output getting-started
cd getting-started
dotnet run

您应该会看到以下输出

Hello World!

添加 OpenTelemetry 日志

安装 OpenTelemetry Console Exporter 包

dotnet add package OpenTelemetry.Exporter.Console

使用以下代码更新 Program.cs 文件

using Microsoft.Extensions.Logging;
using OpenTelemetry;
using OpenTelemetry.Logs;

// Create a logger factory with OpenTelemetry
using var loggerFactory = LoggerFactory.Create(builder =>
{
    builder.AddOpenTelemetry(options =>
    {
        options.AddConsoleExporter();
    });
});

// Get a logger instance
var logger = loggerFactory.CreateLogger<Program>();

// Log a simple message
logger.LogInformation("Hello from OpenTelemetry .NET Logs!");

// Log with structured data
logger.FoodPriceChanged("artichoke", 9.99);

// Log a more complex example
logger.FoodRecallNotice(
    "Food & Beverages",
    "Contoso",
    "Salads",
    "Contoso Fresh Vegetables, Inc.",
    "due to a possible health risk from Listeria monocytogenes");

// Define extension methods for structured logging
internal static partial class LoggerExtensions
{
    [LoggerMessage(LogLevel.Information, "Food `{name}` price changed to `{price}`.")]
    public static partial void FoodPriceChanged(this ILogger logger, string name, double price);

    [LoggerMessage(LogLevel.Critical, "A `{productType}` recall notice was published for `{brandName} {productDescription}` produced by `{companyName}` ({recallReasonDescription}).")]
    public static partial void FoodRecallNotice(
        this ILogger logger,
        string productType,
        string brandName,
        string productDescription,
        string companyName,
        string recallReasonDescription);
}

再次运行应用程序(使用 dotnet run),您应该会在控制台上看到日志输出。

LogRecord.Timestamp:               2023-09-15T06:07:03.5502083Z
LogRecord.CategoryName:            Program
LogRecord.Severity:                Info
LogRecord.SeverityText:            Information
LogRecord.Body:                    Food `{name}` price changed to `{price}`.
LogRecord.Attributes (Key:Value):
    name: artichoke
    price: 9.99
    OriginalFormat (a.k.a Body): Food `{name}` price changed to `{price}`.
LogRecord.EventId:                 344095174
LogRecord.EventName:               FoodPriceChanged

...

LogRecord.Timestamp:               2023-09-15T06:07:03.5683511Z
LogRecord.CategoryName:            Program
LogRecord.Severity:                Fatal
LogRecord.SeverityText:            Critical
LogRecord.Body:                    A `{productType}` recall notice was published for `{brandName} {productDescription}` produced by `{companyName}` ({recallReasonDescription}).
LogRecord.Attributes (Key:Value):
    brandName: Contoso
    productDescription: Salads
    productType: Food & Beverages
    recallReasonDescription: due to a possible health risk from Listeria monocytogenes
    companyName: Contoso Fresh Vegetables, Inc.
    OriginalFormat (a.k.a Body): A `{productType}` recall notice was published for `{brandName} {productDescription}` produced by `{companyName}` ({recallReasonDescription}).
LogRecord.EventId:                 1338249384
LogRecord.EventName:               FoodRecallNotice

恭喜!您现在正在使用 OpenTelemetry 收集日志。

工作原理

该程序通过实例化一个 LoggerFactory 实例来创建日志记录管道,并将 OpenTelemetry 添加为 日志提供程序

OpenTelemetry SDK 配置了 ConsoleExporter,以将日志导出到控制台以供演示。在生产环境中使用时,应改用其他导出器,例如 OTLP Exporter

LoggerFactory 实例用于创建 ILogger 实例,该实例用于进行实际的日志记录。

遵循 .NET 日志记录最佳实践,使用了 编译时日志源生成,它提供了高性能、结构化的日志记录和类型安全的参数。

与依赖注入一起使用

对于使用 依赖注入 (DI)ILogger 的应用程序(例如 ASP.NET Core.NET Worker),常见的做法是将 OpenTelemetry 添加到 DI 日志记录管道中作为 日志提供程序,而不是通过创建新的 LoggerFactory 实例来设置全新的日志记录管道。

请参阅 ASP.NET Core 入门 教程了解更多信息。

了解更多