Azure Function App重复日志问题排查及解决方案咨询
我在Function App和Application Insights的「监控」板块「日志」视图中出现了重复日志条目,但作为这两个资源日志接收目标的Log Analytics中日志只显示一次。
通过Kudu查看日志文件时,C:\home\LogFiles\Application\Functions\Function\xxxx目录下只有1条日志,但相同内容同时被写入到C:\home\LogFiles\Application\Functions\Host目录的日志文件中。
请问这是不是重复日志的原因?如果是,该怎么阻止重复日志?
当前Host.json配置
{ "version": "2.0", "logging": { "logLevel": { "default": "Information", "Function": "Trace", "Host.Aggregator": "Critical", "Host.Results": "Error" }, "applicationInsights": { "samplingSettings": { "isEnabled": true, "maxTelemetryItemsPerSecond": 20, "excludedTypes": "Exception" } } } }
我试过修改日志级别和类别,但没解决问题。最初按微软官方文档配置时运行正常,最近突然出现重复日志。
Function App代码片段
[FunctionName("Program")] public static async Task<IActionResult> Run( [HttpTrigger(AuthorizationLevel.Anonymous, "post", Route = null)] HttpRequest req, ILogger log) { string request = await new StreamReader(req.Body).ReadToEndAsync(); log.LogInformation($"Webhook Recieved: {request}"); // Environment Variables var xxxContext = Environment.GetEnvironmentVariable("xxx", EnvironmentVariableTarget.Process); var xxxToken = Environment.GetEnvironmentVariable("xxx", EnvironmentVariableTarget.Process); var yyyKey = Environment.GetEnvironmentVariable("yyy", EnvironmentVariableTarget.Process); var yyySecret = Environment.GetEnvironmentVariable("yyy", EnvironmentVariableTarget.Process); // API Clients var xxxClient = new xxxNet(Convert.ToInt32(xxxContext), xxxToken); var yyyClient = new yyyClient(yyyKey, yyySecret, "...."); // Main function var body = JsonSerializer.Deserialize<List<Webhook>>(request); var response = ""; foreach (var item in body) { if (item.Status != "Completed") continue; var uriSplit = item.ResourceUri.Split('/'); var salesOrderNr = uriSplit[^1]; var orderType = uriSplit[^2]; try { var salesOrder = await xxxClient.SalesOrder.Get(salesOrderNr, orderType); var bodyparms = new { status = "completed" }; var success = await yyyClient.Order.Update(salesOrder.customerOrder, bodyparms); } catch (Exception ex) { log.LogError(ex, "Exception when trying to process webhook"); response = string.Format("exception when trying to process webhook: {0}", ex.Message); } } return string.IsNullOrEmpty(response) ? new OkObjectResult("Weborder has been updated") : new BadRequestObjectResult(response); }
现象说明
- Function App「日志」视图显示重复日志条目
- Log Analytics「日志」视图仅显示单条日志
问题原因分析
你观察到的日志同时写入函数目录和Host目录的现象,正是导致Function App和Application Insights中日志重复的直接原因。
Azure Functions的日志系统默认会通过两个接收器捕获函数代码输出的日志:
- 函数专用日志接收器:将日志写入
C:\home\LogFiles\Application\Functions\Function\xxxx目录 - Host全局日志接收器:将所有函数的日志汇总写入
C:\home\LogFiles\Application\Functions\Host目录
Function App的「日志」视图会同时读取这两个目录的日志内容,因此出现重复显示;Application Insights会同时采集这两个来源的日志并上报,也会产生重复条目。而Log Analytics在接收时会基于日志唯一标识符自动去重,所以只显示一次。
解决方案
方案1:调整Host日志级别,过滤函数日志
修改logging.logLevel配置,关闭Host全局日志接收器对函数日志的捕获:
{ "version": "2.0", "logging": { "logLevel": { "default": "Information", "Function": "Trace", "Host.Aggregator": "Critical", "Host.Results": "Error", "Host": "None" // 关闭Host全局日志的非必要输出 }, "applicationInsights": { "samplingSettings": { "isEnabled": true, "maxTelemetryItemsPerSecond": 20, "excludedTypes": "Exception" } } } }
方案2:精细配置日志接收器过滤规则
如果需要保留Host关键日志但排除函数日志,添加logging.loggers配置:
{ "version": "2.0", "logging": { "logLevel": { "default": "Information", "Function": "Trace", "Host.Aggregator": "Critical", "Host.Results": "Error" }, "loggers": { "HostLogger": { "categoryFilter": { "exclude": [ "Function" ] // 排除Function类别的日志被Host接收器捕获 } } }, "applicationInsights": { "samplingSettings": { "isEnabled": true, "maxTelemetryItemsPerSecond": 20, "excludedTypes": "Exception" } } } }
方案3:禁用Host文件日志接收器
如果不需要Host目录的日志文件,可以直接禁用该接收器:
{ "version": "2.0", "logging": { "logLevel": { "default": "Information", "Function": "Trace", "Host.Aggregator": "Critical", "Host.Results": "Error" }, "fileLoggingMode": "never", // 完全禁用文件日志,或设为"debugOnly"仅调试模式启用 "applicationInsights": { "samplingSettings": { "isEnabled": true, "maxTelemetryItemsPerSecond": 20, "excludedTypes": "Exception" } } } }
验证方法
修改配置后重启Function App,通过Kudu查看日志目录:
- 确认
C:\home\LogFiles\Application\Functions\Host目录不再写入函数相关日志 - 检查Function App和Application Insights的「日志」视图,确认重复日志消失
内容的提问来源于stack exchange,提问作者Snuffsis

