在Ubuntu系統中,對Node.js應用的日志進行輪轉(log rotation)是一個常見的需求,以確保日志文件不會無限增長,占用過多磁盤空間。以下是幾種實現日志輪轉的方法:
logrotate 工具Ubuntu系統自帶 logrotate 工具,可以方便地對日志文件進行輪轉、壓縮和刪除舊日志。以下是如何配置 logrotate 來管理Node.js應用的日志:
創建日志目錄和日志文件(如果尚未創建):
mkdir -p /var/log/myapp
touch /var/log/myapp/myapp.log
創建 logrotate 配置文件:
在 /etc/logrotate.d/ 目錄下創建一個新的配置文件,例如 myapp:
sudo nano /etc/logrotate.d/myapp
配置 logrotate:
在配置文件中添加以下內容:
/var/log/myapp/myapp.log {
daily
rotate 7
compress
delaycompress
missingok
notifempty
create 640 root adm
}
解釋:
daily: 每天輪轉一次日志。rotate 7: 保留7個輪轉日志文件。compress: 壓縮舊日志文件。delaycompress: 延遲壓縮,直到下一次輪轉。missingok: 如果日志文件不存在,不會報錯。notifempty: 如果日志文件為空,不進行輪轉。create 640 root adm: 創建新日志文件時設置權限和所有者。測試配置:
運行以下命令測試 logrotate 配置是否正確:
sudo logrotate -f /etc/logrotate.d/myapp
winston 或 pino 等日志庫如果你希望在Node.js應用內部處理日志輪轉,可以使用 winston 或 pino 等日志庫。這些庫提供了內置的日志輪轉功能。
winston安裝 winston 和 winston-daily-rotate-file:
npm install winston winston-daily-rotate-file
配置 winston:
const winston = require('winston');
const DailyRotateFile = require('winston-daily-rotate-file');
const transport = new DailyRotateFile({
filename: 'application-%DATE%.log',
datePattern: 'YYYY-MM-DD-HH',
zippedArchive: true,
maxSize: '20m',
maxFiles: '14d'
});
const logger = winston.createLogger({
level: 'info',
format: winston.format.json(),
transports: [
transport
]
});
logger.info('Hello, world!');
pino安裝 pino 和 pino-pretty:
npm install pino pino-pretty
配置 pino:
const pino = require('pino');
const prettyPrint = require('pino-pretty');
const logger = pino({
level: 'info',
transport: {
target: 'pino-pretty',
options: {
colorize: true
}
}
});
logger.info('Hello, world!');
systemd 服務管理日志如果你使用 systemd 管理Node.js應用,可以在服務文件中配置日志輪轉。
創建 systemd 服務文件:
sudo nano /etc/systemd/system/myapp.service
配置服務文件:
[Unit]
Description=My Node.js Application
After=network.target
[Service]
ExecStart=/usr/bin/node /path/to/your/app.js
Restart=always
User=youruser
Group=yourgroup
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=myapp
[Install]
WantedBy=multi-user.target
重新加載 systemd 配置并啟動服務:
sudo systemctl daemon-reload
sudo systemctl start myapp
sudo systemctl enable myapp
配置 rsyslog 進行日志輪轉:
編輯 /etc/rsyslog.conf 或創建一個新的配置文件 /etc/rsyslog.d/50-default.conf,添加以下內容:
if $programname == 'myapp' then /var/log/myapp.log
& stop
重啟 rsyslog 服務:
sudo systemctl restart rsyslog
通過以上方法,你可以有效地管理Node.js應用的日志輪轉,確保日志文件不會過大,同時保留必要的歷史記錄。