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

一、查看方式与常用命令
在 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 则专注于查看 SSH 服务相关的安全日志。
- 直接查看应用日志文件(适用于日志输出到文件的场景):
- 实时跟踪:使用
tail -f logs/app.log 命令可以实时监控日志文件尾部的变化。
- 分页查看:面对大量日志时,
less logs/app.log 命令支持上下翻页和搜索。
- 关键字检索:组合命令
grep -i "error" logs/app.log | tail -n 50 可以快速定位并显示最近的50条错误信息。
- 使用 PM2 内置日志(适用于 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(审计事件)。
二、应用内日志配置与最佳实践
掌握查看方法之外,从源头配置和管理好日志更为关键。良好的日志配置能让后续的故障排查和数据分析事半功倍。
- 选择日志库与结构化输出:
- Node.js 生态中,Winston(功能丰富、支持多传输方式)、Pino(以高性能、低开销著称)、Bunyan(专注于结构化 JSON 日志)、Log4js(布局和输出器非常灵活)都是流行的选择。
- 关键建议:生产环境尽量输出 JSON 格式的结构化日志。这种格式便于后续的日志检索、聚合分析以及导入到 ELK 等系统中。
- 设置合理日志级别:
- 常见的日志级别包括: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 {dailyrotate 7compressmissingoknotifemptycopytruncatedateext}
- 测试与强制执行:配置完成后,可以使用
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小时监控和智能告警奠定基础。