Azure函数context.error日志未传入Application Insights问题排查
Azure函数context.error日志未传入Application Insights的排查与解决
首先明确:context.error理论上应将错误日志推送到Application Insights,但未生效通常是配置或运行时API使用问题,以下是具体排查和解决方向:
1. 确认Application Insights集成配置
- 检查函数应用的配置页面,确保已添加
APPLICATIONINSIGHTS_CONNECTION_STRING(推荐)或APPINSIGHTS_INSTRUMENTATIONKEY,值对应你的Application Insights资源的连接字符串/密钥。 - 确认函数运行时版本:Node.js环境下,Azure Functions Runtime v4+需搭配Application Insights SDK for Node.js v3+,版本不兼容可能导致日志丢失。
2. 修正host.json日志级别配置
确保host.json中已正确设置日志级别,允许Error级日志被采集,示例配置:
{ "logging": { "logLevel": { "default": "Error" }, "applicationInsights": { "samplingSettings": { "isEnabled": true, "excludedTypes": "" // 不要排除Error类型,若之前排除了需清空 } } } }
注意:若采样率设置过低,也可能导致部分错误日志未被采集,可临时将采样率设为100%测试:"samplingPercentage": 100
3. 更换日志API调用方式
在新版Azure Functions Node.js运行时中,官方推荐使用context.log.error()替代context.error(),后者属于旧API,可能存在兼容性问题。修改你的错误处理函数:
// 替换 context.error(error); 为 context.log.error(error);
若错误对象序列化异常,可手动构造可被正确捕获的日志内容:
context.log.error(`错误信息: ${error.message}\n堆栈追踪: ${error.stack}`);
4. 检查是否存在自定义日志过滤
确认未在Application Insights资源中设置自定义日志过滤器,也未在函数应用的日志过滤规则中排除Error级别的日志。
你的错误处理函数代码:
module.exports = function handleError(context, error) { context.error(error); let isInternalError = error.statusCode === 500 || error.code === 500 || typeof error.code !== "number"; let status = isInternalError ? 500 : error.statusCode || error.code || 500; let errorMessage = error.message; let errorsList = []; if (error.name === "ValidationError") { isInternalError = false; status = 400; errorsList = Object.keys(error.errors).map(key => error.errors[key].message); errorMessage = "Validation Error"; } return { status, jsonBody: { errorMessage: isInternalError ? 'Internal Server Error' : errorMessage, errorsList, errorStack: process.env.ENVIRONMENT !== "prod" ? error.stack : undefined } }; }
内容的提问来源于stack exchange,提问作者Rafael Grilli
相关产品推荐
相关产品推荐

