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" # 從文件開頭讀?。ㄊ状闻渲脮r需開啟)
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
)。