我正在尝试部署一个哨兵装置来捕捉我的应用程序中的错误,不知怎的,我真的不明白该怎么做。
我有这个示例应用程序:
const express = require('express');
const app = express();
var Raven = require('raven');
Raven.config('http://6c4b87dasdasdf3ecca9@logs.ekaf.com/7').install();
app.use(Raven.requestHandler());
app.get('/', function mainHandler(req, res) {
throw new Error('Broke!');
});
app.use(Raven.errorHandler());
app.use(function onError(err, req, res, next) {
res.statusCode = 500;
res.end(res.sentry + '\n');
});
const PORT = process.env.PORT || 443;
app.listen(PORT, () => {
console.log(`Server is listening on port ${PORT}`);
});
app.get('/OK', (req, res, next) => {
res.send('route OK');
});
app.get('/KO', (req, res, next) => {
res.send(blabla);
});
Sentry完美记录/
路线上的错误,但/KO
路线上没有任何错误。我想让它记录可能出现在节点控制台中的所有错误,而不使用throw error
。
我该怎么做?
答案 0 :(得分:0)
在所有路线之后放置app.use
行,尤其是onError
处理程序。 Node的本机错误处理可能是在Sentry之前捕获它。
const express = require('express');
const app = express();
var Raven = require('raven');
Raven.config('http://6c4b87dasdasdf3ecca9@logs.ekaf.com/7').install();
app.use(Raven.requestHandler());
app.get('/', function mainHandler(req, res) {
throw new Error('Broke!');
});
const PORT = process.env.PORT || 443;
app.listen(PORT, () => {
console.log(`Server is listening on port ${PORT}`);
});
app.get('/OK', (req, res, next) => {
res.send('route OK');
});
app.get('/KO', (req, res, next) => {
res.send(blabla);
});
app.use(Raven.errorHandler());
app.use(function onError(err, req, res, next) {
res.statusCode = 500;
res.end(res.sentry + '\n');
});
披露:我在Sentry工作,但我没有维护我们的Node SDK。如果您想要更深入的答案,请在节点仓库中打开一个问题。
答案 1 :(得分:0)
我的错误是没有意识到Sentry默认不会捕获4xx错误,请参见here:
默认情况下,errorHandler将仅捕获状态码为500或更高的错误。如果要更改它,请为其提供shouldHandleError回调,该回调将接受中间件错误作为其参数,并通过返回适当的布尔值来确定是否应发送错误。
要捕获所有400
/ 500
错误,请执行以下操作:
app.use(Sentry.Handlers.errorHandler({
shouldHandleError: error => error.status >= 400,
}));