Debian Node.js 日志中的异常处理策略
一 分层捕获与全局兜底
二 日志采集与结构化输出
三 运行环境与系统侧保障
四 监控告警与问题定位
五 最小落地示例
说明:以下示例演示结构化日志、全局兜底与 Express 错误处理的最小组合,生产环境可按需扩展(如增加日志轮转、APM、集中式日志等)。
代码示例
const express = require('express');
const morgan = require('morgan');
const winston = require('winston');
// 结构化日志:error 单独落盘,combined 全量
const logger = winston.createLogger({
level: 'info',
format: winston.format.combine(
winston.format.timestamp(),
winston.format.errors({ stack: true }),
winston.format.json()
),
transports: [
new winston.transports.File({ filename: 'logs/error.log', level: 'error' }),
new winston.transports.File({ filename: 'logs/combined.log' })
]
});
const app = express();
app.use(morgan('combined')); // 访问日志
// 业务路由
app.get('/error', () => { throw new Error('boom'); });
// 统一错误处理中间件
app.use((err, req, res, next) => {
logger.error({ err, req }, 'unhandled error');
res.status(500).json({ error: 'Internal Server Error' });
});
// 全局兜底
process.on('uncaughtException', (err) => {
logger.error({ err }, 'uncaughtException, exiting');
process.exit(1);
});
process.on('unhandledRejection', (reason) => {
logger.error({ reason }, 'unhandledRejection');
});
app.listen(3000, () => logger.info('server listening', { port: 3000 }));
运行与验证