在 Debian 上优化 Node.js 日志,通常从 日志级别、输出方式、存储与轮转、性能与可观测性 四个层面入手。下面给你一套可落地的优化方案,适合生产环境。
不推荐
console.log('xxx')
推荐
winston(最常用)pino(性能最好,JSON 结构化)bunyan✅ 高并发 / 微服务:pino
✅ 常规业务系统:winston
环境区分:
const logLevel = process.env.NODE_ENV === 'production'
? 'warn'
: 'debug'
常见级别:
error:线上必须warn:异常但不影响主流程info:关键业务节点debug:仅开发环境生产环境不要开 debug / info 过多
Docker / systemd / PM2 都推荐:
info: console
error: console.error
让 Node 不自己管文件,交给系统处理。
[Unit]
Description=Node App
[Service]
ExecStart=/usr/bin/node /var/www/app/index.js
Restart=always
StandardOutput=journal
StandardError=journal
Environment=NODE_ENV=production
[Install]
WantedBy=multi-user.target
查看日志:
journalctl -u your-service -f
✅ 自动轮转
✅ 不丢日志
✅ 支持查询
sudo apt install logrotate
示例配置 /etc/logrotate.d/node-app:
/var/log/node/app.log {
daily
rotate 7
compress
missingok
notifempty
copytruncate
}
如果你是 容器 / systemd,其实不一定需要自己写 logrotate。
pm2 logs
pm2 flush
限制日志大小:
pm2 install pm2-logrotate
pm2 set pm2-logrotate:max_size 10M
pm2 set pm2-logrotate:retain 7
const pino = require('pino')
const logger = pino({
level: 'warn'
})
logger.info('不会输出')
logger.error('error msg')
特点:
JSON 日志示例:
{
"level": "error",
"time": 1700000000000,
"msg": "DB connection failed",
"pid": 1234,
"hostname": "srv1"
}
方便接入:
❌ 在热路径中打印大对象
❌ 同步写文件
❌ 不限制日志大小
❌ 生产环境开 debug
✅ 热点路径只记录统计型数据
✅ 错误日志必须包含 stack
✅ 日志中不要打敏感信息(密码、token)
const pino = require('pino')
const logger = pino({
level: 'warn',
timestamp: pino.stdTimeFunctions.isoTime
})
process.on('uncaughtException', err => {
logger.error(err, 'uncaughtException')
process.exit(1)
})
✅ 日志库:pino
✅ 输出方式:stdout → systemd / Docker
✅ 日志级别:生产 warn+
✅ 轮转:systemd / logrotate / pm2-logrotate
✅ 格式:JSON + 时间戳
✅ 监控:接入 ELK / Loki
如果你愿意,可以告诉我:
我可以给你 完全定制的 Debian + Node.js 日志方案。