Azure Function Info日志正常但Error日志未输出问题排查
问题根因
两个独立问题共同导致了你观察到的异常现象:
- 日志组件与运行时版本不匹配:你的
host.json声明运行时版本为2.0,对应Azure Functions v2+运行时,但代码中注入的TraceWriter是v1运行时专属的遗留日志组件。v2+运行时基于ILogger重构了完整的日志管道,仅对TraceWriter做了有限的向下兼容:Info级别的低优先级日志可以被旁路捕获,但Error级别的高优先级日志会被兼容层直接丢弃,不会写入任何日志存储。 - 异常被业务代码吞掉:你在catch块捕获异常后仅做了日志记录操作,没有将异常向外抛出,函数运行时全程没有感知到未处理的异常,因此会默认将本次执行标记为成功状态。
修复步骤
- 替换日志组件为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; } } } }
- 无需调整现有host.json配置
你当前的host.json中日志级别配置符合要求:Function类别设置为Trace级别,允许捕获所有层级的函数业务日志,fileLoggingMode设置为always也会保证文件日志持续写入,不需要额外修改。
验证效果
重新部署修改后的代码,手动触发一次函数执行:
- 无论是否选择重新抛出异常,catch块中写入的Error级别日志都可以在Kudu日志、Application Insights等所有日志通道中正常查询到
- 如果保留了
throw;语句,函数执行状态会正确标记为Failed,异常详情会同步展示在执行记录中
内容的提问来源于stack exchange,提问作者Matt W
相关产品推荐
相关产品推荐

