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

Azure Application Insights SDK未采集Winston日志问题求助

解决Application Insights无法自动采集Winston日志的问题

问题背景

开发了一款用于将应用日志存储到Azure Monitor的通用npm日志库,依赖applicationinsights SDK与winston。消费项目中配置正确连接字符串后,Application Insights已成功初始化,但Winston生成的日志未被AI自动采集。

问题原因

Application Insights的setAutoCollectConsole(true, true)配置仅针对原生console方法生效,无法自动捕获Winston的日志输出。Winston作为独立的日志框架,需要手动集成才能将日志推送到Application Insights。

解决方案

方案一:使用官方Winston传输器

  1. 安装依赖
npm install applicationinsights-winston-transport
  1. 修改logger.ts,添加AI传输器
import winston from "winston";
import { ApplicationInsightsTransport } from "applicationinsights-winston-transport";
import appInsights from "applicationinsights";

// 依赖index.ts中先初始化的Application Insights客户端
const logger = winston.createLogger({
  level: "info",
  format: winston.format.json(),
  transports: [
    new winston.transports.Console(),
    // 添加Application Insights传输器
    new ApplicationInsightsTransport({
      client: appInsights.defaultClient,
      level: "info" // 可指定需同步到AI的最低日志级别
    })
  ]
});

export const debug = logger.debug.bind(logger);
export const info = logger.info.bind(logger);
export const warn = logger.warn.bind(logger);
export const error = logger.error.bind(logger);

export default logger;

方案二:自定义Winston传输器(无需额外插件)

如果不想引入第三方传输器插件,可以手动实现自定义传输器:

import winston from "winston";
import appInsights from "applicationinsights";

const aiClient = appInsights.defaultClient;

// 自定义Application Insights传输器
class AiTransport extends winston.Transport {
  constructor(opts = {}) {
    super(opts);
  }

  log(info, callback) {
    setImmediate(() => this.emit("logged", info));

    // 根据Winston日志级别映射到AI的跟踪级别
    switch (info.level) {
      case "error":
        aiClient.trackException({ 
          exception: new Error(info.message), 
          properties: { ...info, level: info.level } 
        });
        break;
      case "warn":
        aiClient.trackTrace({ 
          message: info.message, 
          severity: appInsights.Contracts.SeverityLevel.Warning, 
          properties: { ...info, level: info.level } 
        });
        break;
      case "info":
        aiClient.trackTrace({ 
          message: info.message, 
          severity: appInsights.Contracts.SeverityLevel.Information, 
          properties: { ...info, level: info.level } 
        });
        break;
      case "debug":
        aiClient.trackTrace({ 
          message: info.message, 
          severity: appInsights.Contracts.SeverityLevel.Verbose, 
          properties: { ...info, level: info.level } 
        });
        break;
      default:
        aiClient.trackTrace({ 
          message: info.message, 
          properties: { ...info, level: info.level } 
        });
    }

    callback();
  }
}

const logger = winston.createLogger({
  level: "info",
  format: winston.format.json(),
  transports: [
    new winston.transports.Console(),
    new AiTransport()
  ]
});

export const debug = logger.debug.bind(logger);
export const info = logger.info.bind(logger);
export const warn = logger.warn.bind(logger);
export const error = logger.error.bind(logger);

export default logger;

注意事项

  • 确保Application Insights在Winston实例创建前完成初始化:当前index.ts先导出azure-appinsights再导出logger的顺序是正确的,消费项目中需避免提前导入Winston而跳过AI初始化步骤。
  • 日志级别映射需保持一致,避免出现日志级别不匹配导致的采集遗漏。
  • 使用官方传输器时,需注意applicationinsights与applicationinsights-winston-transport的版本兼容性。

内容的提问来源于stack exchange,提问作者Muhammad Faraz Ali

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 04:12:03