温馨提示×

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

小樊
37
2025-12-07 22:46:34
栏目: 编程语言

CentOS 上 Node.js 日志查看与管理

一 查看方式与常用命令

  • 使用 journalctl 查看 systemd 服务日志(适用于以服务方式运行的应用):
    • 实时查看:journalctl -u your-nodejs-service.service -f
    • 按时间过滤:journalctl -u your-nodejs-service.service --since "2025-12-07 00:00:00" -u your-nodejs-service.service --until "2025-12-07 12:00:00"
    • 查看内核与系统消息:journalctl -k;查看安全相关:journalctl -u sshd
  • 直接查看应用日志文件(适用于输出到文件的场景):
    • 实时跟踪:tail -f logs/app.log
    • 分页查看:less logs/app.log
    • 关键字检索:grep -i "error" logs/app.log | tail -n 50
  • 使用 PM2 内置日志(适用于 PM2 管理的应用):
    • 实时查看:pm2 logs my-nodejs-app
    • 查看错误日志:pm2 logs my-nodejs-app --err
    • 查看某文件最近 200 行:pm2 logs my-nodejs-app --nostream --lines 200
  • 系统日志目录与用途(便于交叉排查):
    • /var/log/messages(系统与服务常规消息)、/var/log/secure(认证与安全)、/var/log/audit/audit.log(审计事件)。

二 应用内日志配置与最佳实践

  • 选择日志库与结构化输出:
    • Winston(生态丰富、多传输)、Pino(高性能、低开销)、Bunyan(结构化 JSON)、Log4js(灵活布局与 Appender)。
    • 建议生产环境使用 JSON 格式,便于检索与聚合分析。
  • 设置合理日志级别:
    • 常见级别:fatal / error / warn / info / debug / trace;生产常用 info / warn / error,调试阶段开启 debug
  • 示例(Winston,区分错误与合并日志,控制台与文件双输出):
    • 安装:npm i winston
    • 配置:
      • const winston = require(‘winston’); const { combine, timestamp, printf, errors } = winston.format; const logger = winston.createLogger({ level: ‘info’, format: combine( timestamp({ format: ‘YYYY-MM-DD HH:mm:ss’ }), errors({ stack: true }), printf(({ level, message, timestamp, stack }) => stack ? [${timestamp}] ${level.toUpperCase()}: ${message}\n${stack} : [${timestamp}] ${level.toUpperCase()}: ${message} ) ), transports: [ new winston.transports.File({ filename: ‘logs/error.log’, level: ‘error’ }), new winston.transports.File({ filename: ‘logs/combined.log’ }), new winston.transports.Console({ format: winston.format.colorize() }) ], exitOnError: false }); module.exports = logger;
  • HTTP 请求日志(Express + morgan):
    • 安装:npm i morgan winston
    • 使用:
      • const morgan = require(‘morgan’); const logger = require(‘./logger’); const stream = { write: msg => logger.info(msg.trim()) }; app.use(morgan(‘combined’, { stream }));
  • 目录与权限:
    • 建议日志落盘到 /var/log/your-app/,并设定属主为运行用户(如 nodejs:nodejs):
      • sudo mkdir -p /var/log/your-app
      • sudo touch /var/log/your-app/error.log /var/log/your-app/combined.log
      • sudo chown -R nodejs:nodejs /var/log/your-app。

三 日志轮转与保留策略

  • 使用 logrotate(系统级,适用于直接写文件的场景):
    • 新建配置:sudo vim /etc/logrotate.d/nodejs-app
    • 示例策略(按天轮转、保留 7 天、压缩、空文件不轮转、轮转后截断原文件、文件名加日期):
      • /var/log/your-app/*.log { daily rotate 7 compress missingok notifempty copytruncate dateext }
    • 测试与强制执行:sudo logrotate -f /etc/logrotate.d/nodejs-app
  • 使用 PM2 Logrotate 插件(适用于 PM2 管理):
    • 安装:pm2 install pm2-logrotate
    • 常用策略:
      • pm2 set pm2-logrotate:max_size 10M
      • pm2 set pm2-logrotate:retain 7
      • pm2 set pm2-logrotate:compress true
      • pm2 set pm2-logrotate:rotateInterval “0 0 * * *”
    • 重启生效:pm2 restart all
  • 使用 winston-daily-rotate-file(应用内按天切分):
    • 安装:npm i winston-daily-rotate-file
    • 示例:
      • const DailyRotateFile = require(‘winston-daily-rotate-file’); const transport = new DailyRotateFile({ filename: ‘logs/myapp-%DATE%.log’, datePattern: ‘YYYY-MM-DD’, zippedArchive: true, maxFiles: ‘14d’ }); logger.add(transport);
  • 选择建议:已用 PM2 优先用其插件;直接写文件的服务优先用 logrotate;需要按天归档与保留策略时可在应用内使用 daily-rotate-file

四 集中式日志与远程传输

  • 使用 rsyslog 发送到远程日志服务器(UDP 示例):
    • 安装:sudo yum install -y rsyslog
    • 启用 UDP 模块(取消注释或添加):
      • module(load=“imudp”)
      • input(type=“imudp” port=“514”)
    • 转发规则(在 /etc/rsyslog.conf 或 /etc/rsyslog.d/ 下新增):*.* @remote_server_ip:514
    • 重启:sudo systemctl restart rsyslog
  • 应用内发送到 Syslog(Winston + winston-syslog):
    • 安装:npm i winston winston-syslog
    • 配置:
      • const winston = require(‘winston’); const SyslogTransport = require(‘winston-syslog’).SyslogTransport; const logger = winston.createLogger({ transports: [ new SyslogTransport({ host: ‘remote_server_ip’, port: 514, protocol: ‘udp4’ }) ] });
  • 集中式分析与可视化:
    • 使用 ELK Stack(Elasticsearch + Logstash + Kibana)Graylog 做日志收集、索引、检索与仪表盘展示,便于 7×24 监控与告警。

0