在 Debian 上配置 Node.js 日志,通常可以从 应用层(Node.js 代码) 和 系统层(systemd / logrotate) 两个维度来做。下面按常见实战场景给你一个完整说明。
Node.js 不建议直接用 console.log 上生产,推荐使用成熟日志库。
| 库 | 特点 |
|---|---|
| winston | 最常用,支持多 transport |
| pino | 性能最好,JSON 日志 |
| bunyan | JSON 日志,可读性好 |
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' })
]
});
// 开发环境额外输出到控制台
if (process.env.NODE_ENV !== 'production') {
logger.add(new winston.transports.Console({
format: winston.format.simple()
}));
}
logger.info('服务启动');
logger.error('发生错误');
✅ 日志文件默认在 项目目录 下
✅ 可区分 error / info / warn
Debian 建议日志放在:
/var/log/myapp/
sudo mkdir -p /var/log/myapp
sudo chown node:node /var/log/myapp # 或你的运行用户
new winston.transports.File({
filename: '/var/log/myapp/combined.log'
})
# /etc/systemd/system/myapp.service
[Unit]
Description=Node.js App
After=network.target
[Service]
Type=simple
User=node
WorkingDirectory=/opt/myapp
ExecStart=/usr/bin/node index.js
Restart=always
Environment=NODE_ENV=production
[Install]
WantedBy=multi-user.target
journalctl -u myapp -f
✅ 即使 Node.js 不写文件,也能看到 stdout / stderr
✅ 适合容器、云服务器
[Service]
StandardOutput=journal
StandardError=journal
或:
sudo journalctl --vacuum-size=100M
如果你 自己写日志文件(如 winston),一定要配置 logrotate。
sudo nano /etc/logrotate.d/myapp
/var/log/myapp/*.log {
daily
rotate 7
compress
missingok
notifempty
create 0640 node node
copytruncate
}
✅ 每天轮转
✅ 保留 7 天
✅ 自动压缩
pm2 logs
pm2 flush
PM2 默认日志位置:
~/.pm2/logs/
可配置:
pm2 start app.js --log /var/log/myapp/app.log
| 层级 | 推荐方案 |
|---|---|
| 应用日志 | winston + /var/log/myapp |
| 服务管理 | systemd |
| 系统查看 | journalctl |
| 日志轮转 | logrotate |
| 开发调试 | console |
如果你愿意,我可以:
你现在用的是 哪种方式运行 Node.js?