diff --git a/lib/index.js b/lib/index.js
index 4746d6cdcb..90a3088f45 100644
--- a/lib/index.js
+++ b/lib/index.js
@@ -61,6 +61,8 @@ if (cluster.isMaster && config.enableCluster && process.env.NODE_ENV !== 'test'
paths: [],
routes: [],
ips: [],
+ errorPaths: [],
+ errorRoutes: [],
};
app.use(debug);
diff --git a/lib/middleware/onerror.js b/lib/middleware/onerror.js
index fade21bad1..5b6a3c189c 100644
--- a/lib/middleware/onerror.js
+++ b/lib/middleware/onerror.js
@@ -10,5 +10,15 @@ module.exports = async (ctx, next) => {
});
ctx.body = `RSSHub 发生了一些意外:
${err instanceof Error ? err.stack : err}`;
ctx.status = 404;
+
+ if (!ctx.debug.errorPaths[ctx.request.path]) {
+ ctx.debug.errorPaths[ctx.request.path] = 0;
+ }
+ ctx.debug.errorPaths[ctx.request.path]++;
+
+ if (!ctx.debug.errorRoutes[ctx._matchedRoute]) {
+ ctx.debug.errorRoutes[ctx._matchedRoute] = 0;
+ }
+ ctx.debug.errorRoutes[ctx._matchedRoute]++;
}
};
diff --git a/lib/routes/index.js b/lib/routes/index.js
index ac75aa6905..8fe908062f 100644
--- a/lib/routes/index.js
+++ b/lib/routes/index.js
@@ -29,6 +29,24 @@ module.exports = async (ctx) => {
hotPathsValue += `${ctx.debug.paths[item]} ${item}
`;
});
+ let hotErrorRoutesValue = '';
+ if (ctx.debug.errorRoutes) {
+ const errorRoutes = Object.keys(ctx.debug.errorRoutes).sort((a, b) => ctx.debug.errorRoutes[b] - ctx.debug.errorRoutes[a]);
+ const hotErrorRoutes = errorRoutes.slice(0, 30);
+ hotErrorRoutes.forEach((item) => {
+ hotErrorRoutesValue += `${ctx.debug.errorRoutes[item]} ${item}
`;
+ });
+ }
+
+ let hotErrorPathsValue = '';
+ if (ctx.debug.errorPaths) {
+ const errorPaths = Object.keys(ctx.debug.errorPaths).sort((a, b) => ctx.debug.errorPaths[b] - ctx.debug.errorPaths[a]);
+ const hotErrorPaths = errorPaths.slice(0, 30);
+ hotErrorPaths.forEach((item) => {
+ hotErrorPathsValue += `${ctx.debug.errorPaths[item]} ${item}
`;
+ });
+ }
+
const ips = Object.keys(ctx.debug.ips).sort((a, b) => ctx.debug.ips[b] - ctx.debug.ips[a]);
const hotIPs = ips.slice(0, 50);
let hotIPsValue = '';
@@ -97,6 +115,14 @@ module.exports = async (ctx) => {
name: '热门IP',
value: hotIPsValue,
},
+ {
+ name: '报错路由',
+ value: hotErrorRoutesValue,
+ },
+ {
+ name: '报错路径',
+ value: hotErrorPathsValue,
+ },
],
});
};
diff --git a/lib/views/welcome.art b/lib/views/welcome.art
index c7835df201..13a9563ae5 100644
--- a/lib/views/welcome.art
+++ b/lib/views/welcome.art
@@ -91,7 +91,7 @@
debug
{{ each debug }}
- {{ if $value }}
+ {{ if $value && $value.value }}
{{ $value.name }}:
{{@ $value.value }}
diff --git a/test/middleware/debug.js b/test/middleware/debug.js
index dbdec5733a..9baa4ae5be 100644
--- a/test/middleware/debug.js
+++ b/test/middleware/debug.js
@@ -22,6 +22,8 @@ describe('debug', () => {
await request.get('/test/1').set('X-Forwarded-For', '233.233.233.234');
await request.get('/test/2').set('X-Forwarded-For', '233.233.233.233');
await request.get('/test/2').set('X-Forwarded-For', '233.233.233.234');
+ await request.get('/test/empty').set('X-Forwarded-For', '233.233.233.233');
+ await request.get('/test/empty').set('X-Forwarded-For', '233.233.233.234');
const response = await request.get('/').set('X-Forwarded-For', '233.233.233.233');
@@ -46,13 +48,19 @@ describe('debug', () => {
expect(value).toBe('6');
break;
case '热门路由:':
- expect(value).toBe(`5 /test/:id
`);
+ expect(value).toBe(`7 /test/:id
`);
break;
case '热门路径:':
- expect(value).toBe(`3 /test/1
2 /test/2
1 /
`);
+ expect(value).toBe(`3 /test/1
2 /test/2
2 /test/empty
1 /
`);
break;
case '热门IP:':
- expect(value).toBe(`4 233.233.233.233
2 233.233.233.234
`);
+ expect(value).toBe(`5 233.233.233.233
3 233.233.233.234
`);
+ break;
+ case '报错路由:':
+ expect(value).toBe(`2 /test/:id
`);
+ break;
+ case '报错路径:':
+ expect(value).toBe(`2 /test/empty
`);
break;
}
});