温馨提示×

Ubuntu Nodejs日志如何优化

小樊
33
2026-08-20 12:00:37
栏目: 编程语言

在 Ubuntu 上优化 Node.js 日志,通常从日志级别、写入方式、存储策略、性能与监控几个方面入手。下面给你一套实战向的优化方案。


一、选择合适日志库(非常重要)

✅ 推荐

  • 生产: Winston(成熟、可插拔)
  • 开发/轻量: Pino(性能极高,JSON 日志)
  • 避免 console.log(性能差、不可控)

Winston 示例

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');

Pino(高性能)

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',
});

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

1️⃣ 使用日志轮转(必须)

避免磁盘被写满。

方案 A:winston-daily-rotate-file(推荐)

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',
});

方案 B:Ubuntu logrotate(系统级)

sudo nano /etc/logrotate.d/nodeapp
/var/log/myapp/*.log {
  daily
  rotate 14
  compress
  missingok
  notifempty
  copytruncate
}

四、避免阻塞 Node.js 的事件循环

❌ 错误做法

fs.writeFileSync('log.txt', data);

✅ 正确做法

  • 使用流式写入
  • 异步日志
  • 或交给 systemd / journald

五、结合 systemd(Ubuntu 推荐)

1️⃣ 使用 systemd 管理 Node 服务

# /etc/systemd/system/myapp.service
[Service]
ExecStart=/usr/bin/node /opt/app/index.js
StandardOutput=journal
StandardError=journal

查看日志:

journalctl -u myapp -f

✅ 优点:

  • 自动轮转
  • 与系统日志统一
  • 不写文件

六、结构化日志(JSON)

便于 ELK / Grafana / Loki 分析。

{
  "level": "error",
  "message": "DB timeout",
  "service": "user-service",
  "timestamp": "2026-01-21T10:00:00Z"
}

七、减少日志噪音

✅ 控制内容

  • ❌ 不记录整个 req / res
  • ✅ 只记录关键字段
logger.info({
  userId,
  path: req.path,
  method: req.method,
});

✅ 敏感信息过滤

  • 不记录 password / token
  • 不记录身份证、手机号明文

八、性能优化建议

项目 建议
高频日志 Pino
日志量 控制 QPS
磁盘 SSD
存储 不要放 /var/log 根分区
监控 日志大小告警

九、常见错误总结

❌ 生产环境大量 console.log
❌ 日志不轮转
❌ 同步写文件
❌ 日志目录权限不足
❌ 日志打满磁盘导致服务崩溃


十、推荐组合(生产最佳实践)

Node.js + Winston + daily-rotate + systemd
✅ 或 Node.js + Pino + journald


如果你愿意,我可以:

  • 帮你写一套 完整 Winston 生产配置
  • 给你一个 systemd + logrotate 完整示例
  • 根据你的 Express / NestJS / Koa 场景定制方案

0