当前位置: 首页 > 知识库问答 >
问题:

如何将Log4j2 ThreadContext值注入Jersey的LoggingFeature

酆俊远
2023-03-14

我想在日志文件中记录服务器的请求/响应。我正在使用Springboot球衣2. x log4j2。我像这样注册了泽西的日志功能-

jerseyConfig.register(
    new LoggingFeature(
          java.util.logging.Logger.getLogger(
                     LoggingFeature.DEFAULT_LOGGER_NAME),
          java.util.logging.Level.SEVERE,
          LoggingFeature.Verbosity.PAYLOAD_ANY,
          Integer.MAX_VALUE)
);

log4j2。xml

<!-- Jersey logger -->
<AsyncLogger name="org.glassfish" level="all" additivity="false">
    <AppenderRef ref="Console" level="off" />
    <AppenderRef ref="RollingFileIO" level="error" />
</AsyncLogger>

在模式中,我在log4j2的ThreadContext的帮助下注入事务id。我的pom中有log4j jul 2.1。xml,我正在使用它运行它

-Djava。util。登录中。manager=org。阿帕奇。登录中。log4j。七月。日志管理器

一切正常,唯一的问题是,在jersey的日志中,我无法插入事务id。我使用自定义代码尝试了utils日志,并且我能够将事务id放入其中。但当jersey写入这些日志时,ThreadContext被清除,事务id值变为空。

共有2个答案

刘德义
2023-03-14

我没有详细介绍Jersey,但从问题描述来看,它似乎有一个线程模型,这使得使用ThreadContext非常困难。

幸运的是,Log4j 2.7提供了一种工具,允许您将键值对(如ID)注入来自ThreadContext以外的另一个源的日志事件中。引入它是为了帮助使用异步框架,比如Finagle,因此它也可能对Jersey有用。

Log4j2手册在Custom ContextDataInjectors一节中简要介绍了此功能。

如果要使用此功能,需要编写一个自定义的ContextDataInjector,并通过指定ContextDataInjectorFactory告诉Log4j使用该注入器而不是默认注入器。您的自定义注入器需要从某处获取键值对。在泽西岛的情况下,他会请求上下文。getProperty和setProperty是否合适?

申屠乐池
2023-03-14

如果日志流为JUL-

在写入日志时包括线程上下文:

PatternLayout提供打印ThreadContext映射和堆栈内容的机制。

  • 单独使用%X可包含地图的全部内容
  • 使用%X{key}包含指定的键
  • 使用%x包含堆栈的全部内容

如果流量log4j2-

文档中的所有示例都显示ThreadContext是在调用记录器之前设置的。这意味着您必须在执行任何代码之前设置ThreadContext

 类似资料:
  • 问题内容: 我有灰熊提供的球衣。 我有一个实现类。但是,为所有传入请求创建一次此类。因此,这样做: 该为空。我可以将上下文注入到被调用的实际端点中,但这相当粗陋和丑陋,对我来说真的没有用;因为我希望记录各种请求。理想情况下,希望在请求的ResponseFilter端获取此对象。 必须有一种简单的方法来执行此操作。到目前为止,我所看到的所有问题/答案都不适用于Grizzly,也无法插入REST端点调

  • 我有一个方法 我可能更容易获得查询参数的映射。

  • null 所以我创建了SFFactory类并在ApplicationConfig中注册它。 Sffactory.java ApplicationConfig.java

  • 我已经尝试了这里列出的技术:将EJB注入JAX-RS(RESTful服务) 这里的直接注入技术只是给出一个。技术提供了,因为它似乎是在提取本地接口的完全限定名。更改代码只使用接口名称似乎没有帮助。 我在耳朵里包装。EJB在JAR中,Jersey资源在WAR中。 在WebLogic10.3.6上的Java EE5上EJB注入到Jersey中是可能的吗?

  • 问题内容: 从头开始,在没有任何Jersey 1.x知识的情况下,我很难理解如何在Jersey 2.0项目中设置依赖项注入。 我也知道HK2在Jersey 2.0中可用,但是我似乎找不到帮助Jersey 2.0集成的文档。 pom.xml 我可以让容器启动并使用我的资源,但是一旦我将@Inject添加到MyService,框架就会引发异常: 问题答案: 你需要定义一个并将其注册到你的JAX-RS应