SvelteKit生产Node服务器404错误日志刷屏,如何禁用?
解决SvelteKit Node.js服务器被爬虫探测产生的404日志问题
针对你遇到的爬虫探测不存在路径导致日志被稀释的问题,提供三个层级的解决方案,按推荐优先级排序:
1. 在Caddy反向代理层拦截(推荐)
直接在Caddy层拦截这类探测请求,不转发给后端Node.js服务器,从根源避免日志生成。修改你的Caddyfile,添加路径匹配规则:
# 假设你的原有配置框架如下 your-domain.com { # 先添加拦截规则,放在反向代理配置之前 @badPaths { # 精确匹配已知探测路径 path /.env /login.action /about # 正则匹配所有.git相关路径(覆盖更全面) path_regexp ^/\.git/.* } # 对匹配请求直接返回404,不转发到后端 respond @badPaths 404 # 原有反向代理配置 reverse_proxy localhost:3000 }
若想彻底丢弃请求(不给爬虫返回任何内容),可将respond @badPaths 404改为drop @badPaths,但返回404更符合HTTP规范。
2. 修改SvelteKit日志配置过滤特定错误
如果无法在Caddy层拦截,可通过自定义SvelteKit的日志器过滤特定404错误:
方法A:修改svelte.config.js
在SvelteKit配置文件中覆盖错误日志输出逻辑:
import adapter from '@sveltejs/adapter-node'; export default { kit: { adapter: adapter({ out: 'build', env: { host: '0.0.0.0', port: '3000' } }), logger: { error: (err) => { const targetPaths = ['/.git/config', '/.env', '/login.action', '/about']; // 判断是否为爬虫探测的404错误 const isBad404 = err.message?.startsWith('Error: Not found: ') && targetPaths.some(path => err.message.includes(path)); // 仅输出非探测类错误 if (!isBad404) console.error(err); } } } };
方法B:自定义Node.js启动文件(适配Pino日志)
若你的SvelteKit使用默认的Pino日志库,可在自定义启动文件中配置日志过滤:
import { createServer } from './build/index.js'; import pino from 'pino'; const logger = pino({ level: 'info', transport: { target: 'pino-pretty', options: { filter: (log) => { const targetPaths = ['/.git/config', '/.env', '/login.action', '/about']; // 过滤目标路径的404日志 if (log.msg?.startsWith('Error: Not found: ') && targetPaths.some(path => log.msg.includes(path))) { return false; } return true; } } } }); createServer({ logger }).listen({ port: 3000 });
3. 临时方案:通过Shell管道过滤日志输出
若需快速生效且不想修改配置,可在启动服务器时用grep过滤日志输出:
node build/index.js | grep -v "Error: Not found: /\.git/config\|Error: Not found: /\.env\|Error: Not found: /login.action\|Error: Not found: /about"
注意:该方案仅事后过滤终端输出,后端仍会生成日志,仅适合临时场景。
内容的提问来源于stack exchange,提问作者Plagiatus
相关产品推荐
相关产品推荐

