選擇合適的日志庫
使用成熟的日志庫(如Winston、Bunyan、Pino)是提升日志可讀性的基礎。這些庫提供日志級別管理、多輸出目標(控制臺、文件、遠程服務器)、格式化等功能。例如,Winston支持靈活的格式化配置,Bunyan默認以JSON格式輸出便于分析,Pino則以高性能著稱,適合對日志性能要求高的場景。
配置合理的日志級別
根據環境設置不同的日志級別,避免無關日志干擾。例如:
warn或error,僅記錄關鍵錯誤和警告,減少日志文件大??;debug或info,記錄詳細信息以輔助調試。logger.level屬性動態調整級別(如process.env.NODE_ENV === 'production' ? 'warn' : 'debug')。結構化日志格式
采用結構化日志(如JSON格式)代替普通文本日志,便于后續解析和分析。結構化日志包含時間戳、日志級別、消息、模塊名稱、請求ID等元數據,例如:
{
"timestamp": "2025-10-05 14:30:00",
"level": "INFO",
"message": "User logged in",
"userId": 123,
"module": "auth"
}
使用Winston時,可通過winston.format.combine組合timestamp、json等格式化器;使用Pino時,默認輸出JSON格式。
自定義日志格式
通過格式化器定制日志輸出樣式,增強可讀性。例如,使用Winston的printf格式化器添加時間戳、顏色和固定格式:
const logger = winston.createLogger({
format: winston.format.combine(
winston.format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }),
winston.format.colorize(),
winston.format.printf(({ timestamp, level, message }) => {
return `${timestamp} ${level.toUpperCase()}: ${message}`;
})
),
transports: [new winston.transports.Console()]
});
輸出結果:2025-10-05 14:30:00 INFO: User logged in(帶顏色區分級別)。
啟用日志輪轉
使用日志輪轉工具(如winston-daily-rotate-file或系統logrotate)自動管理日志文件,防止單個文件過大。例如,Winston的daily-rotate-file傳輸可按天分割日志:
const winston = require('winston');
require('winston-daily-rotate-file');
const transport = new winston.transports.DailyRotateFile({
filename: 'logs/application-%DATE%.log',
datePattern: 'YYYY-MM-DD',
maxSize: '20m',
maxFiles: '14d'
});
const logger = winston.createLogger({
transports: [transport]
});
系統logrotate可通過配置文件(如/etc/logrotate.d/nodejs)實現類似功能。
集中式日志管理
將日志發送到集中式日志管理系統(如ELK Stack、Graylog、Fluentd),實現日志的統一存儲、搜索和分析。例如,使用Winston的file傳輸將日志寫入本地文件,再通過Logstash收集到Elasticsearch,通過Kibana可視化分析。集中式管理便于跨服務、跨服務器的日志關聯,提升故障排查效率。
添加色彩與樣式
為終端輸出的日志添加顏色,增強視覺區分度。例如,Winston的colorize格式化器可根據日志級別顯示不同顏色(錯誤為紅色、警告為黃色、信息為綠色):
const logger = winston.createLogger({
format: winston.format.combine(
winston.format.colorize(),
winston.format.simple()
),
transports: [new winston.transports.Console()]
});
輸出結果:info: User logged in(綠色)、error: Something went wrong(紅色)。
編寫清晰的日志注釋
在日志記錄代碼中添加注釋,說明日志的用途和上下文。例如:
// 記錄用戶登錄成功事件,包含用戶ID和IP地址
logger.info(`User logged in - UserID: ${userId}, IP: ${req.ip}`, { userId, ip: req.ip });
注釋能幫助其他開發者快速理解日志含義,提升日志的可維護性。