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)实现按大小(如10M)或日期轮换,支持保留指定数量(如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 });