Apache CXF 和 Log4j2

Apache CXF and Log4j2

我 运行 独立 Java 应用程序中的嵌入式 JAX-RS Web 服务。我使用带有码头的 Apache CXF 3.3.0 作为 Web 容器。我还使用 Spring 配置 Jetty 和服务 bean。

我的应用程序使用 log4j2,我正在尝试记录 CXF 容器收到的 URL 以进行故障排除。

我在 WebService 接口中添加了以下注释:

@InInterceptors(interceptors = "org.apache.cxf.interceptor.LoggingInInterceptor")

由于我使用 Jetty 而不是 servlet 容器,因此此处记录的说明不起作用: Apache CXF - General CXF Logging

当我在 eclipse 中 运行 应用程序时,URL 将以红色打印到控制台。我使用红色来记录 stderr。

但是当使用 bash:

重定向这些描述符时,log4j 日志文件中没有输出,也没有发送到 stderr 或 stdout 的输出
1> ${LOG_DIR}/stdout.log \
2> ${LOG_DIR}/stderr.log &

我无法通过将 org.apache.cxf.interceptor.LoggingInInterceptor 与 log4j2 结合使用来记录 REQUEST_URL

我可以通过创建自己的 InInterceptor class.

轻松解决这个问题

以下 class 将传入的 REQUEST_URL 很好地记录到我的 log4j2 附加程序中:

public class RefDataInInterceptor extends AbstractPhaseInterceptor<Message> {
   private static final Logger log = 
      LogManager.getLogger(RefDataInInterceptor.class);

   public RefDataInInterceptor() {
      super(Phase.RECEIVE);
   }

   @Override
   public void handleMessage(Message msg) throws Fault {
      log.info(msg.getContextualProperty(Message.REQUEST_URL));
   }
}

我要做的就是更换它:

@InInterceptors(interceptors = "org.apache.cxf.interceptor.LoggingInInterceptor")

有:

@InInterceptors(interceptors = "com.aqua.refdata.RefDataInInterceptor")

这是输出到控制台和日志文件的 log4j2:

2019-07-12 16:13:54.811 [3710][qtp172794870-21][INFO http://localhost:9000/refdata/exec/getDBParam
eters [RefDataInInterceptor.java:19]