您的位置:首页 >Node.js日志轮转是如何实现的
发布于2026-05-02 阅读(0)
扫一扫,手机访问

日志轮转这事儿,听起来复杂,其实拆解开来,核心就是围绕几个关键动作展开的。咱们先来捋一捋。
application-2025-09-01.log。好处是什么?一目了然,无论是人工检索还是自动化归档,都方便得很。.gz 格式,能省下大量磁盘空间,历史日志的查询效率也不会受太大影响。logrotate 这样的工具,从外部定时执行;三是在容器环境下,可以直接通过 Docker 的日志驱动来限制单个容器日志的大小和数量,由容器运行时来管理。了解了原理,接下来看看市面上有哪些成熟的“工具”可供选择。大致可以分为三类:
pino-rotate 这类插件,同样可以实现按时间或大小的轮转需求。max_size、max_files。这属于“零代码侵入”式的方案,改改配置就能上线,非常便捷。local 日志驱动,并通过 max-size 和 max-file 参数来限制单个日志文件的大小和数量。日志的轮转和管理工作,完全交给了容器运行时。理论说再多,不如看代码来得实在。下面这几个例子,覆盖了从应用内到系统运维的主流场景。
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)的主流做法,基本能应对大多数开发运维场景。
方案这么多,到底该怎么选?最后这部分,咱们聊聊选型思路和一些实践中总结出来的经验。
logrotate 这类系统级工具是你的好朋友。它能在应用无感知的情况下完成工作,适合标准化运维环境。tail查看,文件输出则用于长期的集中采集和分析。下一篇:ThinkPHP安全性怎样保障
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
9