Debian下JS日志記錄注意事項
根據應用場景選擇功能匹配的日志庫:
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() }));
}
根據環境調整日志級別,避免不必要的性能消耗:
debug
級別,記錄詳細調試信息(如變量值、函數調用棧);info
或warn
級別,記錄關鍵流程和潛在問題;error
或warn
級別,僅記錄錯誤和警告,減少日志體積。const level = process.env.NODE_ENV === 'production' ? 'warn' : 'debug';
const logger = winston.createLogger({ level, format: winston.format.json() });
防止日志文件過大占用磁盤空間,推薦使用以下工具:
winston-daily-rotate-file
,支持按日期輪換(如app-2025-10-16.log
),并自動壓縮舊日志;logrotate
,通過配置文件(如/etc/logrotate.d/my-js-app
)實現按大?。ㄈ?0M)或日期輪換,支持保留指定數量(如7天)的日志。winston-daily-rotate-file
配置):const DailyRotateFile = require('winston-daily-rotate-file');
const logger = winston.createLogger({
transports: [
new DailyRotateFile({
filename: 'application-%DATE%.log',
datePattern: 'YYYY-MM-DD',
zippedArchive: true,
maxSize: '20m',
maxFiles: '14d'
})
]
});
避免敏感信息泄露,保護日志數據的完整性和保密性:
sanitize-error
等庫過濾日志中的密碼、密鑰、個人身份信息(PII);640
(屬主可讀寫,組可讀),屬主為root
或應用專用用戶(如appuser
);ERROR
日志)或未授權修改。const sanitize = require('sanitize-error');
logger.error('Database connection failed', sanitize(error));
避免日志記錄成為應用瓶頸:
debug
日志,使用條件判斷(如if (logger.isDebugEnabled())
)減少不必要的日志輸出;const pino = require('pino');
const logger = pino({ level: 'info' }, pino.destination('app.log')); // 異步寫入
采用結構化格式(如JSON)便于后續解析和分析:
info
/error
等)、進程ID、模塊名、日志信息和上下文(如請求ID、用戶ID);winston.format.json()
(Winston)或Pino的默認JSON格式,方便與ELK Stack、Graylog等工具集成。{
"timestamp": "2025-10-16T12:34:56.789Z",
"level": "error",
"pid": 1234,
"module": "auth",
"message": "Failed login attempt",
"context": { "userId": "admin", "ip": "192.168.1.1" }
}
實現日志的統一收集和分析,提升問題排查效率:
ERROR
日志超過10條/分鐘時發送郵件或短信通知)。# 安裝pm2和pm2-logrotate
npm install pm2 -g
pm2 install pm2-logrotate
# 配置pm2-logrotate(保留7天日志,壓縮)
pm2 set pm2-logrotate:retain 7
pm2 set pm2-logrotate:compress true
根據不同環境(開發、測試、生產)調整日志配置:
Console
transport),使用simple
格式(易讀),開啟debug
級別;File
transport),使用JSON格式,開啟warn
或error
級別,啟用日志輪轉和集中管理。const isProduction = process.env.NODE_ENV === 'production';
const transports = [];
if (isProduction) {
transports.push(new winston.transports.File({ filename: 'error.log', level: 'error' }));
transports.push(new winston.transports.File({ filename: 'combined.log' }));
} else {
transports.push(new winston.transports.Console({ format: winston.format.simple() }));
}
const logger = winston.createLogger({ level: isProduction ? 'warn' : 'debug', transports });