1. 选择合适的日志库
Node.js生态中有多个成熟的日志库,需根据需求选择:
2. 配置合理的日志级别
根据环境动态调整日志级别,避免不必要的性能消耗:
warn或error,仅记录错误和潜在问题(如logger.level = process.env.NODE_ENV === 'production' ? 'warn' : 'info')。debug或trace,输出详细信息(如请求参数、数据库查询),便于故障排查。FATAL(灾难性错误)、ERROR(业务错误)、WARN(潜在问题)、INFO(正常流程)、DEBUG(调试信息)、TRACE(详细跟踪)。3. 使用结构化日志格式
采用JSON格式输出日志,便于后续自动化解析、分析和集成(如ELK Stack):
// Winston示例
const logger = winston.createLogger({
format: winston.format.combine(
winston.format.timestamp(),
winston.format.json()
),
transports: [new winston.transports.File({ filename: 'app.log' })]
});
// Pino示例
const logger = pino({ level: 'info' });
logger.info({ event: 'user_login', userId: 123, ip: '192.168.1.1' }, 'User logged in');
结构化日志的优势:易过滤、易聚合、易关联上下文(如用户ID、请求ID)。
4. 实现日志轮转与归档
避免单个日志文件过大占用磁盘空间,推荐使用logrotate(Debian自带工具):
sudo apt-get install logrotate/etc/logrotate.d/nodejs文件,内容如下:/path/to/your/nodejs/logs/*.log {
daily # 每天轮转
rotate 7 # 保留7个旧日志
compress # 压缩旧日志(节省空间)
delaycompress # 延迟压缩(避免压缩当天日志)
missingok # 日志文件不存在时不报错
notifempty # 日志为空时不轮转
create 0640 root adm # 新日志文件的权限和所有者
postrotate
# 可选:通知应用重新打开日志文件(如PM2)
# systemctl restart your-node-app
endscript
}
sudo logrotate -d /etc/logrotate.d/nodejs(模拟运行),sudo logrotate -f /etc/logrotate.d/nodejs(强制运行)。5. 集中式日志管理
将日志发送到集中式系统,便于统一存储、分析和监控:
pm2 logs命令)。6. 性能优化
避免日志记录成为应用瓶颈:
debug/trace级别,减少I/O操作。7. 安全防护
避免敏感信息泄露,保障日志安全:
helmet中间件)。640(所有者可读写,组可读),避免未授权访问。crypto模块)。8. 监控与告警
及时发现日志中的异常,提升系统可靠性:
ERROR级别超过阈值(如10分钟内5次错误)或磁盘空间不足(如剩余10%)时,通过邮件、短信或Slack发送告警(如使用Alertmanager)。