温馨提示×

Linux系统Node.js如何进行日志管理

小樊
45
2025-12-10 12:21:54
栏目: 编程语言

Linux 下 Node.js 日志管理实践

一 日志库选择与基础配置

  • 常用日志库
    • Winston:生态成熟、传输多、易扩展,适合大多数场景。
    • Pino:性能高、结构化输出,适合高并发与云原生环境。
    • Bunyan:结构化 JSON、便于检索与分析。
    • Log4js:功能丰富、支持多输出与轮转。
  • 基础配置要点
    • 使用结构化日志(如 JSON),便于后续检索与聚合。
    • 合理设置日志级别:生产环境常用 error/warn,按需开启 info/debug
    • 区分错误日志业务/访问日志,便于排障与审计。
    • 通过环境变量控制日志级别,避免频繁改代码:例如 process.env.LOG_LEVEL || 'info'
    • 示例(Winston):按级别拆分输出到不同文件,生产写文件、开发打印到控制台。
    • 示例(Pino):开发环境用 pino-pretty 美化输出,生产直接写 JSON 到文件或标准输出。

二 日志轮转与清理策略

  • 应用内轮转
    • Winston:使用 winston-daily-rotate-file,可按天或按大小切分,支持压缩与保留天数。
    • Pino:使用 pino-rotate 等插件,按周期切分并控制保留数量与压缩。
  • 系统级轮转
    • logrotate:Linux 自带,适合容器外或无侵入场景。
      • 典型配置:每天轮转、保留 7 天、压缩、空文件不轮转、自动创建新文件并设置权限。
      • 放置路径:/etc/logrotate.d/nodejs-app,对目标日志文件生效。
  • 兜底清理
    • 若无 logrotate,可用 cron 定期清理旧日志(如删除 7 天前文件)。

三 运行与集中式管理

  • 进程管理
    • 使用 PM2 运行 Node.js:内置日志聚合日志轮转实时 tail 等,便于多实例统一查看与运维。
  • 系统日志
    • 将 Node.js 输出接入 journald/syslog(如通过 systemd 服务或 rsyslog),统一到系统日志链路,便于集中采集与审计。
  • 集中式日志平台
    • 小规模可用 ELK Stack(Elasticsearch/Logstash/Kibana)Graylog 做检索与可视化。
    • 云原生与成本敏感场景可用 Grafana Loki 搭配 Promtail 收集与查询。

四 日常运维与性能优化

  • 常用命令
    • 实时查看:tail -f app.log
    • 关键字检索:cat app.log | grep "error"
    • 多文件检索:grep -R "timeout" /var/log/nodejs/
  • 性能与可靠性
    • 优先异步写入,避免阻塞事件循环。
    • 控制日志级别与采样,减少不必要的日志量。
    • 规范日志字段(如 timestamp、level、service、trace_id),便于链路追踪与聚合。
    • 容器化场景建议将日志写到标准输出/标准错误,由容器运行时收集,避免容器内落盘与权限问题。

五 快速落地示例

  • 方案 A(应用内轮转 + PM2)
    • 安装依赖:npm i winston winston-daily-rotate-file
    • 配置 logger(按天轮转、保留 14 天、压缩):
      • 代码示例:
        • const winston = require(‘winston’);
        • const { DailyRotateFile } = require(‘winston-daily-rotate-file’);
        • const transport = new DailyRotateFile({ filename: ‘/var/log/myapp/application-%DATE%.log’, datePattern: ‘YYYY-MM-DD’, zippedArchive: true, maxSize: ‘20m’, maxFiles: ‘14d’ });
        • const logger = winston.createLogger({ level: process.env.LOG_LEVEL || ‘info’, format: winston.format.json(), transports: [transport, new winston.transports.Console()] });
    • 用 PM2 启动:pm2 start app.js -n myapp,查看日志:pm2 logs myapp
  • 方案 B(系统级 logrotate + 简单输出)
    • 应用将日志写到:/var/log/myapp/app.log
    • 创建 /etc/logrotate.d/nodejs-app
      • /var/log/myapp/*.log { daily missingok rotate 7 compress notifempty create 0640 node node }
    • 手动测试:logrotate -d /etc/logrotate.d/nodejs-app(干跑),logrotate -f /etc/logrotate.d/nodejs-app(强制执行)。

0