在 Debian 上利用 Node.js 日志进行故障排查
一、定位日志来源与快速查看
二、提升日志可观测性
const winston = require('winston');
const logger = winston.createLogger({
level: process.env.LOG_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' }),
new winston.transports.Console()
]
});
logger.info('服务启动', { port: 3000 });
logger.error('异常发生', { err: err.message, stack: err.stack });
const morgan = require('morgan');
app.use(morgan('combined', { stream: { write: msg => logger.info(msg.trim()) } }));
三、日志轮转与运维安全
/var/log/myapp/*.log {
daily
rotate 7
missingok
notifempty
compress
create 0640 nodeuser nodegroup
}
调试与强制执行:logrotate -d /etc/logrotate.conf # 语法检查
logrotate -f /etc/logrotate.conf # 强制执行
sudo mkdir -p /var/log/myapp
sudo chown -R nodeuser:nodegroup /var/log/myapp
sudo chmod -R 755 /var/log/myapp
sudo -u nodeuser node app.js
四、典型排查路径与命令清单
process.on('unhandledRejection', (reason, p) => {
logger.error('Unhandled Rejection', { reason, stack: reason?.stack, promise: p });
});
process.on('uncaughtException', (err) => {
logger.error('Uncaught Exception', { err: err.message, stack: err.stack });
process.exit(1); // 安全退出,交由进程管理重启
});
五、进阶与集中化