选择高性能日志库
优先选用专为性能设计的日志库,如Winston(流行且支持多传输方式)、Pino(以速度快为核心优势),避免使用同步阻塞的日志库。例如,Winston可通过异步写入减少对主线程的影响,Pino的二进制JSON格式能显著降低I/O开销。
合理配置日志级别
根据环境动态调整日志级别:生产环境建议设置为ERROR或WARN(仅记录关键错误和警告),开发环境可设置为DEBUG(记录详细信息)。通过环境变量(如LOG_LEVEL)或配置文件实现灵活切换,避免不必要的日志写入。例如,使用Winston时可通过level: process.env.LOG_LEVEL || 'info'读取环境变量设置日志级别。
实现日志轮转与压缩
通过工具或库自动管理日志文件大小和数量,防止单个文件过大占用磁盘空间:
maxSize(如20MB)和maxFiles(如14天),当日志文件达到指定大小时自动切割,并保留指定天数的日志;开启zippedArchive选项压缩旧日志,进一步节省空间。/etc/logrotate.d/目录下创建Node.js应用专属配置文件(如nodejs-app),设置daily(每日轮转)、rotate 7(保留7天)、compress(压缩)、delaycompress(延迟压缩)等参数,自动处理日志轮转。例如,配置/var/log/nodejs/*.log路径下的日志文件,可实现每日切割、保留7天并压缩旧日志。采用异步日志写入
确保日志库使用异步I/O操作(如Winston默认支持异步),避免同步写入导致的线程阻塞。异步写入能显著提高应用性能,特别是在高并发场景下,减少日志记录对请求响应时间的影响。
集中式日志管理
将日志发送到集中式日志管理系统(如ELK Stack:Elasticsearch+Logstash+Kibana、Graylog),将日志存储与应用分离。这种方式能减轻应用服务器的I/O压力,同时提供强大的日志搜索、分析和可视化功能,便于快速定位问题。
监控与自动化清理
定期监控磁盘空间使用情况(如使用df -h命令),编写自动化脚本(如用find命令查找并删除超过7天的旧日志文件)或在应用中实现日志备份逻辑(如将日志移动到备份目录并压缩)。例如,find /var/log/nodejs -name "*.log" -mtime +7 -exec rm {} \;命令可删除7天前的日志文件,避免磁盘空间耗尽。