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

Azure Function Info日志正常但Error日志未输出问题排查

问题根因

两个独立问题共同导致了你观察到的异常现象:

  • 日志组件与运行时版本不匹配:你的host.json声明运行时版本为2.0,对应Azure Functions v2+运行时,但代码中注入的TraceWriter是v1运行时专属的遗留日志组件。v2+运行时基于ILogger重构了完整的日志管道,仅对TraceWriter做了有限的向下兼容:Info级别的低优先级日志可以被旁路捕获,但Error级别的高优先级日志会被兼容层直接丢弃,不会写入任何日志存储。
  • 异常被业务代码吞掉:你在catch块捕获异常后仅做了日志记录操作,没有将异常向外抛出,函数运行时全程没有感知到未处理的异常,因此会默认将本次执行标记为成功状态。
修复步骤
  1. 替换日志组件为v2+原生实现
    首先引入Microsoft.Extensions.Logging命名空间,将函数参数中的TraceWriter替换为ILogger,同时把对应的日志调用方法替换为ILogger的标准方法,修改后的完整代码如下:
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Host;
using Microsoft.Extensions.Logging;
using System;
using System.Data.SqlClient;
using System.Threading.Tasks;

namespace DatabaseCleanup
{
    public static class DataCleanup
    {
        [FunctionName("DataCleanup")]
        public static async Task Run([TimerTrigger("0 */5 * * * *")] TimerInfo myTimer, ILogger log)
        {
            try
            {
                log.LogInformation($"Data cleanup started: {DateTime.Now}");
                // 业务逻辑
                log.LogInformation($"Data cleanup ended: {DateTime.Now}");
                throw new Exception("test error");
            }
            catch (Exception ex)
            {
                log.LogError(ex, "Error thrown");
                // *如果需要让运行时感知异常、将本次执行标记为失败,请保留下面的抛出语句;如果业务上允许捕获异常后正常结束,可以删除该行*
                throw;
            }
        }
    }
}
  1. 无需调整现有host.json配置
    你当前的host.json中日志级别配置符合要求:Function类别设置为Trace级别,允许捕获所有层级的函数业务日志,fileLoggingMode设置为always也会保证文件日志持续写入,不需要额外修改。
验证效果

重新部署修改后的代码,手动触发一次函数执行:

  • 无论是否选择重新抛出异常,catch块中写入的Error级别日志都可以在Kudu日志、Application Insights等所有日志通道中正常查询到
  • 如果保留了throw;语句,函数执行状态会正确标记为Failed,异常详情会同步展示在执行记录中

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 18:48:41