温馨提示×

Ubuntu下Node.js日志如何实时查看

小樊
40
2025-11-22 06:51:23
栏目: 编程语言

Ubuntu下Node.js日志实时查看实用指南

一 常用实时查看方式

  • 使用 tail -f 跟踪日志文件新增内容,适合直接写文件或控制台重定向到文件的场景:
    • 命令示例:tail -f /var/log/myapp.log
    • 按关键字过滤:tail -f app.log | grep --line-buffered "error"(使用 –line-buffered 保证实时输出)
  • 使用 multitail 同时监控多个日志并支持高亮与分屏:
    • 安装:sudo apt-get install multitail
    • 命令示例:multitail app.logmultitail app.log error.log
  • 使用 watch + tail 定时刷新日志(适合简单轮询查看):
    • 命令示例:watch -n 1 'tail -n 50 app.log'(每 1 秒刷新并显示末尾 50 行)

二 使用PM2运行时的日志查看

  • 实时查看所有应用日志:pm2 logs
  • 查看指定应用日志:pm2 logs <app_name>
  • JSON 格式输出:pm2 logs --json
  • 限制显示最近行数:pm2 logs <app_name> --lines 1000
  • 启动时附加时间戳:pm2 start app.js --time
  • 指定日志文件路径:pm2 start app.js --log /path/to/logfile
  • 集群模式合并日志:pm2 start app.js -i max --merge-logs
  • 清理日志:pm2 flush(全部)或 pm2 flush <app_name>(单个)
  • 资源监控面板:pm2 monit

三 作为systemd服务运行时的日志查看

  • 查看服务实时日志:journalctl -u your-nodejs-service-name -f
  • 按时间过滤(最近 10 分钟):journalctl -u your-nodejs-service-name --since "10 min ago" -f
  • 持续跟随输出:在命令末尾追加 -f 参数

四 日志轮转与长期管理

  • 使用 logrotate 自动轮转并配合 rsyslog 集中管理:
    • 新建配置:sudo nano /etc/logrotate.d/yourapp
    • 示例内容(按天轮转、保留 7 天、压缩、属主 root:adm):
      /path/to/your/logfile.log {
        daily
        rotate 7
        compress
        delaycompress
        notifempty
        create 640 root adm
      }
      
    • 如需通过 rsyslog 转发,可在 /etc/rsyslog.conf/etc/rsyslog.d/50-default.conf 添加规则(示例):
      if $programname == 'yourapp' then /var/log/yourapp.log
      & stop
      
    • 重启服务:sudo systemctl restart rsyslog
    • 轮转后继续跟踪:tail -f /var/log/yourapp.log

五 在Node.js中输出更易实时查看的日志

  • 使用日志库(如 winstonbunyan)按级别输出到文件与控制台,便于筛选与持久化:
    • 示例(winston,输出到文件与控制台,便于 tail -f 实时查看):
      const winston = require('winston');
      const logger = winston.createLogger({
        level: 'info',
        format: winston.format.combine(
          winston.format.timestamp(),
          winston.format.printf(({ timestamp, level, message }) => {
            return `${timestamp} [${level.toUpperCase()}]: ${message}`;
          })
        ),
        transports: [
          new winston.transports.File({ filename: 'app.log' }),
          new winston.transports.Console()
        ]
      });
      
      logger.info('Server started on port 3000');
      logger.error('Database connection failed');
      
    • 结合 PM2--time 或日志库的时间戳,能在实时查看时快速定位问题

0