選擇合適的結構化日志庫
結構化日志庫能生成格式統一、易于解析的日志,是提高可讀性的基礎。Debian環境下常用的庫包括:
npm install安裝所需庫(如npm install winston),即可開始配置。配置清晰的日志級別
根據環境(開發/生產)設置不同日志級別,過濾無關信息:
warn或error,僅記錄關鍵問題,避免日志膨脹;debug或info,保留詳細信息以輔助調試。level參數配置,例如Winston:const logger = winston.createLogger({ level: process.env.NODE_ENV === 'production' ? 'warn' : 'info' });
或Pino:
const logger = pino({ level: process.env.NODE_ENV === 'production' ? 'warn' : 'info' });
統一日志格式(含時間戳與元數據)
結構化格式(如JSON)能讓日志更易搜索和分析。通過日志庫的格式化工具添加時間戳(標識日志時間)、日志級別(區分嚴重程度)、請求ID(追蹤請求鏈路)等元數據:
timestamp和printf格式化器,自定義輸出模板:const logger = winston.createLogger({
format: winston.format.combine(
winston.format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }), // 時間戳
winston.format.printf(({ timestamp, level, message }) => `[${timestamp}] ${level.toUpperCase()}: ${message}`) // 自定義格式
),
transports: [new winston.transports.Console()]
});
prettyPrint美化輸出,添加時間翻譯:const logger = pino({
level: 'info',
prettyPrint: { colorize: true, translateTime: 'YYYY-MM-DD HH:mm:ss' } // 彩色輸出+時間轉換
});
這些配置能讓日志包含關鍵上下文,快速定位問題。
實現日志輪轉(避免文件過大)
當日志文件過大時,使用logrotate工具自動分割、壓縮舊日志,節省存儲空間并保持日志可管理性:
logrotate:sudo apt-get install logrotate;/etc/logrotate.d/nodejs,添加以下內容(適配應用日志路徑):/path/to/your/nodejs/app/*.log {
daily # 每日輪轉
missingok # 文件不存在時不報錯
rotate 7 # 保留7天日志
compress # 壓縮舊日志(如.gz格式)
notifempty # 空日志不輪轉
create 640 root adm # 新日志文件權限
}
此配置會每日自動處理/path/to/your/nodejs/app/目錄下的所有.log文件。
集中式日志管理與分析
將日志發送到集中式平臺(如ELK Stack、Graylog、Splunk),實現跨應用/服務器的日志聚合,并提供搜索、可視化、告警功能。例如:
設置監控與告警
通過監控工具(如Prometheus+Grafana)跟蹤日志中的關鍵指標(如錯誤率、請求延遲),當指標超過閾值時觸發告警(如郵件、Slack通知)。例如:
error_count指標;優化日志輸出目標
根據日志用途選擇合適的輸出目標,避免無關日志干擾:
error.log存錯誤日志,combined.log存所有日志);const logger = winston.createLogger({
transports: [
new winston.transports.Console(), // 控制臺輸出
new winston.transports.File({ filename: 'logs/error.log', level: 'error' }), // 錯誤日志文件
new winston.transports.File({ filename: 'logs/combined.log' }) // 所有日志文件
]
});