Debian系统JS日志清理策略
小樊
36
2025-12-24 06:10:48
Debian系统JS日志清理策略
一 策略总览与适用场景
- 建议采用“应用内轮转 + 系统级 logrotate + 定时清理 + 日志级别治理”的组合,既保证安全可回滚,又避免磁盘被日志撑爆。
- 常见日志位置与来源:
- Node.js 应用常写入应用目录的 logs/ 或 /var/log/yourapp/;
- 通过 console.log 输出且由 systemd 管理的服务,日志进入 journald;
- 使用 winston/morgan/pino 等库时,可在库内配置按大小或数量轮转。
- 目标:控制单文件大小、保留周期、压缩归档、降低噪声、可观测与可回滚。
二 推荐方案 优先级从高到低
-
应用内轮转(首选)
- 在 Node.js 使用日志库自带的轮转能力,避免外部删文件导致句柄泄漏或写入失败。
- 示例(winston,按大小与数量):
- const winston = require(‘winston’);
const { createLogger, format, transports } = winston;
const logger = createLogger({
level: ‘info’,
transports: [
new transports.File({
filename: ‘/var/log/yourapp/app.log’,
maxsize: 10 * 1024 * 1024, // 10 MB
maxFiles: 7
})
]
});
- 适用:容器、PM2、systemd 服务均可用;变更即生效,无需系统介入。
-
系统级 logrotate(强烈建议)
- 为应用日志创建配置 /etc/logrotate.d/yourapp:
- /var/log/yourapp/*.log {
daily
rotate 7
compress
delaycompress
missingok
notifempty
create 640 root adm
copytruncate
}
- 关键指令说明:
- daily/rotate 7/compress:按天轮转、保留 7 份、压缩旧日志;
- missingok/notifempty:文件缺失或为空不报错;
- create 640 root adm:轮转后重建文件并设定权限属主;
- copytruncate:复制后截断原文件,避免应用持有已删除文件的句柄(若应用支持“重新打开日志”,可改用 postrotate 执行 kill -USR1)。
- 调试与执行:
- 干跑检查:sudo logrotate -d /etc/logrotate.conf
- 强制执行:sudo logrotate -f /etc/logrotate.d/yourapp
- 适用:所有写入文件的 Node.js/前端构建日志;与 systemd 服务配合良好。
-
定时清理旧文件(兜底)
- 清理 7 天前的 .log 文件(路径按实际调整):
- 0 2 * * * find /var/log/yourapp -type f -name “*.log” -mtime +7 -delete
- 若需先备份再清理,可改为 -exec mv {} /backup/logs/ ; 再定期清理备份目录。
- 适用:历史归档清理、跨应用统一清理脚本。
-
降低日志产出(治本)
- 调整日志级别:生产环境将 winston/morgan/pino 设为 warn/error;
- 条件日志:仅在 development 输出 debug;
- 异步高性能日志:使用 pino 等异步库减少 I/O 阻塞;
- 若经 rsyslog 写入,可在 /etc/rsyslog.conf 或 /etc/rsyslog.d/ 中按程序名分流并设置相应级别与轮转策略。
- 适用:从源头减少日志量,配合轮转效果最佳。
三 不同运行环境的配置要点
- PM2 管理的 Node.js
- 在 ecosystem.config.js 中启用 logrotate(pm2-logrotate 插件)或采用应用内轮转;
- 若用 systemd 托管 PM2,仍建议为日志目录配置 logrotate,避免句柄问题。
- systemd 服务
- 标准输出/错误已由 journald 接管,使用 journalctl 查询与按时间清理:
- 实时查看:journalctl -u yourapp.service -f
- 按时间清理(如保留近 7 天):sudo journalctl --vacuum-time=7d
- 若应用同时写文件日志,仍需为这些文件配置 logrotate。
- Docker/Kubernetes
- 容器内建议应用内轮转或挂载 emptyDir/volume 并在宿主机侧用 logrotate;
- 避免直接 rm 容器正在写入的文件;必要时重启容器或发送信号触发重新打开日志。
四 安全与运维注意事项
- 避免直接删除正在写入的大文件;优先用 logrotate 的 copytruncate 或让应用重新打开日志(如 kill -USR1 ),以降低写入失败风险。
- 变更前先备份关键日志;执行 logrotate -d 做语法与路径检查,再 -f 强制执行。
- 权限最小化:日志目录与文件建议 root:adm,权限 640,防止敏感信息泄露。
- 监控与告警:对 /var/log 或应用日志目录设置 磁盘使用率 告警,防止“磁盘打满”导致服务异常。