在 Ubuntu 上,Node.js 日志常见的存储方式主要有以下几种,从简单到规范,你可以按需求选择。
运行 Node.js 时把标准输出重定向:
node app.js > logs/app.log 2>&1
或带日期:
node app.js >> logs/app-$(date +%Y-%m-%d).log 2>&1
❌ 缺点:
| 库 | 特点 |
|---|---|
| winston | 最常用,支持多transport |
| pino | 高性能,JSON日志 |
| bunyan | JSON日志,可读性好 |
npm install winston
const winston = require('winston');
const logger = winston.createLogger({
level: 'info',
format: winston.format.json(),
transports: [
new winston.transports.File({ filename: 'logs/error.log', level: 'error' }),
new winston.transports.File({ filename: 'logs/combined.log' })
]
});
logger.info('hello node log');
目录结构:
project/
├── logs/
│ ├── error.log
│ └── combined.log
└── app.js
✅ 优点:
# /etc/systemd/system/nodeapp.service
[Unit]
Description=Node.js App
After=network.target
[Service]
ExecStart=/usr/bin/node /var/www/app/app.js
WorkingDirectory=/var/www/app
Restart=always
StandardOutput=journal
StandardError=journal
User=ubuntu
[Install]
WantedBy=multi-user.target
启动:
sudo systemctl daemon-reload
sudo systemctl start nodeapp
sudo systemctl enable nodeapp
查看日志:
journalctl -u nodeapp -f
✅ 优点:
new winston.transports.File({
filename: '/var/log/node/app.log'
})
给权限:
sudo mkdir -p /var/log/node
sudo chown ubuntu:ubuntu /var/log/node
sudo nano /etc/logrotate.d/nodeapp
/var/log/node/*.log {
daily
rotate 7
compress
missingok
notifempty
create 0644 ubuntu ubuntu
}
测试:
sudo logrotate -d /etc/logrotate.d/nodeapp
✅ 防止磁盘被日志写满
如果是 Docker:
docker run -v /var/log/node:/app/logs app
✅ 生产环境推荐方案:
/var/log/node/| 问题 | 解决 |
|---|---|
| 日志越来越多 | logrotate |
| 权限不足 | chown |
| PM2 日志乱 | PM2 自带日志管理 |
| 磁盘爆满 | 限制日志大小 |
如果你愿意,可以告诉我:
我可以给你 一套完整可直接用的配置。