5分で始める OpenTelemetry .NET ログ - コンソールアプリケーション

.NET コンソールアプリケーションで OpenTelemetry ログを使用する方法を学ぶ

このガイドでは、コンソールアプリケーションで OpenTelemetry .NET ログをわずか数分で使い始める方法を紹介します。

前提条件

  • .NET SDK がコンピューターにインストールされていること

コンソールアプリケーションの作成

新しいコンソールアプリケーションを作成して実行します。

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;

// OpenTelemetry を使用してロガーファクトリーを作成する
using var loggerFactory = LoggerFactory.Create(builder =>
{
    builder.AddOpenTelemetry(options =>
    {
        options.AddConsoleExporter();
    });
});

// ロガーインスタンスを取得する
var logger = loggerFactory.CreateLogger<Program>();

// シンプルなメッセージをログに記録する
logger.LogInformation("Hello from OpenTelemetry .NET Logs!");

// 構造化データを使ってログを記録する
logger.FoodPriceChanged("artichoke", 9.99);

// より複雑な例をログに記録する
logger.FoodRecallNotice(
    "Food & Beverages",
    "Contoso",
    "Salads",
    "Contoso Fresh Vegetables, Inc.",
    "due to a possible health risk from Listeria monocytogenes");

// 構造化ロギングのための拡張メソッドを定義する
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 インスタンスの作成に使用され、この ILogger が実際のロギングを行います。

.NET のロギングのベストプラクティスに従い、コンパイル時のロギングソース生成が使用されています。 これにより、高パフォーマンスで構造化されたロギングと型チェックされたパラメーターが実現されます。

依存性の注入との併用

依存性の注入(DI)で ILogger を使用するアプリケーション(たとえば、ASP.NET Core や .NET Worker)では、新しい LoggerFactory インスタンスを作成してまったく新しいロギングパイプラインを構築するのではなく、DI のロギングパイプラインに OpenTelemetry をロギングプロバイダーとして追加するのが一般的です。

詳しくは ASP.NET Core の入門チュートリアルを参照してください。

さらに詳しく