Azure App Service (Web Apps)でホストされている .NETアプリケーションからNew Relic Logsにログを送る

所要時間:約 6分

Azure App ServiceのWeb Appsは開発したアプリケーションをすぐにホスティングし公開できる、非常に便利で強力なサービスです。New Relicでは .NET APM AgentをSite Extensionとしてインストールできるようにしています。また、通常の言語別のAPM Agentもインストールが可能です。

さて、Web Appsで動かしている .NET アプリケーションから出力されるログをNew Relic Logsに転送したいという要望をいただくことがあります。New Relic Infrastructure Agentがインストールできる環境であればInfrastruture Agentから転送する方法が簡単ですが、Web AppsのようなPaaSではインストールできません。Web Appsの性質と .NET向けにNew Relicが提供している機能を踏まえると、一部製品としては提供していないサードパーティのライブラリを利用する必要がありますが、.NET のログライブラリを利用してアプリケーションから直接転送する方法が容易です。本記事ではその方法をご紹介しようと思います。なお、アプリケーション本体からではなく、リクエストログ(HTTPログ)や(ファイル変更などの)Auditログを転送したい場合はDiagnostics Settingを利用したEvent Hub経由での転送が利用できます。また、.NET 以外の言語の場合は、その言語向けにWeb Appsが提供している機能およびその言語のロギングライブラリの機能を踏まえて考える必要があります。これらのケースについては最後に説明しています。

実装イメージとしては上の図のようになります。.NET アプリケーションを開発する場合、NLogSerilogなどのロギングライブラリを利用することが多いと思います。ASP.NET Coreの場合はILoggerが抽象化したロギングライブラリとして使われています。これらのロギングライブラリには、NLogであればTarget、SerilogであればSinkという名前でログの出力先を指定するための機能が着脱できるようになっています。そこで、New Relic LogsのHTTP APIを利用しログをNew Relic Logsに送信するTargetあるいはSinkを利用します。

この方法はNLog、Serilogだけでなく、このような出力先の機能を後から追加できるロギングライブラリであれば利用可能です。NLog,Serilogを利用する場合はLogs in Contextの機能をすぐに利用できるのがメリットになります。またASP.NET Core(正確には.NET Platform Extensions)に含まれているILoggerを利用する場合も、NLogやSerilogをあわせて利用することでLogs in ContextおよびNew Relic Logsへの転送が可能になります。手順は以前の記事を参照ください。

https://blog.newrelic.co.jp/uncategorized/configure-logs-context-net-ilogger/

New Relic Logsに送信するNLogのTarget NLog.Targets.NewRelicLab.Logs およびSerilogのSink Serilog.Sinks.NewRelicLab.Logs は、サードパーティのオープンソースライブラリとして利用可能です。New Relicから製品サポートを提供できないことにご注意ください。

たとえばNLog.Targets.NewRelicLab.Logs を使う場合、ファイルベースの設定ではこちらのgistのようなNLog.configでLogs in Contextが有効化された状態でNew Reli Logsに転送できるようになります。Logs in Contextを利用する場合、APM Agentを有効化しますが、その際に設定するNEW_RELIC_LICENSE_KEYという環境変数NLog.Targets.NewRelicLab.Logs も参照するため設定ファイルに記載する必要がなくなっています。

 

アクセスログなどをNew Relic Logsに転送したい場合

アクセスログなどWeb Apps、正確にはApp Servicesが出力するログを転送したい場合、アプリケーションのロガーから直接転送する方法は使えません。この場合、プレビュー機能ですが、App ServiceのDiagnostics Setting(診断ログ)の機能を使って外部に送信することができます。診断ログは転送先にEvent Hubを指定できます。Event Hubを経由したログはAzure Functionを経由してログをNew Relic Logsに転送することができます。

もしかすると、アプリケーションのログもこの診断ログで転送すれば下の図のように1つの方法ですむと思われるかもしれません。

利用している環境によってはそれが可能です。さきほどの診断ログのドキュメントによれば、Windowsコンテナ、Linux、Linuxコンテナ環境であればアプリケーションがコンソールに出力したログはAppServiceConsoleLogsとして転送可能です。Windowsの場合はJava SE & Tomcatの場合のみAppServiceConsoleLogsが利用できます。つまり、.NET (ASP.NET およびASP.NET Core)でWindowsの場合はコンソールへのログ出力を転送できません。なお、ASP.NET であればAppServiceAppLogsが利用可能とあります。しかし残念ながら、ASP.NET CoreでWindowsの場合は診断ログでの転送が利用できないため、別の方法でNew Relic Logsに転送する必要があるようです。

実際にAzure App ServiceからNew Relic Logsにログを転送したい方、ご自分の環境ではどのような方法がよいか悩んでいる方はぜひNew Relicまでお問い合わせください。