Ubuntu下優化Node.js日志的關鍵策略
優先使用成熟的第三方日志庫(如Winston、Pino),它們提供日志級別控制、格式化、傳輸(文件/控制臺/遠程)、異步記錄等功能,遠優于原生console
模塊。例如:
const winston = require('winston');
const logger = winston.createLogger({
level: 'info',
format: winston.format.json(),
transports: [
new winston.transports.File({ filename: 'error.log', level: 'error' }),
new winston.transports.File({ filename: 'combined.log' })
]
});
if (process.env.NODE_ENV !== 'production') {
logger.add(new winston.transports.Console({ format: winston.format.simple() }));
}
根據環境動態調整日志級別,避免記錄無關信息:
warn
或error
,僅記錄關鍵錯誤和警告,減少日志體積;debug
或verbose
,記錄詳細信息以輔助調試。// 通過環境變量設置(推薦)
const logLevel = process.env.LOG_LEVEL || (process.env.NODE_ENV === 'production' ? 'warn' : 'debug');
const logger = winston.createLogger({ level: logLevel, ... });
使用winston-daily-rotate-file或系統級logrotate工具,自動分割、壓縮舊日志,避免單個文件過大占用磁盤空間。
const DailyRotateFile = require('winston-daily-rotate-file');
const transport = new DailyRotateFile({
filename: 'application-%DATE%.log',
datePattern: 'YYYY-MM-DD',
zippedArchive: true, // 壓縮舊日志
maxSize: '20m', // 單個文件最大20MB
maxFiles: '14d' // 保留14天
});
logger.add(transport);
logrotate
后,創建/etc/logrotate.d/nodejs
文件:/var/log/nodejs/*.log {
daily
missingok
rotate 7
compress
notifempty
create 0640 root adm
}
該配置每天輪轉日志,保留7天,壓縮舊文件。
確保日志記錄不阻塞主線程(尤其是高并發場景)。多數日志庫(如Winston、Pino)默認支持異步:
transports
自動異步寫入;const pino = require('pino');
const logger = pino({ level: 'info' }, pino.destination('/var/log/nodejs/app.log'));
使用JSON格式記錄日志,便于后續用ELK(Elasticsearch+Logstash+Kibana)、Graylog等工具分析。例如:
logger.info({
message: 'User logged in',
userId: 123,
ip: '192.168.1.1'
});
結構化日志可通過工具快速過濾、聚合(如“查找所有登錄失敗的IP”)。
將日志發送到集中式監控系統,實時檢測異常并觸發報警:
root
或專用用戶所有,設置chmod 0640
權限,防止未授權讀??;winston-masking
等庫過濾日志中的密碼、手機號等敏感字段:const winston = require('winston');
const masking = require('winston-masking');
const logger = winston.createLogger({
transports: [new winston.transports.Console()],
format: winston.format.combine(
masking({ paths: ['password', 'creditCard'] }), // 過濾指定字段
winston.format.json()
)
});
logger.info({ password: '123456', username: 'admin' }); // 輸出中password會被替換為***
通過cron
定時任務自動刪除超過保留期限的日志文件,釋放磁盤空間。例如,每天凌晨清理7天前的日志:
# 編輯cron任務
crontab -e
添加以下內容:
0 0 * * * find /var/log/nodejs -type f -name "*.log" -mtime +7 -exec rm -f {} \;