在 Ubuntu 上优化 Node.js 日志,通常从日志级别、写入方式、存储策略、性能与监控几个方面入手。下面给你一套实战向的优化方案。
console.log(性能差、不可控)npm install winston
const winston = require('winston');
const logger = winston.createLogger({
level: 'info',
format: winston.format.combine(
winston.format.timestamp(),
winston.format.json()
),
transports: [
new winston.transports.File({ filename: 'error.log', level: 'error' }),
new winston.transports.File({ filename: 'combined.log' }),
],
});
logger.info('server started');
logger.error('db connection failed');
npm install pino
const pino = require('pino');
const logger = pino({ level: 'info' });
logger.info('hello pino');
避免生产环境打太多日志。
| 环境 | 推荐级别 |
|---|---|
| 开发 | debug |
| 测试 | info |
| 生产 | warn / error |
const logger = winston.createLogger({
level: process.env.NODE_ENV === 'production' ? 'warn' : 'debug',
});
避免磁盘被写满。
npm install winston-daily-rotate-file
const DailyRotateFile = require('winston-daily-rotate-file');
new DailyRotateFile({
dirname: '/var/log/myapp',
filename: '%DATE%.log',
datePattern: 'YYYY-MM-DD',
maxSize: '20m',
maxFiles: '14d',
});
sudo nano /etc/logrotate.d/nodeapp
/var/log/myapp/*.log {
daily
rotate 14
compress
missingok
notifempty
copytruncate
}
fs.writeFileSync('log.txt', data);
# /etc/systemd/system/myapp.service
[Service]
ExecStart=/usr/bin/node /opt/app/index.js
StandardOutput=journal
StandardError=journal
查看日志:
journalctl -u myapp -f
✅ 优点:
便于 ELK / Grafana / Loki 分析。
{
"level": "error",
"message": "DB timeout",
"service": "user-service",
"timestamp": "2026-01-21T10:00:00Z"
}
logger.info({
userId,
path: req.path,
method: req.method,
});
| 项目 | 建议 |
|---|---|
| 高频日志 | Pino |
| 日志量 | 控制 QPS |
| 磁盘 | SSD |
| 存储 | 不要放 /var/log 根分区 |
| 监控 | 日志大小告警 |
❌ 生产环境大量 console.log
❌ 日志不轮转
❌ 同步写文件
❌ 日志目录权限不足
❌ 日志打满磁盘导致服务崩溃
✅ Node.js + Winston + daily-rotate + systemd
✅ 或 Node.js + Pino + journald
如果你愿意,我可以: