如何在ActiveMQ中启用HTTP请求日志记录以跟踪RESTful API请求?

How to enable HTTP request logging in ActiveMQ for tracking RESTful API requests?

提问人:datenstation 提问时间:11/7/2023 最后编辑:Justin Bertramdatenstation 更新时间:11/14/2023 访问量:79

问:

我正在使用 ActiveMQ 5.15.16 并使用 RESTful API 进行消息处理。我想为 ActiveMQ RESTful API 启用传入 HTTP 请求的日志记录,以便跟踪和分析请求。但是,我不确定如何实现这一目标。

我通读了有关如何配置 Jetty 请求日志的文档,但我无法在 ActiveMQ 中找到正确的文件来编写相应的日志记录配置。

有人可以指导我如何在 ActiveMQ 中启用 HTTP 请求日志记录以跟踪 RESTful API 请求吗?

Jetty ActiveMQ码头

评论

1赞 Justin Bertram 11/8/2023
Jetty 配置在 中完成。您应该能够创建一个新的 Bean 并将其添加到该 Bean 的处理程序列表中。conf/jetty.xmlorg.eclipse.jetty.server.handler.RequestLogHandlerServer
1赞 Justin Bertram 11/8/2023
值得注意的是,基于 REST 的消息传递没有行业标准,因此通过在 ActiveMQ“Classic”中采用 API,您将自己锁定在该特定实现中。一般来说,建议人们使用 STOMP 而不是 REST,因为 STOMP 是一种广泛采用的行业标准协议,其设计类似于 HTTP,并且具有与 HTTP 一样多的跨平台和语言支持。这样可以避免供应商锁定。需要明确的是,我是作为 ActiveMQ 项目的提交者这么说的。
0赞 Justin Bertram 11/8/2023
您使用的是哪个版本的 ActiveMQ?
0赞 datenstation 11/8/2023
@JustinBertram 谢谢你的建议。我同意专用的消息传递协议比 REST 更可取。但在某些情况下,通信伙伴的能力可能相当有限,而 REST 是唯一的选择。我在问题中添加了我的 ActiveMQ 版本。
0赞 Justin Bertram 11/8/2023
如前所述,STOMP在各种平台上都有非常好的支持,所以我认为他们很有可能可以使用STOMP客户端实现 - 即使(也许特别)在功能有限的环境中。在许多方面,STOMP比HTTP更简单。

答:

0赞 Matt Pavlovich 11/7/2023 #1

您有以下几种选择:

  1. 通过码头记录。听起来这是你开始的方法。在这种情况下,您很可能有一个 log4j2 配置来整理 ActiveMQ 问题。

  2. 使用日志代理插件,该插件可以通过代理记录所有协议的处理: 日志代理插件

1赞 datenstation 11/9/2023 #2

创建一个新的 org.eclipse.jetty.server.handler.RequestLogHandler bean 并将其添加到 Server Bean 的处理程序列表中

码头.xml

<bean id="requestLogHandler" class="org.eclipse.jetty.server.handler.RequestLogHandler">
    <property name="requestLog">
        <bean class="org.eclipse.jetty.server.CustomRequestLog">
            <constructor-arg index="0">
                <bean class="org.eclipse.jetty.server.AsyncRequestLogWriter">
                    <property name="append" value="true" />
                    <property name="filename" value="M:/logs/activemq/requests-yyyy_mm_dd.log" />
                    <property name="timeZone" value="CET" />
                    <property name="retainDays" value="10" />
                </bean>
            </constructor-arg>
            <!--constructor-arg index="1" value="#{T(org.eclipse.jetty.server.CustomRequestLog).EXTENDED_NCSA_FORMAT}" /-->
            <constructor-arg index="1" value="%{client}a - %u %{dd/MMM/yyyy:HH:mm:ss ZZZ|CET}t &quot;%r&quot; %s %O &quot;%{Referer}i&quot; &quot;%{User-Agent}i&quot;" />
        </bean>
    </property>
</bean>

<bean id="Server" depends-on="jettyPort" class="org.eclipse.jetty.server.Server" destroy-method="stop">
    <property name="handler">
        <bean id="handlers" class="org.eclipse.jetty.server.handler.HandlerCollection">
            <property name="handlers">
                <list>
                    <ref bean="contexts" />
                    <ref bean="securityHandler" />
                    <ref bean="requestLogHandler" />
                </list>
            </property>
        </bean>
    </property>
</bean>

评论

0赞 Joakim Erdfelt 11/10/2023
请注意,在 Jetty 9+ 中,使用 .用于特定于上下文的日志记录,而用于所有请求,甚至那些不属于上下文的请求。Server.setRequestLog(new CustomRequestLog())RequestLogHandlerServer.setRequestLog()
1赞 Joakim Erdfelt 11/14/2023
该属性用于滚动文件时的文件名。文件中 timeZone 的日志记录由 CustomRequestLog 模式控制(有关详细信息,请参阅 javadoc)。timeZone