商城首页欢迎来到中国正版软件门户

您的位置:首页 >Node.js应用如何在Ubuntu上进行日志管理

Node.js应用如何在Ubuntu上进行日志管理

  发布于2026-05-03 阅读(0)

扫一扫,手机访问

Node.js 在 Ubuntu 的日志管理实践

日志,是应用运行状态的忠实记录者,也是排查问题的第一现场。在 Ubuntu 上部署 Node.js 应用,一套清晰、高效的日志管理策略,能让运维工作事半功倍。下面,我们就来梳理一下从输出、轮转到监控、分析的完整实践路径。

一 日志输出与存储位置

首先,得决定日志往哪儿写。方法有好几种,各有适用场景。

  • 使用内置 console:开发调试时最直接,信息直接打印到终端;生产环境也可以通过重定向命令(例如:node app.js > app.log 2>&1)来持久化。这种方式胜在简单,但缺点也很明显:缺乏日志级别区分和结构化能力,后期分析比较麻烦。
  • 使用日志库:这是更专业的选择。像 Winston、Bunyan、Pino 这类库,功能强大,支持多种传输方式(文件、控制台、网络等)、定义日志级别,并能输出结构化的 JSON 格式,为后续的检索和分析打下坚实基础。
  • 使用进程管理器 PM2:如果你用 PM2 来守护进程,它会自动管理应用日志。默认情况下,日志文件位于用户目录的 ~/.pm2/logs/ 下(比如 app-out.logapp-error.log)。当然,你也可以在配置文件中自定义输出路径。
  • 使用系统日志:将应用日志发送到 Ubuntu 的 syslog 或 systemd journal(journald),由系统统一管理。你可以通过 /var/log/syslogjournalctl 命令来查看,适合需要与系统服务日志整合的场景。
  • 日志目录建议:一个良好的习惯是为应用日志设立专属目录。可以放在项目内的 ./logs,或者系统级的集中目录如 /var/log/nodejs/。这样做的好处是避免与系统日志混杂,便于进行独立的权限设置和生命周期管理。

二 日志轮转与保留策略

