Node.js 在 Ubuntu 上的日志管理实践
一 日志采集与输出
- 使用内置 console.log / console.error 适合开发调试;生产环境建议使用结构化日志库,便于检索与分析。常见选择:Winston(多传输、易扩展)、Pino(高性能、JSON 友好)、Bunyan(结构化 JSON)、Log4js(功能丰富、可按天轮转)。示例(Winston):
- 安装:
npm install winston
- 配置:
- const winston = require(‘winston’);
const logger = winston.createLogger({
level: ‘info’,
format: winston.format.json(),
transports: [
new winston.transports.File({ filename: ‘error.log’, level: ‘error’ }),
new winston.transports.File({ filename: ‘combined.log’ })
]
});
if (process.env.NODE_ENV !== ‘production’) {
logger.add(new winston.transports.Console({ format: winston.format.simple() }));
}
logger.info(‘Server started’, { port: 3000 });
- 使用进程管理器 PM2 可统一采集与查看日志:
- 安装:
sudo npm install pm2 -g
- 启动:
pm2 start app.js --name my-app
- 查看:
pm2 logs my-app(支持实时 tail、按应用过滤)
二 日志轮转与保留策略
- 应用内轮转(推荐与系统解耦):使用 winston-daily-rotate-file
- 安装:
npm install winston-daily-rotate-file
- 配置示例:
- const DailyRotateFile = require(‘winston-daily-rotate-file’);
const transport = new DailyRotateFile({
filename: ‘logs/application-%DATE%.log’,
datePattern: ‘YYYY-MM-DD-HH’,
zippedArchive: true,
maxSize: ‘20m’,
maxFiles: ‘14d’
});
- 系统级轮转:使用 logrotate(适合 systemd 或写入文件的应用)
- 安装:
sudo apt-get update && sudo apt-get install logrotate
- 新建配置:
sudo nano /etc/logrotate.d/nodejs
- 配置示例(按天轮转、保留 7 天、压缩、空文件不轮转):
- /var/log/nodejs/*.log {
daily
missingok
rotate 7
compress
notifempty
create 0640 root adm
}
- 测试:
sudo logrotate -f /etc/logrotate.d/nodejs
- 若通过 systemd 托管应用,也可在 service 中指定 StandardOutput/StandardError 写入文件,再用 logrotate 管理(示例路径:/var/log/myapp/*.log)
三 集中式日志与可视化
- 使用 rsyslog 将应用日志接入系统日志并转发到集中式系统:
- 安装:
sudo apt-get install rsyslog
- 配置:
sudo nano /etc/rsyslog.d/50-default.conf
- 添加:
if $programname == 'nodejs' then /var/log/nodejs.log 与 & stop
- 重启:
sudo systemctl restart rsyslog
- 使用 ELK Stack(Elasticsearch + Logstash + Kibana) 或 Graylog 做集中采集、检索与可视化;也可结合 Fluentd 统一采集转发
四 日志清理与保留期限
- 临时清理:定位日志目录(如 /var/log/nodejs/ 或 /var/log/syslog)后按需删除
- 示例:
sudo rm -rf /var/log/nodejs/*
- 若日志写入 syslog,可先检索再清理:
grep 'nodejs' /var/log/syslog | xargs sudo rm -f
- 建议通过轮转策略控制保留期,避免直接删除正在写入的日志文件
- 保留期限设置:
- logrotate:通过
rotate 7(保留 7 份/天)或配合 maxage 控制天数
- 应用内:如 winston-daily-rotate-file 的
maxFiles: '14d'(保留 14 天)
五 监控与告警
- 日志可视化与检索:使用 Kibana 构建仪表盘、进行关键字与字段检索
- 指标与可视化:结合 Prometheus(采集指标)与 Grafana(可视化)监控请求延迟、错误率、内存等,与日志联动排查