选择合适的结构化日志库
结构化日志库能生成格式统一、易于解析的日志,是提高可读性的基础。Debian环境下常用的库包括:
npm install安装所需库(如npm install winston),即可开始配置。配置清晰的日志级别
根据环境(开发/生产)设置不同日志级别,过滤无关信息:
warn或error,仅记录关键问题,避免日志膨胀;debug或info,保留详细信息以辅助调试。level参数配置,例如Winston:const logger = winston.createLogger({ level: process.env.NODE_ENV === 'production' ? 'warn' : 'info' }); 或Pino:
const logger = pino({ level: process.env.NODE_ENV === 'production' ? 'warn' : 'info' }); 统一日志格式(含时间戳与元数据)
结构化格式(如JSON)能让日志更易搜索和分析。通过日志库的格式化工具添加时间戳(标识日志时间)、日志级别(区分严重程度)、请求ID(追踪请求链路)等元数据:
timestamp和printf格式化器,自定义输出模板:const logger = winston.createLogger({ format: winston.format.combine( winston.format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }), // 时间戳 winston.format.printf(({ timestamp, level, message }) => `[${timestamp}] ${level.toUpperCase()}: ${message}`) // 自定义格式 ), transports: [new winston.transports.Console()] }); prettyPrint美化输出,添加时间翻译:const logger = pino({ level: 'info', prettyPrint: { colorize: true, translateTime: 'YYYY-MM-DD HH:mm:ss' } // 彩色输出+时间转换 }); 这些配置能让日志包含关键上下文,快速定位问题。
实现日志轮转(避免文件过大)
当日志文件过大时,使用logrotate工具自动分割、压缩旧日志,节省存储空间并保持日志可管理性:
logrotate:sudo apt-get install logrotate;/etc/logrotate.d/nodejs,添加以下内容(适配应用日志路径):/path/to/your/nodejs/app/*.log { daily # 每日轮转 missingok # 文件不存在时不报错 rotate 7 # 保留7天日志 compress # 压缩旧日志(如.gz格式) notifempty # 空日志不轮转 create 640 root adm # 新日志文件权限 } 此配置会每日自动处理/path/to/your/nodejs/app/目录下的所有.log文件。
集中式日志管理与分析
将日志发送到集中式平台(如ELK Stack、Graylog、Splunk),实现跨应用/服务器的日志聚合,并提供搜索、可视化、告警功能。例如:
设置监控与告警
通过监控工具(如Prometheus+Grafana)跟踪日志中的关键指标(如错误率、请求延迟),当指标超过阈值时触发告警(如邮件、Slack通知)。例如:
error_count指标;优化日志输出目标
根据日志用途选择合适的输出目标,避免无关日志干扰:
error.log存错误日志,combined.log存所有日志);const logger = winston.createLogger({ transports: [ new winston.transports.Console(), // 控制台输出 new winston.transports.File({ filename: 'logs/error.log', level: 'error' }), // 错误日志文件 new winston.transports.File({ filename: 'logs/combined.log' }) // 所有日志文件 ] });