Debian下Node.js日志清理方法
导读:Debian下Node.js日志清理与轮转实用指南 一 常用方案总览 系统级 logrotate:适合所有部署方式,稳定可靠,支持按大小/时间轮转、压缩、保留份数、按周期执行等。 PM2 内置日志管理:若使用 PM2 部署,可直接用 pm...
Debian下Node.js日志清理与轮转实用指南
一 常用方案总览
- 系统级 logrotate:适合所有部署方式,稳定可靠,支持按大小/时间轮转、压缩、保留份数、按周期执行等。
- PM2 内置日志管理:若使用 PM2 部署,可直接用 pm2-logrotate 插件,配置简单、与进程联动好。
- 应用内日志库轮转:在代码里用 winston-daily-rotate-file、pino-rotate 等实现按天/按大小切分与保留策略。
- 定时清理脚本 + cron:轻量方案,用 find … -mtime +N 删除过期日志,适合简单场景或作为兜底策略。
二 系统级 logrotate 配置
- 安装与准备
- 大多数 Debian 已预装 logrotate;如未安装:
sudo apt-get update & & sudo apt-get install -y logrotate - 确认日志路径,例如:/var/www/myapp/logs/*.log
- 大多数 Debian 已预装 logrotate;如未安装:
- 创建配置文件
- 新建:sudo nano /etc/logrotate.d/nodejs
- 示例(按天轮转、保留 7 天、压缩、延迟压缩、空文件不轮转、自动创建新文件):
/var/www/myapp/logs/*.log { daily missingok rotate 7 compress delaycompress notifempty create 0640 www-data www-data postrotate # 可选:通知应用重新打开日志(如 PM2 可用 pm2 reload logs) # pm2 reload logs > /dev/null 2> & 1 || true endscript }
- 调试与生效
- 语法/执行计划检查:
sudo logrotate -d /etc/logrotate.d/nodejs - 强制执行一次:
sudo logrotate -f /etc/logrotate.d/nodejs
- 语法/执行计划检查:
- 说明
- 轮转通常由 cron 每日任务触发(系统自带),无需额外常驻进程。
- 若应用不具备“重新打开日志文件”的能力,避免在轮转时删除或移动正在写入的 .log,以免短暂丢日志。
三 使用 PM2 管理时的日志策略
- 安装插件
pm2 install pm2-logrotate
- 常用配置(通过 pm2 set 调整)
- 保留 7 天:
pm2 set pm2-logrotate:max_days 7 - 开启压缩:
pm2 set pm2-logrotate:compress true - 每天轮转:
pm2 set pm2-logrotate:rotateInterval '0 0 * * *'
- 保留 7 天:
- 查看与验证
- 查看日志:
pm2 logs my-app - 日志默认目录:~/.pm2/logs/(按配置也可自定义到项目目录)
- 查看日志:
- 适用场景
- PM2 部署时优先使用,配置简单、与进程生命周期联动良好。
四 应用内日志库轮转示例
- winston + dailyRotateFile(按天或按大小切分)
- 安装:
npm i winston winston-daily-rotate-file - 示例:
const winston = require('winston'); const { DailyRotateFile } = require('winston-daily-rotate-file'); const transport = new DailyRotateFile({ filename: '/var/www/myapp/logs/app-%DATE%.log', datePattern: 'YYYY-MM-DD', zippedArchive: true, maxSize: '20m', maxFiles: '14d' } ); const logger = winston.createLogger({ level: 'info', transports: [transport] } );
- 安装:
- pino + pino-rotate(按天切分)
- 安装:
npm i pino pino-rotate - 示例:
const pino = require('pino'); const rotate = require('pino-rotate'); rotate({ period: '1d', path: '/var/www/myapp/logs', maxFiles: 7, gzip: true } );
- 安装:
- 适用场景
- 需要与应用逻辑深度耦合的切分策略(如多实例、容器化、无系统级权限时)。
五 兜底方案与运维建议
- 定时清理脚本 + cron
- 示例(删除 7 天前的 .log 文件):
0 0 * * * find /var/www/myapp/logs -type f -name "*.log" -mtime +7 -exec rm -f { } \;
- 建议先试运行并观察日志目录变化,再投入生产。
- 示例(删除 7 天前的 .log 文件):
- 安全与权限
- 日志目录与文件建议属主为运行用户(如 www-data),权限如 0640,避免被未授权写入或误删。
- 避免误删正在写入的日志
- 不要直接
rm app.log后重建;使用 logrotate 的create或让应用支持重新打开日志(如发送信号或重载)。
- 不要直接
- 监控与告警
- 监控日志目录磁盘使用率,设置阈值告警,防止磁盘被占满导致服务异常。
声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!
若转载请注明出处: Debian下Node.js日志清理方法
本文地址: https://pptw.com/jishu/786949.html
