在 Ubuntu 上优化 Node.js 日志,核心目标是:减少 I/O 压力、避免阻塞、便于排查、控制磁盘占用。下面按“常见场景 + 实战建议”给你一个完整优化方案。
不要所有日志都无脑 console.log。
使用日志级别:
error > warn > info > debug
示例(使用 winston):
logger.error('DB connection failed');
logger.warn('Memory usage high');
logger.info('Server started');
logger.debug('Request params');
✅ 生产环境只开 info / warn / error
| 库 | 特点 |
|---|---|
| winston | 最常用、可扩展 |
| pino | 性能最好(推荐高并发) |
| bunyan | 结构化日志 |
npm install pino pino-pretty
const pino = require('pino');
const logger = pino({
level: 'info'
});
logger.info('Server started');
✅ pino 比 console.log 快 3–5 倍
✅ 生产环境禁用 console.log
if (process.env.NODE_ENV === 'production') {
console.log = () => {};
}
npm install winston winston-daily-rotate-file
const { createLogger, transports } = require('winston');
const DailyRotateFile = require('winston-daily-rotate-file');
const transport = new DailyRotateFile({
dirname: '/var/log/node-app',
filename: '%DATE%.log',
datePattern: 'YYYY-MM-DD',
maxSize: '20m',
maxFiles: '14d'
});
✅ 自动保留 14 天日志
sudo mkdir -p /var/log/node-app
sudo chown -R node:node /var/log/node-app
(或你的运行用户)
sudo vim /etc/logrotate.d/node-app
/var/log/node-app/*.log {
daily
rotate 7
compress
missingok
notifempty
copytruncate
}
✅ 防止日志无限增长
const logger = pino({
formatters: {
level: (label) => ({ level: label })
}
});
输出:
{"level":"info","msg":"server start","time":1700000000000}
✅ 非常适合:
✅ 使用中间件采样:
if (Math.random() < 0.1) {
logger.info('Request', req.url);
}
✅ 或使用:
morgan + streampino-httpnpm install pino-http
app.use(require('pino-http')());
process.on('uncaughtException', err => {
logger.error(err);
process.exit(1);
});
process.on('unhandledRejection', err => {
logger.error(err);
});
✅ 错误日志单独存文件,方便告警
df -h
du -sh /var/log/node-app
iostat -x 1
✅ 防止日志拖垮磁盘 I/O
✅ 使用 pino
✅ 日志按 日期切分
✅ Ubuntu logrotate
✅ 只记录 info+
✅ JSON 格式
✅ 错误单独文件
✅ 禁用 console.log
如果你愿意,我可以:
直接告诉我你的 Node.js 框架和运行环境即可。