なんかB票みたいなタイトルになったけど、まーハマったから残します。
【現象】
Azure Functionの修正が必要だったので、ついでに、インプロセスから分離ワーカープロセスに移行した際に、Application Insightにログが出なくなりました。(正確にはInformationログが出なくなった)
【原因】
次の2つ
a) ログ出力レベル(LogLevel)がWarningになっていた。
b) Application Insightへのログ出力サンプリングが有効になっていた。
【対応内容】
上記a)に関しては、下記のリンクⅰ)のApplication Insightの項に書いてありました。
既定では、Application Insights SDK は、警告とそれより深刻なログのみをキャプチャするようにロガーに指示するログ フィルターを追加します。 この動作を無効にする場合は、サービス構成の一部としてフィルター規則を削除します。
上記b)がなかなか見つかりませんでした。
リンクのⅲ)→ⅰ)→ⅳ)とたどっていってやっと見つかりました。
「サンプリング」の項に次のようにあります。
ワーカー サービス向け Application Insights SDK では、固定レートのサンプリングとアダプティブ サンプリングの両方がサポートされます。 アダプティブ サンプリングは、既定で有効になっています。 サンプリングは、ApplicationInsightsServiceOptions の
EnableAdaptiveSampling
オプションを使用して無効にすることができます。
「ApplicationInsightsServiceOptions を使用する」の項にEnableAdaptiveSampling
オプションの設定方法はありましたけど、固定レートのサンプリング設定が見当たりませんでした。
ただ、リンクⅰ)のある項のサンプルコードのコメントにしれっと次の記載がありました。
// The Application Insights SDK adds a default logging filter that instructs ILogger to capture only Warning and more severe logs. Application Insights requires an explicit override.
// Log levels can also be configured using appsettings.json. For more information, see https://learn.microsoft.com/en-us/azure/azure-monitor/app/worker-service#ilogger-logs
確かにⅳ)の「ILogger ログ」の項に設定のサンプルがありますが、host.jsonなのかappsettings.jsonなのか記載がありません。インプロセスはプロセス1つだからhostの設定に従い、分離ワーカーは別プロセスだからapplication単位の設定に従う、ということなのでしょうが、ちょっと見つけづらかったです。
【リンク】
ⅰ)分離ワーカー プロセスにおける C# Azure Functions の実行のガイド
ⅱ)分離ワーカー モデルとインプロセス モデル .NET Azure Functions との違い
ⅲ).NET アプリをインプロセス モデルから分離ワーカー モデルに移行する
ⅳ)ワーカー サービス アプリケーション (非 HTTP アプリケーション) 向け Application Insights
(来年11月に.NET6がサポート終了しますが、そうするとインプロセスも自動的にサポート終了ですかね?ちょっと大変かもしれません。)