在 Debian 上配置 Node.js 日志,通常分为 应用层日志 和 系统层日志 两部分。下面按常见场景给你一个完整、实用的说明。
Node.js 本身没有内置日志系统,生产环境建议使用日志库。
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('发生错误');
✅ 推荐路径
/var/log/myapp/
创建目录并设置权限:
sudo mkdir -p /var/log/myapp
sudo chown -R node:node /var/log/myapp
如果你用
root启动 Node,可省略chown
Debian 10+ 默认使用 systemd,这是生产环境标准做法。
sudo nano /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
StandardOutput=append:/var/log/myapp/stdout.log
StandardError=append:/var/log/myapp/stderr.log
[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl start myapp
sudo systemctl enable myapp
查看日志:
journalctl -u myapp -f
Node.js 输出到 console.log 会自动进入 systemd:
journalctl -u myapp
持久化 journal 日志(可选):
sudo mkdir -p /var/log/journal
sudo systemctl restart systemd-journald
Debian 默认使用 logrotate,防止日志占满磁盘。
sudo nano /etc/logrotate.d/myapp
/var/log/myapp/*.log {
daily
rotate 7
compress
missingok
notifempty
create 0640 node node
}
测试:
sudo logrotate -d /etc/logrotate.d/myapp
✅ 推荐做法:
console.log(JSON.stringify({ level: 'info', msg: 'hello' }))
| 项目 | 推荐 |
|---|---|
| 日志库 | winston / pino |
| 日志路径 | /var/log/myapp/ |
| 进程管理 | systemd |
| 日志轮转 | logrotate |
| 错误日志 | 单独文件 + stderr |
| 结构化 | JSON 格式 |
如果你愿意,可以告诉我:
我可以给你一份 完全可直接用的配置模板。