在WildFly 8中转储HTTP请求

28
为了在开发过程中调试HTTP请求,我希望我的WildFly 8应用服务器将HTTP请求(包括请求方法和标头)转储到日志文件中。可以使用server.log
在WildFly的HTTP子系统的源代码中,我找到了RequestDumpingHandler和相应的日志类别io.undertow.request.dump
然而,我无法弄清楚如何安装该标头,以便它适用于由我的应用程序(一个带有一些静态资源和JAX-RS处理程序的WAR)提供的所有请求。
相应的文档页面(Undertow web subsystem configuration)并没有真正解释处理程序。配置部分中有一个<handler>元素。
<?xml version="1.0" ?>
<server xmlns="urn:jboss:domain:2.1">
    ...
    <profile>
        ...
        <subsystem xmlns="urn:jboss:domain:undertow:1.1">
        <buffer-cache name="default"/>
        <server name="default-server">
            <http-listener name="default" socket-binding="http"/>
            <host name="default-host" alias="localhost">
                <location name="/" handler="welcome-content"/>
                <filter-ref name="server-header"/>
                <filter-ref name="x-powered-by-header"/>
            </host>
        </server>
        <servlet-container name="default">
            <jsp-config/>
        </servlet-container>
        <handlers>
            <file name="welcome-content" path="${jboss.home.dir}/welcome-content"/>
            <!-- <dump-request /> ?? or something?-->
        </handlers>
        <filters>
            <response-header name="server-header" header-name="Server" header-value="WildFly/8"/>
            <response-header name="x-powered-by-header" header-name="X-Powered-By" header-value="Undertow/1"/>
        </filters>
        </subsystem>
        ...
    </profile>
    ...
</server>

但据我所知,那里只期望出现<file>和代理。

我该如何在WildFly中记录传入HTTP请求的全部细节?我知道我可以在JAX-RS层安装一些日志记录机制,但我希望有一个转储机制来处理REST API调用和静态资源。

3个回答

43

您需要将RequestDumpingHandler添加到处理程序链中。

作为wildfly 8.1的一部分,这还不是一个友好的方式来实现。

在8.2和9中有所改进,因此您可以通过添加类似以下内容来配置:

<host name="default-host" >
     .....
     <filter-ref name="request-dumper"/>
</host>
....
<filters>
    ...
    <filter name="request-dumper" class-name="io.undertow.server.handlers.RequestDumpingHandler" module="io.undertow.core" />
</filters>

在8.1中,现在唯一的选择是添加ServletExtension http://undertow.io/undertow-docs/undertow-docs-1.2.0/#servlet-extensions

这将把RequestDumpingHandler添加到外部链中。

顺便说一下,8.2版本即将发布,所以您可以等待它或者只需构建8.x分支的源代码。

要通过CLI添加上述配置,可以使用以下命令:

/subsystem=undertow/configuration=filter/custom-filter=request-dumper:add(class-name="io.undertow.server.handlers.RequestDumpingHandler", module="io.undertow.core")
/subsystem=undertow/server=default-server/host=default-host/filter-ref=request-dumper:add

并在调试后删除配置:

/subsystem=undertow/server=default-server/host=default-host/filter-ref=request-dumper:remove
/subsystem=undertow/configuration=filter/custom-filter=request-dumper:remove

4
请问是否有一种方法可以使用此处理程序同时转储请求/响应正文呢? - tarilabs
1
@ctomc 有没有办法打印出 HTTP 请求和响应的内容? - Zeus
@tarilabs,你解决这个问题了吗? - Zeus
1
@Zeus 你好,很久不见了。如果我没记错的话,我还需要执行其他自定义的请求/响应操作,最终我写了自己的自定义处理程序而不是默认的处理程序。 - tarilabs
如何使用 jboss-cli 添加此过滤器? - guest
已在Wildfly 11中确认。谢谢。 - java-addict301

6
在Wildfly 9和10.1.0上,只需添加即可正常工作。

            <subsystem xmlns="urn:jboss:domain:undertow:3.1">
            <server name="default-server">
            <host name="default-host" alias="localhost">
                <access-log/>
            </host>
            </server>
            </sub-system>

3
请注意,access-log 只会将请求写入 access.log 文件中,而不记录头部或正文。 - Olivier Masseau

3

有一些人在询问如何获取整个HTTP主体的日志,而不仅仅是头部。

似乎已经有一个答案存在:https://8bitplatoon.blogspot.com/2017/02/dumping-http-requests-and-responses-in.html

简而言之,如果该链接无法使用,则可以通过向standalone.xml添加简单的附加项来解决问题:

<system-properties>
  <property name="com.sun.xml.ws.transport.http.HttpAdapter.dump" value="true"/>
</system-properties>

我在 <extensions>...</extensions><management>...</management> 之间添加了这个,重启了 wildfly,然后能够在我的服务器日志(在我的情况下是 server.log)中获得完整的 HTTP 正文。

据我所知,这与 Undertow 的 "request dumper" 没有任何交互或依赖关系,您可以执行其中之一、另一个或两者皆可。


4
不与我在Wildfly 10上一起工作,我已经重启了Wildfly。 - Abdullah
你是否按照我评论中仍然有效的链接将其放置在正确的位置?(选项2) - NAN
这里无法使用JBoss 7.3。我正在使用cli设置属性并重新加载。 - Heiner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接