.NET 8隔离进程Azure Functions自定义日志无法在Application Insights中显示
我之前在做.NET 8隔离模式的Azure Function时,也碰到过一模一样的问题——本地调试终端里日志打印得好好的,但Azure门户的Application Insights就是捞不到记录,折腾了好一阵才搞定。结合你的描述和代码,给你几个实用的排查方向,应该能解决:
1. 先确认NuGet包是否装对了
隔离模式的Function和传统的in-process模式不一样,需要专门的Application Insights支持包。你得确保项目里已经安装了Microsoft.Azure.Functions.Worker.ApplicationInsights,如果没装,直接用NuGet包管理器或者命令行安装:
Install-Package Microsoft.Azure.Functions.Worker.ApplicationInsights
另外也顺手把Microsoft.Azure.Functions.Worker和Microsoft.Azure.Functions.Worker.Sdk更到最新版本,避免版本不兼容的问题。
2. 检查Program.cs的服务配置有没有遗漏
隔离模式下必须手动把Application Insights的遥测服务加进去,不然日志根本不会往AI那边发。你的Program.cs里应该要有这两行关键配置:
var host = new HostBuilder() .ConfigureFunctionsWorkerDefaults() .ConfigureServices(services => { // 添加AI遥测服务 services.AddApplicationInsightsTelemetryWorkerService(); // 配置Function专属的AI设置 services.ConfigureFunctionsApplicationInsights(); }) .Build(); host.Run();
要是缺了这俩,就算配置了密钥也白搭。
3. 修正host.json的日志配置细节
你说已经调整过host.json,但可能配置的姿势不对。针对隔离模式,正确的日志配置得明确给Application Insights设置日志级别,尤其是你用到了LogTrace,默认Trace级别的日志是不会被AI捕获的。给你个参考配置:
{ "version": "2.0", "logging": { "applicationInsights": { "samplingSettings": { "isEnabled": true, "excludedTypes": "Request" }, // 给你的函数类单独设置Trace级别 "logLevel": { "Company.Function.TestFunctionPOC": "Trace" } }, "logLevel": { "Default": "Information", "Microsoft": "Warning", "Microsoft.Hosting.Lifetime": "Information" } } }
如果测试的时候还是看不到,暂时可以把samplingSettings.isEnabled设为false(生产环境再开采样),避免采样过滤掉日志。
4. 再核对local.settings.json的配置
除了APPINSIGHTS_INSTRUMENTATIONKEY,一定要确保FUNCTIONS_WORKER_RUNTIME是dotnet-isolated,不然函数会默认用in-process模式运行,所有隔离模式的配置都不生效:
{ "IsEncrypted": false, "Values": { "AzureWebJobsStorage": "UseDevelopmentStorage=true", "FUNCTIONS_WORKER_RUNTIME": "dotnet-isolated", "APPINSIGHTS_INSTRUMENTATIONKEY": "你的仪表密钥" } }
5. 本地调试的小细节
本地调试时,AI的日志有时候会有几分钟的延迟,别刚跑就去查,等个3-5分钟再去门户看,或者用AI的「实时指标」面板,能更快看到日志是否进来。另外也要注意,本地的代理或者防火墙会不会阻止了日志的发送,暂时关掉试试。
你的函数代码本身是没问题的,再贴出来方便你核对:
using Microsoft.ApplicationInsights.Channel; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Microsoft.Azure.Functions.Worker; using Microsoft.Extensions.Logging; namespace Company.Function public class TestFunctionPOC { private readonly ILogger<TestFunctionPOC> _logger; public TestFunctionPOC(ILogger<TestFunctionPOC> logger) { _logger = logger; } [Function("TestFunctionPOC")] public IActionResult Run([HttpTrigger(AuthorizationLevel.Anonymous, "get")] HttpRequest req) { _logger.LogInformation("C# HTTP trigger function processed a request."); _logger.LogWarning("## this is a sample warning ##"); _logger.LogTrace("## This is a sample Trace #$#"); return new OkObjectResult("Welcome to Azure Functions!"); } } }
你提供的本地调试日志截图:
备注:内容来源于stack exchange,提问作者tecs-x

