在 Ubuntu 上处理 Node.js 日志,通常从 日志输出方式、日志收集、日志切割、日志查看与监控 几个方面来做。下面给你一套实战常用方案,从简单到规范。
console.log / console.error(不推荐生产)console.log('info');
console.error('error');
✅ 简单
❌ 无级别、无文件、难管理
常用库:
| 库 | 特点 |
|---|---|
| winston | 最常用,支持多 transport |
| pino | 高性能,JSON 日志 |
| log4js | 类似 Java log4j |
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' })
]
});
logger.info('server start');
logger.error('db error');
/var/log/myapp/
├── error.log
├── combined.log
✅ 简单
❌ 文件会无限增长
# /etc/systemd/system/myapp.service
[Unit]
Description=Node App
After=network.target
[Service]
ExecStart=/usr/bin/node /opt/myapp/app.js
Restart=always
StandardOutput=journal
StandardError=journal
User=ubuntu
[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl start myapp
sudo systemctl enable myapp
journalctl -u myapp -f
✅ 自动轮转
✅ 与系统日志统一
✅ 不需要自己写文件
npm install -g pm2
pm2 start app.js --name myapp
pm2 logs myapp
pm2 logs myapp --lines 100
~/.pm2/logs/
✅ 自动切割
✅ 重启、监控方便
logrotatesudo vim /etc/logrotate.d/myapp
/var/log/myapp/*.log {
daily
rotate 7
compress
missingok
notifempty
copytruncate
}
✅ 防止磁盘爆满
pm2 install pm2-logrotate
pm2 set pm2-logrotate:max_size 10M
pm2 set pm2-logrotate:retain 7
Node.js + Winston
↓
PM2
↓
pm2-logrotate
Node.js
↓
systemd
↓
journalctl
✅ Docker / systemd / PM2 场景:推荐
logger.add(new winston.transports.Console());
| 需求 | 方案 |
|---|---|
| 集中日志 | ELK / Loki |
| 实时分析 | Grafana |
| 报警 | Sentry / Prometheus |
如果你愿意,可以告诉我:
我可以帮你 定制一套最合适的 Node.js 日志方案。