环企首页
winston
概述
winston 是 Node.js 中功能最全的日志库,支持多目标输出(控制台/文件/数据库/远程服务),日志格式化灵活。相比 pino 更重量但功能更丰富,适合需要复杂日志路由的场景。
核心特点:
- 多传输(transport)支持:控制台、文件、HTTP、Syslog 等
- 细粒度日志分级
- 强大的格式化能力
- 日志轮转(与
winston-daily-rotate-file配合)
安装:
npm install winston
核心函数
winston.createLogger(options)
创建 logger 实例。
const winston = require('winston')
const logger = winston.createLogger({
level: 'info', // 最低记录级别
format: winston.format.combine(
winston.format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }),
winston.format.errors({ stack: true }),
winston.format.json()
),
transports: [
// 控制台输出
new winston.transports.Console({
format: winston.format.combine(
winston.format.colorize(),
winston.format.printf(({ level, message, timestamp, ...meta }) => {
return `${timestamp} [${level}]: ${message} ${Object.keys(meta).length ? JSON.stringify(meta) : ''}`
})
)
})
]
})
logger.info('服务启动')
logger.error('错误', { error: 'something wrong', code: 500 })
日志级别方法
logger.silly('调试信息') // 0,最详细
logger.debug('调试信息') // 1
logger.verbose('详细信息') // 2
logger.info('一般信息') // 3(默认级别)
logger.http('HTTP 请求') // 4
logger.warn('警告') // 5
logger.error('错误') // 6
logger.emerg('系统崩溃') // 7
输出到文件
const logger = winston.createLogger({
level: 'info',
format: winston.format.json(),
transports: [
// 所有日志
new winston.transports.File({
filename: 'logs/combined.log',
maxsize: 5242880, // 5MB 分割
maxFiles: 5, // 保留 5 个文件
tailable: true // 始终写入最新文件
}),
// 仅错误
new winston.transports.File({
filename: 'logs/error.log',
level: 'error' // 只记录 error 及以上
})
]
})
格式化
// JSON 格式(生产)
format: winston.format.combine(
winston.format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }),
winston.format.errors({ stack: true }),
winston.format.json()
)
// 人类可读格式(开发)
format: winston.format.combine(
winston.format.timestamp(),
winston.format.colorize(),
winston.format.printf(({ level, message, timestamp, ...meta }) => {
const metaStr = Object.keys(meta).length ? JSON.stringify(meta, null, 2) : ''
return `${timestamp} ${level}: ${message} ${metaStr}`
})
)
// 自定义格式
winston.format.combine(
winston.format.timestamp(),
winston.format.printf(({ timestamp, level, message }) => {
return `[${timestamp}] ${level.toUpperCase()}: ${message}`
})
)
日志轮转(winston-daily-rotate-file)
npm install winston-daily-rotate-file
const DailyRotateFile = require('winston-daily-rotate-file')
const logger = winston.createLogger({
transports: [
new DailyRotateFile({
filename: 'logs/app-%DATE%.log',
datePattern: 'YYYY-MM-DD',
zippedArchive: true, // 自动压缩旧日志
maxSize: '20m',
maxFiles: '14d' // 保留 14 天
})
]
})
常见问题
| 问题 | 解决方案 |
|---|---|
| 生产日志太大 | 用 DailyRotateFile 或 logrotate 系统工具 |
| 想同时输出到控制台和文件 | 在 transports 数组中加多个 transport |
| 想在日志中加自定义字段 | logger.info('msg', { userId: 123, action: 'login' }) |
| 异步日志丢失 | 用 winston.createLogger + transports 数组,它会自动管理 |