如何配置jetty-maven-plugin单独追踪含头信息的HTTP请求响应
当然可以!我之前也遇到过类似的问题——用mvn -X jetty:run虽然能拿到完整的HTTP请求响应头,但Maven的调试输出实在太杂,根本找不到重点。下面是几种精准获取所需信息的方案,完全不用忍受冗余输出:
方案1:使用Jetty DebugHandler 精准输出请求/响应详情
Jetty自带的DebugHandler可以专门输出完整的HTTP请求、响应头(甚至请求体),同时我们可以通过调整日志级别屏蔽Maven的冗余调试内容。
步骤1:创建Jetty配置文件
在项目根目录或src/main/resources下新建jetty-debug.xml,内容如下(注意替换对应Jetty版本的DTD地址,示例为Jetty 10+):
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "https://www.eclipse.org/jetty/configure_10_0.dtd"> <Configure id="Server" class="org.eclipse.jetty.server.Server"> <!-- 挂载DebugHandler,包裹原有Web应用处理器 --> <Set name="handler"> <New class="org.eclipse.jetty.server.handler.DebugHandler"> <Set name="handler"> <Ref refid="ContextHandlerCollection" /> </Set> </New> </Set> </Configure>
步骤2:配置jetty-maven-plugin
在pom.xml的插件配置中引入上述XML,并调整日志级别:
<plugin> <groupId>org.eclipse.jetty</groupId> <artifactId>jetty-maven-plugin</artifactId> <version>你的Jetty版本号</version> <configuration> <!-- 引用自定义Jetty配置 --> <jettyXml>jetty-debug.xml</jettyXml> <!-- 控制日志级别:Jetty输出DEBUG级别的请求信息,Maven只输出INFO及以上 --> <systemProperties> <systemProperty> <name>org.eclipse.jetty.LEVEL</name> <value>DEBUG</value> </systemProperty> <systemProperty> <name>org.apache.maven.LEVEL</name> <value>INFO</value> </systemProperty> </systemProperties> </configuration> </plugin>
运行命令
直接执行:
mvn jetty:run
此时控制台只会输出Maven的基础启动信息,以及Jetty DebugHandler输出的完整HTTP请求/响应头、状态码等细节,完全没有冗余内容。
方案2:自定义请求日志格式(按需输出指定头信息)
如果DebugHandler的输出过于详细(比如包含请求体),你可以自定义Jetty的请求日志,精准指定要记录的请求头和响应头,同时可以选择输出到文件或控制台。
步骤1:创建请求日志配置文件
新建jetty-requestlog.xml:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "https://www.eclipse.org/jetty/configure_10_0.dtd"> <Configure id="Server" class="org.eclipse.jetty.server.Server"> <Get name="handler"> <Set name="handler"> <New class="org.eclipse.jetty.server.handler.RequestLogHandler"> <Set name="handler"> <Ref refid="ContextHandlerCollection" /> </Set> <Set name="requestLog"> <New class="org.eclipse.jetty.server.NCSARequestLog"> <!-- 日志输出位置,也可以设置为控制台:System.out --> <Set name="filename">./logs/jetty-requests.log</Set> <Set name="append">true</Set> <!-- 自定义日志格式,%{HeaderName}i 表示请求头,%{HeaderName}o 表示响应头 --> <Set name="logFormat">%h %l %u %t "%r" %s %b "%{User-Agent}i" "%{Accept}i" "%{Content-Type}o"</Set> </New> </Set> </New> </Set> </Get> </Configure>
步骤2:在pom.xml中引用该配置
和方案1一样,在jetty-maven-plugin的configuration里添加<jettyXml>jetty-requestlog.xml</jettyXml>,然后运行mvn jetty:run即可。
方案3:命令行直接过滤日志级别(快速临时方案)
如果你不想修改配置文件,也可以通过命令行参数直接控制日志级别,只让Jetty输出DEBUG级别的请求信息,同时压低Maven的日志级别:
mvn jetty:run -Dorg.eclipse.jetty.LEVEL=DEBUG -Dorg.apache.maven.LEVEL=WARN
这样Maven只会输出警告和错误信息,而Jetty会输出完整的HTTP请求响应细节,效果和方案1类似,适合临时调试使用。
注意:不同Jetty版本的配置细节可能略有差异,请确保配置文件中的DTD地址和类名与你使用的Jetty版本匹配(比如Jetty 9的DTD地址为
https://www.eclipse.org/jetty/configure_9_4.dtd)。
内容的提问来源于stack exchange,提问作者Claude Brisson

