温馨提示×

Nodejs日志Ubuntu如何优化

小樊
42
2026-07-10 05:19:03
栏目: 编程语言

在 Ubuntu 上优化 Node.js 日志,核心目标是:减少磁盘 I/O、避免阻塞、便于排查、控制体积、方便运维。下面从「日志级别、日志库、写入方式、系统层、运维工具」几个层面系统说明。


一、选择合适的日志库(最关键)

✅ 推荐方案

场景 推荐
通用 Winston
高性能 Pino(最快)
简单 console + 重定向(不推荐生产)

Pino(强烈推荐生产)

npm install pino pino-pretty
const pino = require('pino');
const logger = pino({
  level: 'info'
});

logger.info('server start');
logger.error('db error');

✅ 优点

  • 极快(JSON 输出)
  • 不阻塞事件循环
  • 适合 Docker / K8s

二、开启日志级别控制(避免打满磁盘)

1️⃣ 使用环境变量控制

export LOG_LEVEL=info
const logger = pino({
  level: process.env.LOG_LEVEL || 'info'
});

✅ 生产环境建议:

  • infowarn
  • 避免 debug

三、日志写入方式优化(非常重要)

❌ 错误做法

fs.writeFileSync('app.log', log); // 阻塞

✅ 正确做法

1️⃣ 使用流式写入

const fs = require('fs');
const stream = fs.createWriteStream('app.log', { flags: 'a' });

2️⃣ 使用日志库自带文件输出

const pino = require('pino');
const fs = require('fs');

const stream = fs.createWriteStream('/var/log/node/app.log', { flags: 'a' });
const logger = pino(stream);

四、Ubuntu 系统层优化

1️⃣ 日志目录规范

sudo mkdir -p /var/log/node
sudo chown node:node /var/log/node

✅ 不要写:

  • /var/log
  • 项目根目录

2️⃣ 使用 logrotate(防止磁盘爆满)

创建配置:

sudo nano /etc/logrotate.d/node-app

示例:

/var/log/node/*.log {
  daily
  rotate 7
  compress
  missingok
  notifempty
  copytruncate
}

✅ 效果:

  • 每天轮转
  • 保留 7 天
  • 自动压缩

五、避免 console.log(生产环境)

❌ 问题

  • 同步写入
  • 阻塞
  • 难控制

✅ 替代方案

logger.info('request received');

或全局替换:

console.log = (...args) => logger.info(args);

六、Docker / PM2 场景优化

1️⃣ Docker

const logger = pino(); // 输出到 stdout
docker logs container_id

✅ 推荐:

  • 不写文件
  • 交给 Docker / K8s 处理

2️⃣ PM2

pm2 logs
pm2 flush

或:

pm2 start app.js --log /var/log/node/app.log

七、结构化日志(便于分析)

✅ JSON 格式(Pino 默认)

{"level":30,"time":1700000000,"msg":"server start"}

✅ 可接入:

  • ELK
  • Loki
  • Grafana

八、推荐生产配置(总结)

最佳实践组合

  • 日志库:Pino
  • 输出:stdout / 文件流
  • 级别:info
  • 轮转:logrotate
  • 目录:/var/log/node
  • 容器:stdout

九、常见错误 & 排查

问题 原因
日志卡顿 console.log / 同步写
磁盘爆满 没做 logrotate
查不到日志 目录权限
性能下降 debug 级别

如果你愿意,可以告诉我:

  • 是否使用 Docker / PM2
  • 日志量(QPS)
  • 是否已上生产

我可以给你一份 可直接用的 Node.js 日志配置模板

0