Node.js 在 CentOS 上的日志管理方法
一 核心原则与选型
二 应用内日志配置示例
// 安装: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') });
// 安装:npm i pino pino-pretty
// 运行时:node app.js | pino-pretty
const pino = require('pino')();
pino.info({ event: 'user.login', userId: 42 }, '用户登录成功');
// 安装:npm i morgan
const express = require('express');
const morgan = require('morgan');
const app = express();
app.use(morgan('combined')); // 或 'tiny' / 'dev'
npm i -g pm2
pm2 start app.js --name myapp
pm2 logs myapp # 实时查看
pm2 monit # 资源与日志概览
以上示例覆盖了常用的库选型、分级、结构化输出、按天轮转与 PM2 日志查看。
三 系统级日志轮转与 Syslog 传输
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 复制后截断原文件,适用于持续写入的进程(避免重启应用)
# 安装与启用
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
// 安装: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 远程传输的常用做法。
四 集中式日志与监控告警
五 排错与运维要点
# 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 # 强制执行
以上要点可帮助定位常见权限、轮转、性能与检索问题。