ログ入門 - ASP.NET Core
このガイドでは、ASP.NET Core アプリケーションで OpenTelemetry .NET ログを使い始める方法を紹介します。
前提条件
- コンピュータに .NET SDK がインストールされていること
ASP.NET Core アプリケーションの作成
新しい ASP.NET Core Web アプリケーションを作成します。
dotnet new web -o aspnetcoreapp
cd aspnetcoreapp
OpenTelemetry ログの追加
必要な OpenTelemetry パッケージをインストールします。
dotnet add package OpenTelemetry.Exporter.Console
dotnet add package OpenTelemetry.Extensions.Hosting
Program.cs ファイルを次のコードで更新します。
using OpenTelemetry.Logs;
using OpenTelemetry.Resources;
var builder = WebApplication.CreateBuilder(args);
// 説明目的のみで、デフォルトの .NET ログプロバイダーを無効化します。
// このデモでは、詳細な OpenTelemetry コンソールエクスポーターを使用するため、
// コンソールログプロバイダーを削除します。ほとんどの開発および本番環境では
// デフォルトのコンソールプロバイダーで十分であり、これらのプロバイダーを
// クリアする必要はありません。
builder.Logging.ClearProviders();
// WithLogging 拡張メソッドを呼び出して OpenTelemetry ログプロバイダーを追加します。
builder.Services.AddOpenTelemetry()
.ConfigureResource(r => r.AddService(builder.Environment.ApplicationName))
.WithLogging(logging => logging
/* 注意: ConsoleExporter はデモ目的でのみ使用しています。本番環境では
ConsoleExporter を他のエクスポーター(たとえば OTLP Exporter)に
置き換えてください。 */
.AddConsoleExporter());
var app = builder.Build();
app.MapGet("/", (ILogger<Program> logger) =>
{
logger.FoodPriceChanged("artichoke", 9.99);
return "Hello from OpenTelemetry Logs!";
});
app.Logger.StartingApp();
app.Run();
internal static partial class LoggerExtensions
{
[LoggerMessage(LogLevel.Information, "Starting the app...")]
public static partial void StartingApp(this ILogger logger);
[LoggerMessage(LogLevel.Information, "Food `{name}` price changed to `{price}`.")]
public static partial void FoodPriceChanged(this ILogger logger, string name, double price);
}
アプリケーションの実行
アプリケーションを実行します。
dotnet run
コンソールに表示された URL(たとえば http://localhost:5000)にブラウザでアクセスします。
コンソールに次のようなログ出力が表示されるはずです。
LogRecord.Timestamp: 2023-09-06T22:59:17.9787564Z
LogRecord.CategoryName: getting-started-aspnetcore
LogRecord.Severity: Info
LogRecord.SeverityText: Information
LogRecord.Body: Starting the app...
LogRecord.Attributes (Key:Value):
OriginalFormat (a.k.a Body): Starting the app...
LogRecord.EventId: 225744744
LogRecord.EventName: StartingApp
...
LogRecord.Timestamp: 2023-09-06T23:00:46.1639248Z
LogRecord.TraceId: 3507087d60ae4b1d2f10e68f4e40784a
LogRecord.SpanId: c51be9f19c598b69
LogRecord.TraceFlags: None
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
おめでとうございます! ASP.NET Core アプリケーションで OpenTelemetry を使用してログを収集できるようになりました。
仕組み
デフォルトのログプロバイダーの置き換え
デモ目的で、サンプルではデフォルトの .NET ログプロバイダーをクリアし、OpenTelemetry のコンソール出力をより分かりやすく表示します。
// 説明目的のみで、デフォルトの .NET ログプロバイダーを無効化します。
// このデモでは、詳細な OpenTelemetry コンソールエクスポーターを使用するため、
// コンソールログプロバイダーを削除します。ほとんどの開発および本番環境では
// デフォルトのコンソールプロバイダーで十分であり、これらのプロバイダーを
// クリアする必要はありません。
builder.Logging.ClearProviders();
実際のアプリケーションでは、通常デフォルトのプロバイダーを維持したまま、OpenTelemetry をそれらと併用します。
OpenTelemetry ログの追加
アプリケーションは AddOpenTelemetry() 拡張メソッドを使用して OpenTelemetry を設定します。
builder.Services.AddOpenTelemetry()
.ConfigureResource(r => r.AddService(builder.Environment.ApplicationName))
.WithLogging(logging => logging
.AddConsoleExporter());
このコードは以下のことを行います。
- OpenTelemetry をサービスコレクションに追加します
- リソース情報(サービス名など)を設定します
WithLogging()拡張メソッドでログを設定します- コンソールエクスポーターを追加して、ログをコンソールに出力します
ログのための依存性注入の使用
ASP.NET Core はログのための組み込みの依存性注入を提供します。 サンプルではこれを使用して、リクエストハンドラーにロガーを注入します。
app.MapGet("/", (ILogger<Program> logger) =>
{
logger.FoodPriceChanged("artichoke", 9.99);
return "Hello from OpenTelemetry Logs!";
});
ILogger<Program> パラメーターはフレームワークによって自動的に注入され、ログにはカテゴリ名 “Program” が含まれます。
LoggerMessage ソース生成の使用
サンプルでは、高性能な構造化ログのためにコンパイル時ログソース生成を使用しています。
internal static partial class LoggerExtensions
{
[LoggerMessage(LogLevel.Information, "Starting the app...")]
public static partial void StartingApp(this ILogger logger);
[LoggerMessage(LogLevel.Information, "Food `{name}` price changed to `{price}`.")]
public static partial void FoodPriceChanged(this ILogger logger, string name, double price);
}
このアプローチには以下の特徴があります。
- 文字列補間よりも優れたパフォーマンスを提供します。
- ログパラメーターの型安全性を保証します。
- 名前付きパラメーターを持つ構造化ログを生成します。
LogRecordにEventNameを自動的に生成します。
さらに学ぶ
フィードバック
このページは役に立ちましたか?
Thank you. Your feedback is appreciated!
Please let us know how we can improve this page. Your feedback is appreciated!