1. 选择合适的日志库
使用成熟的Node.js日志库(如winston、pino)替代原生console.log,这些库提供日志级别控制、格式化、传输(如文件、数据库)等核心功能,能有效提升日志管理的灵活性和效率。例如,winston支持多transport(文件、控制台、远程服务),pino则以高性能(JSON格式、低开销)著称,适合高并发场景。
2. 合理设置日志级别
根据环境调整日志级别:生产环境推荐warn或error(仅记录关键问题,减少日志体积);开发环境推荐debug(记录详细信息,便于排查问题)。通过环境变量动态配置(如process.env.NODE_ENV),避免硬编码。例如:
const level = process.env.NODE_ENV === 'production' ? 'warn' : 'debug';
logger.level = level;
3. 实现日志轮转
通过logrotate工具或日志库内置功能自动管理日志文件,防止日志无限增长占用磁盘空间。
/etc/logrotate.d/下创建Node.js专属配置文件(如nodejs),设置每日轮转(daily)、保留7份(rotate 7)、压缩旧日志(compress)、忽略空文件(notifempty)。示例如下:/var/log/nodejs/*.log {
daily
missingok
rotate 7
compress
notifempty
create 0640 root adm
}
winston-daily-rotate-file库,配置单文件大小(如maxSize: '20m')和保留天数(如maxFiles: '14d'),支持按日期分割日志文件。4. 采用异步日志记录
确保日志记录为异步操作(大多数现代日志库默认支持),避免阻塞主线程。例如,winston的transports.File默认异步写入;pino采用零拷贝技术,进一步降低I/O开销。异步日志能显著提升高并发场景下的应用性能。
5. 使用结构化日志格式
采用JSON格式记录日志(而非纯文本),便于后续通过ELK Stack(Elasticsearch+Logstash+Kibana)、Graylog等工具进行解析、搜索和分析。结构化日志包含时间戳、日志级别、模块名称、消息等字段,提升日志的可读性和可处理性。例如:
const logger = winston.createLogger({
format: winston.format.combine(
winston.format.timestamp(),
winston.format.json()
),
transports: [new winston.transports.File({ filename: 'combined.log' })]
});
6. 集中式日志管理
将日志发送到集中式日志管理系统(如ELK Stack、Graylog、Datadog),解决分布式系统中日志分散的问题。通过集中管理,可实现日志的统一存储、实时监控、快速检索和告警(如设置错误日志阈值告警),提升问题排查效率。
7. 控制日志体积与速率
maxSize)或logrotate的size参数,限制单个日志文件的最大体积(如100MB),超过则轮转。rotate参数控制保留的日志文件数量(如7份),避免旧日志占用过多磁盘空间。bottleneck等库限制日志记录速率(如每秒最多100条),防止日志风暴(大量日志涌入导致系统崩溃)。8. 优化日志存储性能
buffer选项),批量写入磁盘,减少I/O操作次数。9. 监控与告警
集成监控工具(如Prometheus+Grafana),实时监控日志指标(如日志量、错误率、磁盘空间使用率)。设置告警规则(如错误日志超过100条/分钟、磁盘空间剩余不足10%),及时通知运维人员处理潜在问题,避免因日志问题导致系统故障。
10. 定期清理旧日志
通过cron任务或find命令定期清理过期日志(如超过30天的日志),释放磁盘空间。示例如下:
# 每天凌晨2点清理/var/log/nodejs目录下超过30天的.log文件
0 2 * * * find /var/log/nodejs -type f -name "*.log" -mtime +30 -exec rm {} \;
结合日志轮转工具(如logrotate),可进一步自动化清理流程,避免手动操作。