温馨提示×

Node.js在CentOS上的日志管理方法

小樊
35
2025-12-05 23:22:32
栏目: 编程语言

Node.js 在 CentOS 上的日志管理方法

一 核心原则与选型

  • 使用成熟的日志库:优先选择 Winston、Pino、Bunyan、Log4js;HTTP 请求日志可配合 Morgan。这些库支持多传输、分级、格式化与扩展。
  • 采用结构化日志:以 JSON 为主,便于检索、分析与可视化。
  • 合理设置日志级别:区分 debug/info/warn/error,生产环境避免过多输出影响性能。
  • 规划日志轮转与保留:避免单文件过大与磁盘占满,按天/按大小归档与压缩。
  • 集中化管理:多实例或集群建议接入 ELK Stack(Elasticsearch、Logstash、Kibana)GraylogFluentd 等。
  • 进程管理:使用 PM2 可简化启动、查看与采集标准输出日志。

二 应用内日志配置示例

  • 使用 Winston 按级别输出到不同文件,并启用按天轮转(winston-daily-rotate-file):
// 安装:npm i winston winston-daily-rotate-file
const winston = require('winston');
const DailyRotateFile = require('winston-daily-rotate-file');

const logger = winston.createLogger({
  level: 'info',
  format: winston.format.combine(
    winston.format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }),
    winston.format.json()
  ),
  transports: [
    new winston.transports.File({ filename: 'logs/error.log', level: 'error' }),
    new DailyRotateFile({
      filename: 'logs/combined-%DATE%.log',
      datePattern: 'YYYY-MM-DD',
      zippedArchive: true,
      maxFiles: '14d'
    }),
    new winston.transports.Console()
  ]
});

logger.info('服务启动', { port: 3000 });
logger.error('数据库错误', { err: new Error('timeout') });
  • 使用 Pino(高性能、JSON 输出,开发时可配合 pino-pretty 美化):
// 安装:npm i pino pino-pretty
// 运行时:node app.js | pino-pretty
const pino = require('pino')();
pino.info({ event: 'user.login', userId: 42 }, '用户登录成功');
  • HTTP 请求日志(Express + Morgan):
// 安装:npm i morgan
const express = require('express');
const morgan = require('morgan');
const app = express();
app.use(morgan('combined')); // 或 'tiny' / 'dev'
  • 使用 PM2 启动与查看日志:
npm i -g pm2
pm2 start app.js --name myapp
pm2 logs myapp        # 实时查看
pm2 monit             # 资源与日志概览

以上示例覆盖了常用的库选型、分级、结构化输出、按天轮转与 PM2 日志查看。

三 系统级日志轮转与 Syslog 传输

  • 使用 logrotate 管理 Node.js 文件日志(推荐):创建配置文件 /etc/logrotate.d/nodejsapp
sudo tee /etc/logrotate.d/nodejsapp <<'EOF'
/path/to/your/nodejsapp/logs/*.log {
    daily
    rotate 7
    compress
    missingok
    notifempty
    create 0640 nodejs nodejs
    copytruncate
}
EOF
# 说明:
# daily        每天轮转;rotate 7 保留7份;compress 压缩旧日志
# missingok     日志不存在时不报错;notifempty 空文件不轮转
# create       轮转后创建新文件并设定属主属组(示例为 nodejs:nodejs)
# copytruncate  复制后截断原文件,适用于持续写入的进程(避免重启应用)
  • 使用 rsyslog 将日志发送到远程 Syslog(UDP 示例):
# 安装与启用
sudo yum install -y rsyslog
sudo systemctl enable --now rsyslog

# 编辑 /etc/rsyslog.conf,启用 UDP 模块并添加转发规则
# 取消注释:
# module(load="imudp")
# input(type="imudp" port="514")
# 添加:
*.* @192.0.2.10:514   # 将日志发送到远程 Syslog 服务器 192.0.2.10:514

sudo systemctl restart rsyslog
  • 应用内 Syslog 传输(Winston + winston-syslog):
// 安装:npm i winston-syslog
const winston = require('winston');
const SyslogTransport = require('winston-syslog').SyslogTransport;

const logger = winston.createLogger({
  level: 'info',
  transports: [
    new SyslogTransport({
      host: '192.0.2.10',
      port: 514,
      protocol: 'udp4'
    })
  ]
});

以上覆盖了文件轮转与 Syslog 远程传输的常用做法。

四 集中式日志与监控告警

  • 集中式日志平台:多实例/微服务建议接入 ELK Stack(Elasticsearch、Logstash、Kibana)GraylogFluentd,统一采集、解析、存储与可视化,便于快速检索与根因分析。
  • 监控与告警:结合 Prometheus + Grafana 对错误率、响应时延、异常日志关键字等指标进行监控与告警,提升稳定性与可观测性。
  • 系统日志联动:Node.js 作为服务运行时,可结合 journaldsystemd 管理单元查看服务标准输出与内核/系统事件,与业务日志交叉验证。

五 排错与运维要点

  • 权限与目录:确保日志目录存在且进程用户(如 nodejs)具备写权限,避免因权限不足导致写入失败。
  • 避免日志丢失:长期运行进程优先使用“复制后截断”(copytruncate)或具备“信号重开文件”能力的日志库/轮转方案,减少重启。
  • 性能与采样:高并发场景优先 Pino/Winston 异步传输,必要时对调试日志进行采样,避免 I/O 成为瓶颈。
  • 保留策略:依据合规与容量规划设置保留周期(如 7–14 天),并定期清理归档。
  • 快速排查命令示例:
# PM2 实时日志
pm2 logs myapp

# 按时间查看系统日志
journalctl -u myapp.service -S "2025-12-01" -U "2025-12-05"

# 关键字检索
grep -i "error" /path/to/your/nodejsapp/logs/*.log

# 查看轮转状态(需安装 logrotate 的 daily 任务)
sudo logrotate -d /etc/logrotate.d/nodejsapp   # 干跑
sudo logrotate -f /etc/logrotate.d/nodejsapp   # 强制执行

以上要点可帮助定位常见权限、轮转、性能与检索问题。

0