温馨提示×

Debian Node.js日志如何查看与管理

小樊
44
2025-12-20 14:53:33
栏目: 编程语言

Debian 上 Node.js 日志的查看与管理

一 日志来源与存放位置

  • 应用直写文件:使用日志库(如 Winston、Pino、Log4js)写入自定义路径,常见位置为应用目录下的 logs//var/log/ 下的应用专属目录(如 /var/log/nodejs/)。路径完全由应用配置决定。
  • 进程管理日志:使用 PM2 时,日志默认写入当前工作目录的 logs/(如 out.log、error.log),也可在配置中自定义输出文件路径。
  • 系统日志:以 systemd 服务运行时,标准输出与错误会被 journald 捕获,可通过 journalctl 查看;部分应用或框架也可能将错误写入 /var/log/syslog/var/log/messages
  • 常见位置速览:
    • 应用日志:/var/log/yourapp/*.log/var/log/nodejs/*.log、应用目录 logs/
    • 系统日志:/var/log/syslog/var/log/messages
    • PM2 日志:应用目录 logs/out.loglogs/error.log 或自定义路径

二 常用查看与筛选命令

  • 实时查看文件日志:
    • 查看单个文件:tail -f /var/log/nodejs/app.log
    • 查看匹配文件:tail -f /var/log/nodejs/*.log
  • 关键字检索:
    • 在文件中搜索:grep "error" /var/log/nodejs/*.log
    • 结合实时输出:tail -f /var/log/nodejs/app.log | grep --line-buffered "error"
  • 系统日志查询(journalctl):
    • 按服务:journalctl -u nodejs-app.service
    • 按时间:journalctl -u nodejs-app.service --since "2025-12-01" --until "2025-12-20"
    • 查看系统日志:cat /var/log/syslogless /var/log/syslog
  • 分页与检索:
    • 分页查看:less /var/log/syslog
    • 文本编辑器检索:sudo nano /var/log/syslogsudo vim /var/log/syslog

三 日志轮转与清理

  • 使用 logrotate(系统级,适合应用直写文件或 PM2 输出文件)
    • 新建配置:sudo nano /etc/logrotate.d/nodejs
    • 示例配置(按天轮转、保留 7 天、压缩、自动创建):
      /var/log/nodejs/*.log {
        daily
        rotate 7
        compress
        missingok
        notifempty
        create 0644 root root
      }
      
    • 校验与强制执行:
      • 校验:sudo logrotate -d /etc/logrotate.d/nodejs
      • 强制执行:sudo logrotate -f /etc/logrotate.d/nodejs
  • 使用日志库自带的按日轮转(适合应用内精细控制)
    • Winston:使用 winston-daily-rotate-file 插件按天切分日志。
    • Log4js:在 appender 中使用 pattern(如 yyyy-MM-dd)并配置 daysToKeepcompress 等参数实现按日轮转与保留策略。

四 日志库与进程管理配置示例

  • 使用 Winston 写入文件(开发/生产通用)
    const winston = require('winston');
    
    const logger = winston.createLogger({
      level: 'info',
      format: winston.format.json(),
      transports: [
        new winston.transports.File({ filename: 'logs/error.log', level: 'error' }),
        new winston.transports.File({ filename: 'logs/combined.log' }),
      ],
    });
    
    if (process.env.NODE_ENV !== 'production') {
      logger.add(new winston.transports.Console({ format: winston.format.simple() }));
    }
    
    logger.info('Hello, Winston!');
    logger.error('Something went wrong');
    
  • 使用 Log4js 写入文件并配置按日轮转与保留
    const log4js = require('log4js');
    
    log4js.configure({
      appenders: {
        console: { type: 'console' },
        file: {
          type: 'file',
          filename: 'logs/app.log',
          pattern: 'yyyy-MM-dd',
          alwaysIncludePattern: true,
          daysToKeep: 90,
          compress: true,
        },
      },
      categories: {
        default: { appenders: ['console', 'file'], level: 'info' },
      },
    });
    
    const logger = log4js.getLogger();
    logger.info('Hello, Log4js!');
    logger.error('Something went wrong');
    
  • 使用 PM2 管理进程与日志
    • 安装与启动:sudo npm install -g pm2pm2 start app.js --name "my-app"
    • 自定义日志文件:
      {
        "apps": [
          {
            "name": "my-app",
            "script": "app.js",
            "error_file": "logs/err.log",
            "out_file": "logs/out.log"
          }
        ]
      }
      
    • 查看日志:pm2 logspm2 logs my-app

五 故障排查与最佳实践

  • 快速定位思路:
    • 若以服务运行,优先用 journalctl -u your-service 查看启动与异常堆栈;
    • 若为应用直写文件,用 tail -f 实时跟踪并结合 grep 检索 error/Exception/timeout 等关键词;
    • 若为 PM2,使用 pm2 logs 聚合查看 stdout/stderr
  • 日志级别与结构化:
    • 合理使用 debug/info/warn/error 等级,生产环境避免过多 console.log
    • 采用 JSON 结构化日志(如 Winston/Pino),便于检索、分析与对接集中式系统。
  • 安全与合规:
    • 避免记录 密码、密钥、令牌 等敏感信息;必要时做脱敏或哈希处理;
    • 设置合适的文件权限与保留周期,防止日志无限增长。
  • 集中式日志(可选):
    • 将日志发送到 ELK Stack(Elasticsearch/Logstash/Kibana)Graylog 等平台,实现统一检索、可视化与告警。

0