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

如何让Winston输出JSON而非格式化字符串?附现有实现代码

让Winston输出JSON格式日志的解决方案

嘿,这个需求其实很容易实现!Winston本身就内置了JSON格式的支持,不用自己写复杂的格式化函数,咱们来一步步改你的代码:

核心修改点

你的原代码用了自定义formatter来输出字符串格式,要换成JSON的话,只需要做这两个关键调整:

  • 移除自定义的formatter函数
  • 在File transport的配置里添加json: true选项

修改后的完整代码

function logger(success, msg) {
  let logger = new (winston.Logger)({
    transports: [
      new (winston.transports.File)({
        filename: 'log.log',
        timestamp: function() {
          return new Date().toUTCString();
        },
        // 开启JSON格式输出
        json: true,
        // 可选:让日志级别显示为大写
        level: function(level) {
          return level.toUpperCase();
        }
      })
    ]
  });

  if (success) {
    logger.log('info', msg);
  } else {
    // 补全错误日志输出逻辑
    logger.log('error', msg);
  }
}

代码说明

  1. json: true的作用:这个选项会让Winston自动把每条日志序列化为JSON对象,默认会包含timestamp(如果开启了timestamp配置)、level、message这几个核心字段,输出的日志示例如下:
    {"level":"INFO","message":"操作执行成功","timestamp":"Fri, 15 Nov 2024 12:34:56 GMT"}
    
  2. 自定义JSON字段(可选):如果需要在JSON里添加业务相关的额外字段,比如业务ID,可以通过meta参数传入,示例:
    logger.log('info', msg, { businessId: 'ORDER_12345' });
    
    此时输出的JSON会包含meta字段,里面是你传入的额外数据。
  3. Winston版本兼容提示:你的代码看起来是Winston v1/v2的写法,如果是v3版本,API会有一些变化,比如用winston.createLogger,格式化用winston.format.json(),这里给个v3的参考示例:
    const logger = winston.createLogger({
      transports: [
        new winston.transports.File({
          filename: 'log.log',
          format: winston.format.combine(
            winston.format.timestamp({ format: 'UTC' }),
            winston.format.json()
          )
        })
      ]
    });
    

这样改完之后,你的日志文件里就会全是标准的JSON格式日志,方便后续用日志解析工具处理啦~

内容的提问来源于stack exchange,提问作者Mauricio Machado

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:06:36