You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Azure Function App重复日志问题排查及解决方案咨询

问题: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的日志系统默认会通过两个接收器捕获函数代码输出的日志:

  1. 函数专用日志接收器:将日志写入C:\home\LogFiles\Application\Functions\Function\xxxx目录
  2. 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查看日志目录:

  1. 确认C:\home\LogFiles\Application\Functions\Host目录不再写入函数相关日志
  2. 检查Function App和Application Insights的「日志」视图,确认重复日志消失

内容的提问来源于stack exchange,提问作者Snuffsis

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 19:36:30