温馨提示×

Ubuntu Nodejs日志怎么优化

小樊
53
2026-07-21 19:32:50
栏目: 编程语言

在 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 结构化日志

pino(性能最优)

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(生产环境)

原因

  • 同步 I/O
  • 阻塞事件循环
  • 无法分级
  • 无法按日期切分

生产环境禁用 console.log

if (process.env.NODE_ENV === 'production') {
  console.log = () => {};
}

四、日志文件优化(Ubuntu 重点)

1️⃣ 按日期自动切分(防止磁盘爆)

使用 winston + daily-rotate-file

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 天日志


2️⃣ 日志目录权限(Ubuntu 必做)

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

(或你的运行用户)


五、配合 Ubuntu logrotate(强烈推荐)

创建 logrotate 配置

sudo vim /etc/logrotate.d/node-app
/var/log/node-app/*.log {
    daily
    rotate 7
    compress
    missingok
    notifempty
    copytruncate
}

✅ 防止日志无限增长


六、JSON 日志(便于 ELK / Grafana)

pino 示例

const logger = pino({
  formatters: {
    level: (label) => ({ level: label })
  }
});

输出:

{"level":"info","msg":"server start","time":1700000000000}

✅ 非常适合:

  • Elasticsearch
  • Loki
  • Datadog

七、请求日志优化(Express / Koa)

不要每条请求都写磁盘

✅ 使用中间件采样:

if (Math.random() < 0.1) {
  logger.info('Request', req.url);
}

✅ 或使用:

  • morgan + stream
  • pino-http
npm 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


如果你愿意,我可以:

  • ✅ 给你一套 Express / NestJS / Koa 日志模板
  • ✅ 帮你设计 ELK / Loki 日志方案
  • ✅ 针对 高并发 / 低内存 场景做定制优化

直接告诉我你的 Node.js 框架和运行环境即可。

0