Azure Functionの分離ワーカープロセスでApplication Insightにログが出力されない

なんかB票みたいなタイトルになったけど、まーハマったから残します。

【現象】
Azure Functionの修正が必要だったので、ついでに、インプロセスから分離ワーカープロセスに移行した際に、Application Insightにログが出なくなりました。（正確にはInformationログが出なくなった）

【原因】
次の2つ
a) ログ出力レベル(LogLevel)がWarningになっていた。
b) Application Insightへのログ出力サンプリングが有効になっていた。

### a) ログ出力レベル(LogLevel)がWarningになっていた
これまで?は、ログ出力レベルは、host.jsonで指定するようになっていたと思いますが、
分離ワーカープロセスからApplication Insightに出力する場合は、違うお作法となるようです。

[分離ワーカー プロセスにおける C# Azure Functions の実行のガイド - Applicaton Insight - ログ レベルの管理](https://learn.microsoft.com/ja-jp/azure/azure-functions/dotnet-isolated-process-guide?tabs=windows#managing-log-levels)

![Screenshot 2024-08-10 at 17-33-01 分離ワーカー プロセスにおける C# Azure Functions の実行のガイド Microsoft Learn.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/649784/38f4de2b-7692-0094-cc11-31d080280da3.png)

>既定では、Application Insights SDK は、警告とそれより深刻なログのみをキャプチャするようにロガーに指示するログ フィルターを追加します。 この動作を無効にする場合は、サービス構成の一部としてフィルター規則を削除します。
> ```c#
>var host = new HostBuilder()
>    .ConfigureFunctionsWorkerDefaults()
>    .ConfigureServices(services => {
>        services.AddApplicationInsightsTelemetryWorkerService();
>        services.ConfigureFunctionsApplicationInsights();
>    })
>    .ConfigureLogging(logging =>
>    {
>        logging.Services.Configure<LoggerFilterOptions>(options =>
>        {
>            LoggerFilterRule defaultRule = options.Rules.FirstOrDefault(rule => rule.ProviderName
>                == "Microsoft.Extensions.Logging.ApplicationInsights.ApplicationInsightsLoggerProvider");
>            if (defaultRule is not null)
>            {
>                options.Rules.Remove(defaultRule);
>            }
>        });
>    })
>    .Build();
>
>host.Run();
> ```

これでOK。

### b) Application Insightへのログ出力サンプリングが有効になっていた
LogAnalytics、Application Insightへ出力されたログは、量が多いとデフォルトでサンプリングされすべてを確認することはできません。ということで漏れなくログ出力＆確認するためには、サンプリングを無効にする必要があります。が、その方法がなかなか見つかりませんでした。
リンクのⅲ)→ⅰ)→ⅳ)とたどっていってやっと見つかりました。
[ワーカー サービス アプリケーション (非 HTTP アプリケーション) 向け Application Insights](https://learn.microsoft.com/ja-jp/azure/azure-monitor/app/worker-service#sampling)
「サンプリング」の項に次のようにあります。
>ワーカー サービス向け Application Insights SDK では、固定レートのサンプリングとアダプティブ サンプリングの両方がサポートされます。 アダプティブ サンプリングは、既定で有効になっています。 サンプリングは、ApplicationInsightsServiceOptions の `EnableAdaptiveSampling` オプションを使用して無効にすることができます。

_よくわからんが、２種類のサンプリングを解除しなきゃいけないのか。。。
固定サンプリングは、サンプリングレートによるもので、今回は割愛しますm(_ _)m_

アダプティブ サンプリングの設定方法は、同じリンクの「ApplicationInsightsServiceOptions を使用する」の項にありました。`EnableAdaptiveSampling` で指定するそうです。
```C#
using Microsoft.ApplicationInsights.WorkerService;

public void ConfigureServices(IServiceCollection services)
{
    var aiOptions = new ApplicationInsightsServiceOptions();
    // Disables adaptive sampling.
    aiOptions.EnableAdaptiveSampling = false;

    // Disables live metrics (also known as QuickPulse).
    aiOptions.EnableQuickPulseMetricStream = false;
    services.AddApplicationInsightsTelemetryWorkerService(aiOptions);
}
```

### c)それでもログが出ない！！
いやー、もうわからん。と、諦めかけていたら
ⅰ) [分離ワーカー プロセスにおける C# Azure Functions の実行のガイド](https://learn.microsoft.com/ja-jp/azure/azure-functions/dotnet-isolated-process-guide)のある項のサンプルコードのコメントにしれっと次の記載がありました。
```c#
// 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
```

appsettings.json だと！host.json じゃなくて？

ⅳ)[ワーカー サービス アプリケーション (非 HTTP アプリケーション) 向け Application Insights - ILogger ログ](https://learn.microsoft.com/ja-jp/azure/azure-monitor/app/worker-service#ilogger-logs)に設定のサンプルがありますが、host.jsonなのかappsettings.jsonなのか記載がありません。

[Azure Functions の監視を構成する方法 - カスタム アプリケーション ログ](https://learn.microsoft.com/ja-jp/azure/azure-functions/configure-monitoring?tabs=v2#custom-application-logs)に以下の記載がありますが、appsettings.json なんて一言も書いてないス。

![Screenshot 2024-08-10 at 16-59-07 Azure Functions の監視を構成する Microsoft Learn.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/649784/327703f1-cf7c-324f-0d3f-58ba82b8e6af.png)

[分離ワーカー モデルで C# Azure Functions を実行するためのガイド － ログ レベルの管理](https://learn.microsoft.com/ja-jp/azure/azure-functions/dotnet-isolated-process-guide?tabs=windows#managing-log-levels)

_インプロセスはプロセス１つだからhostの設定に従い、分離ワーカーは別プロセスだからapplication単位の設定に従う、ということなのでしょうか。_

あー疲れた疲れた。

【リンク】
ⅰ)[分離ワーカー プロセスにおける C# Azure Functions の実行のガイド](https://learn.microsoft.com/ja-jp/azure/azure-functions/dotnet-isolated-process-guide)
ⅱ)[分離ワーカー モデルとインプロセス モデル .NET Azure Functions との違い](https://learn.microsoft.com/ja-jp/azure/azure-functions/dotnet-isolated-in-process-differences)
ⅲ)[.NET アプリをインプロセス モデルから分離ワーカー モデルに移行する](https://learn.microsoft.com/ja-jp/azure/azure-functions/migrate-dotnet-to-isolated-model?tabs=net8)
ⅳ)[ワーカー サービス アプリケーション (非 HTTP アプリケーション) 向け Application Insights](https://learn.microsoft.com/ja-jp/azure/azure-monitor/app/worker-service#configure-the-application-insights-sdk)

（2024年11月に.NET6がサポート終了しますが、そうするとインプロセスも自動的にサポート終了ですかね？ちょっと大変かもしれません。）