概要
.NET Framework アプリケーションを対象に、System.Net トレース (System.Net 名前空間に関するネットワークトレース) を有効化し、ログファイルではなく Application Insights に送信する方法を紹介します。
具体的には System.Net 名前空間内のトレースなので、以下に書いてあるように、HttpClient だけでなく、Socket や HttpWebRequest、FtpWebRequest、HttpListener、WebSocket など様々なクラスに関するトレースを出力することができます。また、.NET Framework アプリケーションといってもコンソールやデスクトップアプリなどに限った話ではなく、例えば ASP.NET アプリから何らかの外部アプリに HttpClient で HTTP リクエストを行っている場合などにも有効なトレースです。(IIS 上の ASP.NET がリッスンしている側の通信の話ではないことにご注意ください)
方法
今回は Visual Studio 上の ASP.NET ローカルアプリと想定して記載します。
構成ファイルの追記
以下にあるように、<system.diagnostics> に関する設定を構成ファイルに追記します。
ただし、以下の例は machine.config が例になってますが、これはそのサーバー上の該当の .NET Framework のバージョンの全てのアプリに影響してしまいます。
そのため、設定はアプリごとに差し込むようにすることをお勧めします。ASP.NET アプリケーションなら web.config、.NET Framework アプリなら app.config に の同内容を差し込みます。また、.NET Framework アプリのビルド後の exe に差し込みたいのであれば、*.exe.config に差し込むこともできます。
ログのレベルの変更
また、ロギングのレベルも変更でき、また一部の名前空間だけに限定することもできます。
<switches>
<add name="System.Net.WebSockets" value="Information"/>
</switches>
System.Net トレースの各レベルに関する switch の Level については実装やリファレンス的には以下の部分に当たります。(SourceLevels)
https://referencesource.microsoft.com/#System/compmod/system/diagnostics/SourceSwitch.cs,21
https://referencesource.microsoft.com/#System/compmod/system/diagnostics/SourceLevels.cs,13
https://learn.microsoft.com/ja-jp/dotnet/api/system.diagnostics.sourcelevels?view=netframework-4.8.1#fields
Application Insights に飛ばすように変更する
まず今回はローカルの Visual Studio の ASP.NET アプリということで、以下のように簡単に Application Insights を自動追加することができます。
さらに、上部の System.Net トレースのリファレンス通りにやるとローカルのログファイルに書き込まれます。これは Application Insights に飛ばします。これによって Logs (Log Analytics) 経由でクエリ検索をかけることもできるようになります。
<configuration>
...
<system.diagnostics>
<sources>
<source name="System.Net.Http">
<listeners>
<add name="myAppInsightsListener" />
</listeners>
</source>
<switches>
<add name="System.Net.Http" value="Verbose" />
</switches>
<sharedListeners>
<add name="myAppInsightsListener" type="Microsoft.ApplicationInsights.TraceListener.ApplicationInsightsTraceListener, Microsoft.ApplicationInsights.TraceListener" traceOutputOptions="ProcessId, DateTime" />
</sharedListeners>
<trace autoflush="true">
</trace>
</system.diagnostics>
...
</configuration>
留意事項
ただし、Application Insights はインジェスト量がかなりの数になる可能性もあるため、検証環境で事象再現時のみに取得するなど工夫するとよいです。また、送信内容については事前にオンラインにアップしていいものかはローカルで確認しておくことをお勧めします。また、そもそもローカルで十分である場合は公式サンプル通り、ローカル出力を検討しましょう。