.NET ログとトレースの接続

.NET ログとトレースの接続

トレースとスパンの ID がアプリケーションログに挿入されるようロギングライブラリおよび .NET トレーシングのコンフィギュレーションを設定し、ログデータと相関したアプリケーションのパフォーマンスモニタリングデータを取得することができます。

注: 自動挿入は、JSON でフォーマット化されたログのみに機能します。その他の場合は手動で挿入を行ってください。

.NET トレーサーを統合サービスタグ付けで構成し、アプリケーションのトレースとログの相関付けに最高の使用体験と有用なコンテキストを確保します。

.NET トレーサーは、以下のロギングライブラリをサポートします。

はじめに

自動または手動のトレース挿入は、以下の手順でセットアップできます。

  1. 以下のトレーサー設定で .NET トレーサーを構成します。

    • DD_ENV
    • DD_SERVICE
    • DD_VERSION
  2. Tail を実行するよう指定されたファイルのログ Agent コンフィギュレーションで、ログパイプラインがログファイルをパースできるよう source: csharp を設定します。

  3. ログライブラリに基づいてログコンフィギュレーションを更新します。

例:

トレースおよびスパン ID は、ログコンテキストの補完を有効にした後にのみアプリケーションログに挿入されます。以下のコード例を参照してください。

var log = new LoggerConfiguration()
    // Enrich.FromLogContext を追加して Datadog プロパティを表示
    .Enrich.FromLogContext()
    .WriteTo.File(new JsonFormatter(), "log.json")
    .CreateLogger();

その他の例については、GitHub の Serilog トレース ID 自動挿入プロジェクトを参照してください。

トレースおよびスパン ID は、マップされた診断コンテキスト (MDC) を有効にした後にのみアプリケーションログに挿入されます。以下のコード例を参照してください。

  <layout type="log4net.Layout.SerializedLayout, log4net.Ext.Json">
    <decorator type="log4net.Layout.Decorators.StandardTypesDecorator, log4net.Ext.Json" />
    <default />
    <!--明示的なデフォルトメンバー-->
    <remove value="ndc" />
    <!--書式設定済みのデフォルトメッセージメンバーを削除-->
    <remove value="message" />
    <!--未加工のメッセージを追加-->
    <member value="message:messageobject" />
    <!-- value='properties' を追加して Datadog プロパティを表示 -->
    <member value='properties'/>
  </layout>

その他の例については、GitHub の log4net トレース ID 自動挿入プロジェクトを参照してください。

トレースおよびスパン ID は、マップされた診断コンテキスト (MDC) を有効にした後にのみアプリケーションログに挿入されます。NLog バージョン 4.6 以降の場合は、以下のコード例を参照してください。

 <!-- includeMdlc="true" を追加して MDC プロパティを表示 -->
  <layout xsi:type="JsonLayout" includeMdlc="true">
    <attribute name="date" layout="${longdate}" />
    <attribute name="level" layout="${level:upperCase=true}"/>
    <attribute name="message" layout="${message}" />
    <attribute name="exception" layout="${exception:format=ToString}" />
  </layout>

NLog バージョン 4.5 の場合

 <!-- includeMdc="true" を追加して MDC プロパティを表示 -->
  <layout xsi:type="JsonLayout" includeMdc="true">
    <attribute name="date" layout="${longdate}" />
    <attribute name="level" layout="${level:upperCase=true}"/>
    <attribute name="message" layout="${message}" />
    <attribute name="exception" layout="${exception:format=ToString}" />
  </layout>

その他の例については、GitHub で NLog 4.0NLog 4.5NLog 4.6 を使用したトレース ID 自動挿入プロジェクトを参照してください。

次に、自動または手動挿入のセットアップを完了します。

自動挿入

アプリケーションログが JSON 形式の場合、トレース ID の自動挿入のセットアップの最後に以下を実行します。

  1. .NET トレーサーの環境変数で、DD_LOGS_INJECTION=true を有効にします。.NET トレーサーを構成するその他の方法については、.NET トレーサーの構成をご参照ください。

