在 Ubuntu 上优化 Node.js 日志,核心目标是:减少磁盘 I/O、避免阻塞、便于排查、控制体积、方便运维。下面从「日志级别、日志库、写入方式、系统层、运维工具」几个层面系统说明。
| 场景 | 推荐 |
|---|---|
| 通用 | Winston |
| 高性能 | Pino(最快) |
| 简单 | console + 重定向(不推荐生产) |
npm install pino pino-pretty
const pino = require('pino');
const logger = pino({
level: 'info'
});
logger.info('server start');
logger.error('db error');
✅ 优点
export LOG_LEVEL=info
const logger = pino({
level: process.env.LOG_LEVEL || 'info'
});
✅ 生产环境建议:
info 或 warnfs.writeFileSync('app.log', log); // 阻塞
const fs = require('fs');
const stream = fs.createWriteStream('app.log', { flags: 'a' });
const pino = require('pino');
const fs = require('fs');
const stream = fs.createWriteStream('/var/log/node/app.log', { flags: 'a' });
const logger = pino(stream);
sudo mkdir -p /var/log/node
sudo chown node:node /var/log/node
✅ 不要写:
/var/log创建配置:
sudo nano /etc/logrotate.d/node-app
示例:
/var/log/node/*.log {
daily
rotate 7
compress
missingok
notifempty
copytruncate
}
✅ 效果:
logger.info('request received');
或全局替换:
console.log = (...args) => logger.info(args);
const logger = pino(); // 输出到 stdout
docker logs container_id
✅ 推荐:
pm2 logs
pm2 flush
或:
pm2 start app.js --log /var/log/node/app.log
✅ JSON 格式(Pino 默认)
{"level":30,"time":1700000000,"msg":"server start"}
✅ 可接入:
✅ 最佳实践组合
info/var/log/node| 问题 | 原因 |
|---|---|
| 日志卡顿 | console.log / 同步写 |
| 磁盘爆满 | 没做 logrotate |
| 查不到日志 | 目录权限 |
| 性能下降 | debug 级别 |
如果你愿意,可以告诉我:
我可以给你一份 可直接用的 Node.js 日志配置模板。