logrotate是Linux系统自带的日志管理工具,可自动化实现Node.js日志的轮转、压缩、删除及权限管理,适用于系统级别的统一日志管控。
多数Linux发行版预装logrotate,未安装时可通过包管理器安装:
sudo apt-get update && sudo apt-get install logrotatesudo yum install logrotate在/etc/logrotate.d/目录下新建配置文件(如nodejs-app),便于集中管理Node.js日志规则:
sudo nano /etc/logrotate.d/nodejs-app 向配置文件中添加以下内容(根据实际需求调整参数):
/path/to/your/nodejs/app.log { daily # 每日轮转(可选:weekly/monthly) rotate 7 # 保留最近7个轮转文件(避免磁盘空间耗尽) compress # 使用gzip压缩旧日志(减少存储占用) delaycompress # 延迟压缩(当前轮转的日志不压缩,下次轮转时再压缩) missingok # 日志文件缺失时不报错(避免因应用未启动导致脚本失败) notifempty # 日志为空时不执行轮转(减少不必要的操作) create 640 root adm # 创建新日志文件,权限640,属主root,属组adm(根据实际用户/组调整) } 关键参数说明:
daily:轮转频率,可根据业务需求改为weekly(每周)或monthly(每月);rotate:保留的日志文件数量,建议设置为7-30天(兼顾历史查询与存储空间);compress与delaycompress:组合使用可平衡压缩效率与日志可读性;create:确保轮转后生成新的日志文件,避免应用因日志文件被删除而无法写入。使用-f参数强制触发轮转(模拟日志达到轮转条件),验证配置是否正确:
sudo logrotate -f /etc/logrotate.d/nodejs-app 若终端无报错信息,说明配置生效。可通过查看日志目录确认文件是否按规则轮转(如app.log→app.log.1,app.log.1.gz)。
logrotate的状态信息存储在/var/lib/logrotate/status中,可通过以下命令查看最近的轮转记录:
sudo tail -f /var/lib/logrotate/status 若需要更精细的日志控制(如按文件大小轮转、自定义日志格式),可使用Node.js日志库(如winston)的内置轮转功能。
以winston+winston-daily-rotate-file为例,安装所需依赖:
npm install winston winston-daily-rotate-file 在应用代码中创建winston日志记录器,配置DailyRotateFile传输(Transport):
const winston = require('winston'); const DailyRotateFile = require('winston-daily-rotate-file'); const logger = winston.createLogger({ level: 'info', format: winston.format.json(), // 日志格式(可选:json/text) transports: [ new DailyRotateFile({ filename: '/path/to/your/nodejs/application-%DATE%.log', // 日志文件名(%DATE%为日期占位符) datePattern: 'YYYY-MM-DD', // 日期格式(如2025-11-03) zippedArchive: true, // 压缩旧日志(.gz格式) maxSize: '20m', // 单个日志文件最大大小(超过则轮转) maxFiles: '14d', // 保留最近14天的日志文件 }), ], }); // 测试日志写入 logger.info('This is a rotated log message.'); 关键参数说明:
filename:日志文件路径,%DATE%会被替换为当前日期(如application-2025-11-03.log);datePattern:日期格式,支持YYYY(年)、MM(月)、DD(日)等占位符;maxSize:单个日志文件的最大大小(支持k/m/g单位),超过则触发轮转;maxFiles:保留的日志文件数量(支持d/h单位),超出则删除最旧的文件。若Node.js应用通过systemd管理(如使用systemctl start myapp),可将日志输出到系统日志(syslog),再通过rsyslog或logrotate管理。
编辑应用的服务文件(如/etc/systemd/system/myapp.service),将日志输出到syslog:
[Service] ExecStart=/usr/bin/node /path/to/your/app.js StandardOutput=syslog StandardError=syslog SyslogIdentifier=myapp # 日志标识(用于rsyslog过滤) Restart=always 创建/etc/rsyslog.d/myapp.conf,添加以下内容(将myapp标识的日志写入单独文件):
if $programname == 'myapp' then /var/log/myapp/app.log & stop 重启rsyslog使配置生效:
sudo systemctl restart rsyslog 按照“一、使用logrotate工具”的步骤,为/var/log/myapp/app.log创建配置文件,实现日志轮转。
以上三种方法覆盖了Linux系统下Node.js日志轮转的主要场景,可根据团队习惯、应用架构选择合适的方式。logrotate适合系统级统一管理,Node.js日志库适合应用级精细化控制,结合systemd的方式则适合容器化或服务化部署的场景。