- 首页 >
- 问答 >
-
编程语言 >
- CentOS上Node.js日志如何查看与管理
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 监控与告警。