手動挿入

アプリケーションログが JSON 形式でない場合は、APM データを使用して手動でログを加工します。

必要なキー説明
dd.envグローバルにトレーサーに env を構成します。設定されていない場合、デフォルトは ""
dd.serviceルートサービス名をグローバルに構成します。設定されていない場合、デフォルトはアプリケーション名または IIS サイト名。
dd.versionグローバルにサービスに version を構成します。設定されていない場合、デフォルトは ""
dd.trace_idログステートメント中のアクティブなトレース ID。トレースがない場合、デフォルトは 0
dd.span_idログステートメント中のアクティブなスパン ID。トレースがない場合、デフォルトは 0

注: Datadog ログインテグレーションを使ってログをパースしていない場合、カスタムログパースルールによって dd.trace_iddd.span_id が文字列としてパースされる必要があります。詳細は、このトピックに関してよくあるご質問 をご覧ください。

手動のログ加工設定を終了するには、上記の 3 つのステップを実行してから、以下を行います。

  1. プロジェクトの Datadog.Trace NuGet パッケージを参照します。

  2. CorrelationIdentifier API を使用して相関識別子を取得し、スパンがアクティブな間にログのコンテキストに追加します。

例:

: Serilog ライブラリでは、メッセージプロパティ名が有効な C# 識別子である必要があります。要求されるプロパティ名は、dd_envdd_servicedd_versiondd_trace_iddd_span_id です。

using Datadog.Trace;
using Serilog.Context;

// スパンはこのブロック以前に開始され、アクティブになっている必要があります。
using (LogContext.PushProperty("dd_env", CorrelationIdentifier.Env))
using (LogContext.PushProperty("dd_service", CorrelationIdentifier.Service))
using (LogContext.PushProperty("dd_version", CorrelationIdentifier.Version))
using (LogContext.PushProperty("dd_trace_id", CorrelationIdentifier.TraceId.ToString()))
using (LogContext.PushProperty("dd_span_id", CorrelationIdentifier.SpanId.ToString()))
{
    // 任意のログを記録
}
using Datadog.Trace;
using log4net;

// スパンはこのブロック以前に開始され、アクティブになっている必要があります。
try
{
    LogicalThreadContext.Properties["dd.env"] = CorrelationIdentifier.Env;
    LogicalThreadContext.Properties["dd.service"] = CorrelationIdentifier.Service;
    LogicalThreadContext.Properties["dd.version"] = CorrelationIdentifier.Version;
    LogicalThreadContext.Properties["dd.trace_id"] = CorrelationIdentifier.TraceId.ToString();
    LogicalThreadContext.Properties["dd.span_id"] = CorrelationIdentifier.SpanId.ToString();

    // 任意のログを記録

}
finally
{
    LogicalThreadContext.Properties.Remove("dd.env");
    LogicalThreadContext.Properties.Remove("dd.service");
    LogicalThreadContext.Properties.Remove("dd.version");
    LogicalThreadContext.Properties.Remove("dd.trace_id");
    LogicalThreadContext.Properties.Remove("dd.span_id");
}
using Datadog.Trace;
using NLog;

// スパンはこのブロック以前に開始され、アクティブになっている必要があります。
using (MappedDiagnosticsLogicalContext.SetScoped("dd.env", CorrelationIdentifier.Env))
using (MappedDiagnosticsLogicalContext.SetScoped("dd.service", CorrelationIdentifier.Service))
using (MappedDiagnosticsLogicalContext.SetScoped("dd.version", CorrelationIdentifier.Version))
using (MappedDiagnosticsLogicalContext.SetScoped("dd.trace_id", CorrelationIdentifier.TraceId.ToString()))
using (MappedDiagnosticsLogicalContext.SetScoped("dd.span_id", CorrelationIdentifier.SpanId.ToString()))
{
    // 任意のログを記録
}

その他の参考資料