如何使用Winston库在Node.js中将日志以JSON格式保存到本地并附示例
使用Winston在Node.js中保存JSON格式日志到本地
1. 安装Winston
先安装依赖包:
npm install winston # 或者用yarn yarn add winston
2. 核心实现代码
下面是完整的示例,创建Winston Logger实例,将日志以JSON格式写入本地文件:
const winston = require('winston'); // 创建Logger实例 const logger = winston.createLogger({ // 日志级别:控制哪些级别的日志会被记录,默认从info开始 level: 'info', // 组合日志格式:添加时间戳+输出JSON格式 format: winston.format.combine( winston.format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }), winston.format.json() ), // 配置日志传输方式(本地文件) transports: [ new winston.transports.File({ // 日志文件路径及名称 filename: 'logs/app.log', // 自动创建日志目录(如果不存在) createDir: true, // 单个日志文件最大容量(5MB),超过自动切割 maxsize: 5242880, // 最多保留5个旧日志文件 maxFiles: 5 }) ] }); // 开发环境下,同时在控制台输出日志(方便调试) if (process.env.NODE_ENV !== 'production') { logger.add(new winston.transports.Console({ format: winston.format.simple() })); } // 示例:记录不同级别的日志 logger.info('用户登录成功', { userId: 123, username: 'john_doe' }); logger.error('数据库连接失败', { error: 'Connection refused', retryCount: 3 }); logger.warn('磁盘空间不足', { freeSpace: '10%' });
3. 关键配置说明
winston.format.json():核心配置,确保每条日志以独立JSON对象输出,方便后续解析。timestamp:可选但推荐,给日志添加时间戳,便于问题排查时定位时间点。transports.File:filename:指定日志文件路径,建议放在专门的logs目录下,配合createDir: true自动创建目录。maxsize/maxFiles:实现日志切割,避免单个文件过大,自动保留指定数量的历史日志。
- 日志级别:Winston默认级别从低到高为
debug、info、warn、error、fatal,通过level参数可过滤日志。
4. 自定义JSON格式(可选)
如果需要在日志中添加固定业务字段(如服务名、环境),可以自定义格式:
const customJsonFormat = winston.format.combine( winston.format.timestamp(), winston.format.printf(({ timestamp, level, message, ...meta }) => { return JSON.stringify({ service: 'user-center', env: process.env.NODE_ENV || 'dev', timestamp, level, message, ...meta }); }) ); // 在logger中使用自定义格式 const logger = winston.createLogger({ level: 'info', format: customJsonFormat, transports: [new winston.transports.File({ filename: 'logs/app.log' })] });
内容的提问来源于stack exchange,提问作者Franken
相关产品推荐
相关产品推荐

