New Relic Logsの強力な機能のひとつであるLogs in ContextをAPMで利用する場合、言語ごとに対応したログライブラリの拡張機能を利用して有効化します。.NET の場合、log4net、NLogそしてSerilogに対応しています。今回はASP.NET Coreの標準プロジェクトテンプレートで利用されているMicrosoft.Extensions.Logging.ILogger<TCategoryName> (以下ILogger)を利用している場合にLogs in Contextを利用する方法をご紹介します。

ILoggerはログ操作を抽象化しており、.NET 組み込み(.NET Platform Extensions)のログプロバイダーの利用とサードパーティのログプロバイダーの連携の両方をサポートしています。組み込みのログプロバイダーをAPIを利用して拡張することもできますが、New Relicではこの方法でのLogs in Context対応ライブラリはまだ提供していません。ILoggerがサードパーティのログプロバイダーと連携できることを利用し、NLog、Serilogもしくはlog4netを出力先に指定し、それらに対応した拡張ライブラリを利用してLogs in Contextを有効化できます。

Serilogを利用する場合を例にして手順を説明します。まず、それぞれのログプロバイダーごとに用意されている手順を参照してILoggerの出力先として設定します。Serilogの場合は、GitHubリポジトリに設定方法が記載されています。

次にドキュメントを参照してSerilog向けのNew Relic Logs in Context拡張であるNewRelic.LogEnrichers.Serilogを追加し、WithNewRelicLogsInContextをEnrichに追加し、FormatterとしてNewRelicFormatterを指定します。

この両者の設定をASP.NET Coreプロジェクトでコードで設定した場合の例appsettings.jsonで設定した場合の例をGistに公開しています。どちらの場合もProgram.csと設定ファイルのみの変更で完了し、ログ出力側は気にせずILoggerを利用するだけですみます。

New Relic Logsにログを送信するForwaderとしてはドキュメントに記載されている通り、ファイルに出力してInfrastructure Agentもしくはfluentbitやfluentdなどサードパーティのツールを利用するか、kubernetes環境ではコンソールに出力しfluentbitなどクラスタ全体のロギングツールで転送する方法をおすすめしています。

NLogやSerilogなどのログプロバイダーではなく、ILoggerのAPIを実装したロギングツールでLogs in Contextを利用したいお客様はぜひNew Relicまでご連絡ください。