Ubuntu下Node.js日志自动化处理的核心方案
logrotate是Ubuntu系统自带的日志管理工具,可自动完成日志轮转、压缩、清理等操作,是处理Node.js日志的基础方案。
sudo apt-get install logrotate命令安装(Ubuntu默认已预装)。/etc/logrotate.d/目录下新建nodejs文件(如sudo nano /etc/logrotate.d/nodejs),添加以下配置(根据实际路径调整):/path/to/your/nodejs/logs/*.log {
daily # 每天轮转一次(可选:weekly/monthly)
rotate 7 # 保留最近7个轮转日志(避免无限堆积)
compress # 使用gzip压缩旧日志(节省空间)
delaycompress # 延迟压缩(如第8个日志才压缩第1个,减少IO压力)
missingok # 若日志文件不存在,不报错继续执行
notifempty # 若日志为空,不进行轮转
create 0640 root adm # 轮转后创建新日志文件,权限0640,属主root、属组adm
}
sudo logrotate -f /etc/logrotate.d/nodejs);logrotate默认通过/etc/cron.daily/logrotate每日自动执行,无需额外配置。若使用pm2管理Node.js进程,其内置的日志模块可直接实现日志轮转,无需额外工具。
sudo npm install pm2 -g全局安装pm2,启动应用时指定日志路径:pm2 start app.js --name "my-app" \
--out-file /var/log/nodejs/my-app-out.log \ # 标准输出日志路径
--error-file /var/log/nodejs/my-app-err.log # 错误输出日志路径
pm2 set pm2:logrotate命令或创建ecosystem.config.js文件设置轮转参数。例如,在ecosystem.config.js中添加:module.exports = {
apps: [{
name: 'my-app',
script: 'app.js',
out_file: '/var/log/nodejs/my-app-out.log',
error_file: '/var/log/nodejs/my-app-err.log',
log_date_format: 'YYYY-MM-DD HH:mm Z', // 日志时间格式
time: true, // 在日志中添加时间戳
merge_logs: true, // 合并stdout/stderr
max_size: '10M', // 单个日志文件最大10MB
max_files: 7 // 保留7个历史日志文件
}]
};
启动应用时加载配置:pm2 start ecosystem.config.js。对于多服务器部署的Node.js应用,可通过rsyslog/syslog-ng将日志集中收集到一台服务器,便于统一管理。
sudo apt-get install rsyslog(Ubuntu默认已安装)。/etc/rsyslog.d/50-nodejs.conf(新建文件),添加以下内容(将Node.js日志转发到指定文件):if $programname == 'node' then /var/log/nodejs/nodejs.log
& stop # 停止后续规则处理,避免重复记录
sudo systemctl restart rsyslog,使配置生效。此时Node.js的标准输出/错误日志会被rsyslog捕获到/var/log/nodejs/nodejs.log,再结合logrotate对该文件进行轮转即可。对于需要深度分析、可视化或长期存储的场景,可使用ELK Stack(Elasticsearch+Logstash+Kibana)或Graylog等工具。
sudo apt-get install elasticsearch logstash kibana安装(需调整Java版本以满足要求)。/etc/logstash/conf.d/nodejs.conf,内容如下:input {
file {
path => "/var/log/nodejs/*.log" # 日志文件路径
start_position => "beginning" # 从文件开头读取(首次配置时需开启)
sincedb_path => "/dev/null" # 忽略sincedb文件(测试用)
}
}
filter {
# 可选:添加过滤器解析日志(如grok解析JSON格式)
grok { match => { "message" => "%{TIMESTAMP_ISO8601:timestamp} %{LOGLEVEL:loglevel} %{GREEDYDATA:logmessage}" } }
date { match => [ "timestamp", "ISO8601" ] } # 转换时间格式
}
output {
elasticsearch { hosts => ["localhost:9200"] } # 发送到Elasticsearch
stdout { codec => rubydebug } # 控制台输出(测试用)
}
sudo systemctl start elasticsearch logstash kibana,通过http://localhost:5601访问Kibana,创建索引模式(如nodejs-*)即可可视化日志。除了logrotate的rotate参数,还可通过cron定时任务或Node.js脚本定期清理过期日志(如超过30天的日志)。
crontab -e),添加以下内容(每天凌晨1点删除7天前的.log文件):0 1 * * * find /path/to/your/nodejs/logs -type f -name "*.log" -mtime +7 -exec rm -f {} \;
clean_logs.js,内容如下:const fs = require('fs');
const path = require('path');
const logDir = '/path/to/your/nodejs/logs';
const maxAge = 7 * 24 * 60 * 60 * 1000; // 7天的毫秒数
fs.readdir(logDir, (err, files) => {
if (err) throw err;
files.forEach(file => {
const filePath = path.join(logDir, file);
fs.stat(filePath, (err, stats) => {
if (err) throw err;
if (stats.isFile() && Date.now() - stats.mtime > maxAge) {
fs.unlink(filePath, err => {
if (err) throw err;
console.log(`Deleted: ${filePath}`);
});
}
});
});
});
通过cron执行该脚本(0 2 * * * /usr/bin/node /path/to/clean_logs.js)。