Node.js日志轮转的实现方式
一 核心原理
二 常用实现方案
三 代码示例
const winston = require('winston');
const DailyRotateFile = require('winston-daily-rotate-file');
const transport = new DailyRotateFile({
filename: 'logs/app-%DATE%.log', // 文件名含日期占位符
datePattern: 'YYYY-MM-DD', // 按天切割
zippedArchive: true, // 旧日志压缩
maxSize: '20m', // 单个文件上限
maxFiles: '14d' // 保留14天
});
const logger = winston.createLogger({
level: 'info',
format: winston.format.json(),
transports: [transport]
});
logger.info('hello, winston rotate');
const winston = require('winston');
const logger = winston.createLogger({
level: 'debug',
transports: [
new winston.transports.File({
filename: 'logs/service.log', // 固定文件名
maxsize: 10 * 1024 * 1024, // 10 MB
maxFiles: 1, // 只保留1个文件
rotationFormat: () => '' // 轮转后不更改文件名,实现覆盖
}),
new winston.transports.Console({ level: 'info' })
],
exitOnError: false
});
/path/to/nodejs/logs/*.log {
daily
rotate 7
compress
missingok
notifempty
create 0644 root root
}
{
"apps": [{
"name": "my-api",
"script": "src/index.js",
"out_file": "./logs/out.log",
"error_file": "./logs/err.log",
"max_size": "20M",
"max_files": "14"
}]
}
docker run -d \
--name my_app \
--log-driver local \
--log-opt max-size=10m \
--log-opt max-file=3 \
my_image
上述示例覆盖了应用内(Winston/Pino/Log4js)、系统级(logrotate)、进程管理(PM2)与容器(Docker)的主流做法。
四 选型与最佳实践