如何让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); } }
代码说明
json: true的作用:这个选项会让Winston自动把每条日志序列化为JSON对象,默认会包含timestamp(如果开启了timestamp配置)、level、message这几个核心字段,输出的日志示例如下:{"level":"INFO","message":"操作执行成功","timestamp":"Fri, 15 Nov 2024 12:34:56 GMT"}- 自定义JSON字段(可选):如果需要在JSON里添加业务相关的额外字段,比如业务ID,可以通过
meta参数传入,示例:
此时输出的JSON会包含logger.log('info', msg, { businessId: 'ORDER_12345' });meta字段,里面是你传入的额外数据。 - 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
相关产品推荐
相关产品推荐

