您的位置:首页 >Ubuntu Node.js日志如何实现自动化处理
发布于2026-08-06 阅读(0)
扫一扫,手机访问
在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进程,它的内置日志模块可以直接实现日志轮转,省去额外工具。安装pm2:sudo npm install pm2 -g,启动应用时指定日志路径:
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将日志集中收集到一台服务器,便于统一管理。安装rsyslog:sudo apt-get install rsyslog(Ubuntu默认已安装)。
配置rsyslog收集Node.js日志:编辑/etc/rsyslog.d/50-nodejs.conf(新建文件),添加以下内容,将Node.js日志转发到指定文件:
if $programname == 'node' then /var/log/nodejs/nodejs.log
& stop # 停止后续规则处理,避免重复记录
重启rsyslog服务:sudo systemctl restart rsyslog,使配置生效。此时Node.js的标准输出/错误日志会被rsyslog捕获到/var/log/nodejs/nodejs.log,再结合logrotate对该文件进行轮转即可。
对于需要深度分析、可视化或长期存储的场景,可以使用ELK Stack(Elasticsearch+Logstash+Kibana)或Graylog等工具。这里以ELK Stack为例。
安装组件:sudo apt-get install elasticsearch logstash kibana(需调整Ja va版本以满足要求)。配置Logstash收集Node.js日志:创建/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天的日志)。
cron定时任务:编辑当前用户的crontab(crontab -e),添加以下内容,每天凌晨1点删除7天前的.log文件:
0 1 * * * find /path/to/your/nodejs/logs -type f -name "*.log" -mtime +7 -exec rm -f {} \;
Node.js脚本清理:创建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。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8