Linux 环境下 JavaScript 日志过大的处理方案
一、紧急处置
du -sh /var/log/js.log*tail -f /var/log/js.log> /var/log/js.log(保留文件句柄,风险最低)rm /var/log/js.log.*;若应用不自动重建,删除后需重启或重新打开日志文件句柄二、长期治理 系统级方案 logrotate
/etc/logrotate.d/js-app/var/log/js.log {
daily
rotate 7
compress
delaycompress
missingok
notifempty
create 640 root adm
size 100M
dateext
}
daily/weekly/size:按天轮转或达到指定大小立即轮转(如 100M)rotate 7:保留最近 7 个归档compress/delaycompress:压缩归档,延迟到下次轮转再压,减少占用峰值missingok/notifempty:文件缺失不报错/空文件不轮转create:轮转后重建日志并设置权限属主dateext:归档名追加日期后缀,便于检索logrotate -d /etc/logrotate.conflogrotate -f /etc/logrotate.d/js-appreloadSecs、未发送 SIGHUP),仅用 copytruncate 可“复制后截断”原文件继续写入,但存在极小概率丢日志;更推荐应用支持“重新打开日志”或使用能配合信号滚动的日志库。三、长期治理 应用内方案 Node.js 常用日志库
const winston = require('winston');
const { createLogger, format } = winston;
const DailyRotateFile = require('winston-daily-rotate-file');
const logger = createLogger({
level: 'info',
format: format.json(),
transports: [
new DailyRotateFile({
filename: '/var/log/js/app-%DATE%.log',
datePattern: 'YYYY-MM-DD',
zippedArchive: true,
maxSize: '20m',
maxFiles: '14d'
})
]
});
const log4js = require('log4js');
log4js.configure({
appenders: {
out: { type: 'stdout' },
app: {
type: 'file',
filename: '/var/log/js/app.log',
maxLogSize: 10 * 1024 * 1024, // 10MB
backups: 7,
compress: true
}
},
categories: { default: { appenders: ['out', 'app'], level: 'warn' } }
});
const logger = log4js.getLogger();
四、应急拆分与后续预防
split -b 200M /var/log/js.log -d -a 3 js-part-split -C 200M /var/log/js.log -d -a 3 js-part-split -l 1000000 /var/log/js.log js-part--C 会尽量在不超过指定字节数的前提下不拆记录,适合大多数行式日志du/df 或监控平台对日志目录设阈值告警