如何将Azure App Service的Node.js应用stdout、stderr日志存入Azure Blob Storage
Node.js应用stdout/stderr输出同步到Azure Blob Storage的可行方案
无需修改代码的原生配置方案
你之前看到的仅支持.NET的是App Service专属的「应用程序日志(Blob)」功能,诊断设置中全语言通用的AppServiceConsoleLogs采集项支持捕获所有语言的stdout/stderr输出,直接存入Blob存储且不会12小时自动失效,配置要点如下:
- 进入App Service资源的「诊断设置」页面
- 点击「添加诊断设置」
- 日志类别勾选 App Service控制台日志(对应stdout/stderr的全部输出)
- 目标详情选择「存档到存储帐户」,指定目标Blob存储账户与存储容器
- 保存配置后最长15分钟生效,日志会按小时分片写入指定Blob容器
代码侧集成方案
如果需要自定义日志格式、分级存储、批量上报等能力,可通过Node.js生态的日志库搭配Azure Blob传输插件实现:
方案1:基于winston实现
使用主流日志库winston搭配winston-azure-blob-transport传输器,示例代码如下:
const winston = require('winston'); const { AzureBlobTransport } = require('winston-azure-blob-transport'); const logger = winston.createLogger({ level: 'info', format: winston.format.json(), transports: [ new AzureBlobTransport({ accountName: "你的存储账户名称", accountKey: "你的存储账户访问密钥", containerName: "日志存储容器名称", blobName: () => `app-logs/${new Date().toISOString().split('T')[0]}/${Date.now()}.log` }) ] }); // 可选:拦截全局console输出,所有console.log/console.error都会自动写入Blob console.log = (...args) => logger.info(args.join(' ')); console.error = (...args) => logger.error(args.join(' '));
方案2:基于pino实现
高性能日志库pino可搭配pino-azure-blob传输插件实现低开销的日志上报,示例代码如下:
const pino = require('pino'); const transport = pino.transport({ target: 'pino-azure-blob', options: { connectionString: "你的Blob存储连接字符串", container: "日志存储容器名称", blockSize: 1024 * 1024, // 日志累积到1MB时触发写入 flushIntervalMs: 10000 // 每10秒强制刷写一次日志 } }); const logger = pino(transport);
内容的提问来源于stack exchange,提问作者Druudik
相关产品推荐
相关产品推荐