日志文件不能任由其无限增长,否则迟早会撑满磁盘。因此,日志轮转(Log Rotation)至关重要。

  • PM2 内置轮转:PM2 自带了日志轮转模块。启用后,可以按文件大小或时间间隔自动切割日志。配置起来很方便:
    • 命令方式:执行 pm2 set pm2-logrotate:max_size 10Mpm2 set pm2-logrotate:retain 7 即可。
    • 配置文件方式:在 ecosystem.config.js 中设置:
      • log_rotation: true
      • log_rotation_interval: ‘1d’
      • log_rotation_size: ‘10M’
      • log_rotation_keep: 7
  • 系统级 logrotate:对于部署在服务器上的多个应用,使用 Linux 系统自带的 logrotate 工具进行统一管理更高效。只需在 /etc/logrotate.d/ 下创建一个配置文件(例如 nodejs):
    /var/log/nodejs/*.log {
        daily
        missingok
        rotate 7
        compress
        notifempty
        create 0640 root adm
    }
    配置完成后,可以用 sudo logrotate -vf /etc/logrotate.d/nodejs 命令测试一下。
  • 日志库自带轮转:一些日志库的插件也提供了轮转功能。例如,配合 Winston 使用 winston-daily-rotate-file 传输器,就能轻松实现按天或小时分割日志、自动压缩和设置保留天数。

三 实时监控与快速排查

当应用出现问题时,我们需要能快速定位日志。掌握几个命令行工具,效率会高很多。

  • 命令行工具
    • tail -f /path/to/app.log:经典命令,实时追踪日志尾部的新内容。
    • grep -i “error” /path/to/app.log:快速过滤出所有错误信息。
    • watch -n 2 tail -f /path/to/app.log:每隔2秒刷新并显示日志尾部,适合在固定终端窗口观察。
  • PM2 日志:如果使用 PM2,相关命令更加集成:pm2 logs my-app 实时查看;pm2 logs --json 以 JSON 格式输出;pm2 flush 清空当前日志文件(谨慎使用)。
  • systemd 服务:对于配置为 systemd 服务的应用,使用 journalctl -u your-nodejs-service -f 可以实时跟踪该服务的所有日志输出。
  • Express 请求日志:对于 Web 应用,结合使用 morgan 中间件将 HTTP 访问日志写入单独的 access.log,能极大方便定位 4xx 客户端错误或 5xx 服务器错误。

四 结构化与集中式日志方案

随着应用规模扩大,日志管理需要更进一步。

  • 结构化日志:这是迈向高效分析的第一步。使用 Winston、Bunyan 等库输出 JSON 格式的日志,每条日志都包含时间戳、级别、消息、请求ID等固定字段。这样,无论是用 jq 命令解析,还是导入日志平台,都变得异常轻松。
  • 系统日志集成:通过 winston-syslog 或 Node.js 内置的 syslog 模块,将应用日志直接发送到 rsyslog 或 journald。这样一来,所有日志都由操作系统层面的工具统一收集、存储和轮转,管理起来更规范。
  • 集中式平台:当服务器或容器实例数量增多时,登录每台机器看日志就变得不现实。此时,搭建像 ELK(Elasticsearch + Logstash + Kibana)栈、Graylog 或使用 Fluentd 这样的集中式日志平台,就成为了必选项。它们能实现日志的采集、索引、可视化搜索甚至设置告警,让运维监控提升一个维度。

五 生产可用的最小配置示例

理论说了不少,最后来看一套能直接上手、用于生产环境的最小化配置组合。这可以作为一个坚实的起点。

  • 目录与权限:首先,创建日志目录并设置好权限:
    sudo mkdir -p /var/log/nodejs
    sudo chown $USER:$USER /var/log/nodejs
  • Winston 结构化日志(含按天轮转)
    1. 安装依赖:npm i winston winston-daily-rotate-file
    2. 配置示例:
      const winston = require(‘winston’);
      const DailyRotateFile = require(‘winston-daily-rotate-file’);
      
      const logger = winston.createLogger({
        level: ‘info’,
        format: winston.format.json(),
        transports: [
          new DailyRotateFile({
            filename: ‘/var/log/nodejs/error-%DATE%.log’,
            datePattern: ‘YYYY-MM-DD’,
            level: ‘error’,
            zippedArchive: true,
            maxSize: ‘20m’,
            maxFiles: ‘14d’
          }),
          new DailyRotateFile({
            filename: ‘/var/log/nodejs/combined-%DATE%.log’,
            datePattern: ‘YYYY-MM-DD’,
            zippedArchive: true,
            maxSize: ‘20m’,
            maxFiles: ‘14d’
          }),
          …(process.env.NODE_ENV !== ‘production’
            ? [new winston.transports.Console({ format: winston.format.simple() })]
            : [])
        ]
      });
  • PM2 配置(ecosystem.config.js)
    module.exports = {
      apps: [{
        name: ‘my-app’,
        script: ‘app.js’,
        out_file: ‘/var/log/nodejs/my-app-out.log’,
        error_file: ‘/var/log/nodejs/my-app-err.log’,
        log_date_format: ‘YYYY-MM-DD HH:mm:ss’,
        merge_logs: true,
        log_rotation: true,
        log_rotation_interval: ‘1d’,
        log_rotation_size: ‘10M’,
        log_rotation_keep: 7
      }]
    };
  • 可选 systemd 服务(/etc/systemd/system/node-app.service)
    [Unit]
    Description=Node.js App
    After=network.target
    
    [Service]
    Type=simple
    User=www-data
    WorkingDirectory=/opt/myapp
    ExecStart=/usr/bin/node app.js
    StandardOutput=journal
    StandardError=journal
    Restart=on-failure
    
    [Install]
    WantedBy=multi-user.target
    配置好后,执行 sudo systemctl daemon-reload && sudo systemctl enable --now node-app 启用服务。
  • 快速验证:配置完成后,可以通过以下命令快速验证日志是否正常生成和输出:
    pm2 logs my-app -f
    tail -f /var/log/nodejs/combined-$(date +%F).log
    journalctl -u node-app -f
本文转载于:https://www.yisu.com/ask/73879984.html 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。

热门关注