【问题标题】:Log4j2 (2.1) custom plugin not detected by packages attribute包属性未检测到 Log4j2 (2.1) 自定义插件
【发布时间】:2015-04-20 10:56:40
【问题描述】:

我已将我的 log4j2 自定义插件打包到一个单独的 jar 中(仅包含插件类)并将其放入应用程序类路径中。但它不会被检测到。

我用谷歌搜索发现这是一个错误-不再使用“packages”参数。还有一些链接建议了一些替代方案,其中 maven pom.xml 和 log4j2 插件 dat 文件出现在上下文中。问题是我不熟悉 maven,也不知道 dat 文件是如何生成的。我只知道它包含在 log4j-2.1-core.jar 中,其中现有的 log4j2 插件在 pom.xml 中定义。

有人可以建议我如何让我的自定义插件工作吗?

我经历过这个 - Log4j2 custom plugins - annotation processing with Maven Assembly Plugin

但不清楚。我正在关注解决方案,但不确定如何为自定义插件创建插件 dat 文件或我需要在哪里进行更改..

【问题讨论】:

  • 如下面的回答中指定的,即使 javac CustomPlugin.java -cp log4j-core.jar 也会生成 Log4j2Plugins.dat 文件。无需 Maven 构建或 pom.xml

标签: java logging log4j log4j2


【解决方案1】:

有两种方法可以让 log4j2 找到您的自定义插件:通过 packages 配置属性和通过 javac 生成的插件 dat 文件。

选项 1:packages 属性

有一个旧版本的 log4j2,其中 packages 属性不再起作用,但是 2.0.1 中的 was fixed。这应该不再是问题了。

要使用此选项,请将插件类的包名放在packages 属性中。例如,如果您的插件的完全限定类名是com.mycompany.myproduct.MyPlugin,那么您的 log4j2.xml 配置文件以

开头
<Configuration status="trace" packages="com.mycompany.myproduct">
  ...

status="trace" 属性将显示控制台上显示的内部 log4j2 调试语句。这可能有助于解决任何问题,例如找不到您的插件时。

选项 2:插件 dat 文件

如果您在类路径中使用 log4j-core jar 进行编译,javac 将生成一个 log4j2 插件 dat 文件。 Maven 会自动将其包含在您的 jar 中,但如果您不使用 maven,您可以手动将此文件包含到您的 jar 中。同样,如有必要,请使用 status="trace" 进行故障排除。

配置

完成上述任一操作后,log4j2 即可找到您的插件。下一步是正确配置您的插件。这可能是导致问题的原因。

假设您的插件是一个自定义查找,如下所示:

package com.mycompany.myproduct;

@Plugin(name = "FabLookup", category = StrLookup.CATEGORY)
public class BetterLookup extends AbstractLookup {
    @Override
    public String lookup(final LogEvent event, final String key) {
        return com.mycompany.SomeClass.getValue(key);
    }
}

现在,您声明了插件的名称FabLookup,所以这就是您需要在配置中使用的名称。不是类名(尽管它们可以相同)。

使用您的插件的示例配置如下所示:

<Configuration status="trace" packages="com.mycompany.myproduct">
...
<Appenders>
<RollingFile name="RollingFile" fileName="logs/app.log"
             filePattern="logs/$${date:yyyy-MM}/app-%d{MM-dd-yyyy}.log.gz">

  <!-- use custom lookups to access arbitrary internal system info -->
  <PatternLayout header="${FabLookup:key1} ${FabLookup:key2}">
    <Pattern>%d %m%n</Pattern>
  </PatternLayout>
  <Policies>
    <TimeBasedTriggeringPolicy />
  </Policies>
</RollingFile>
...

如果以上内容不足以解决问题,请发布更多细节,例如您的插件在 java 代码中的声明方式以及在 log4j2.xml 中的配置方式。

【讨论】:

  • 自定义插件现在似乎可以工作了。使用此处定义的 maven 和 pom.xml - github.com/mushkevych/log4j2plugin/blob/…
  • 现在我猜有两个 log4jPlugin.dat 文件,一个在核心中,另一个在自定义 jar 中,希望这不会在将来造成任何问题。目前看来工作正常。 @Remko Popma 感谢您的描述性回答
  • 单独 jar 文件中的插件 dat 文件将单独处理。除非您将具有同名的插件声明为内置插件,否则这不会导致问题。
  • 选项 1 对我有用 - 非常简单。如果你有多个包,你可以用逗号分隔(“com.acme.logger,com.my.logger”)
  • 请注意,如果您使用的是较新版本的 Gradle,则必须将其添加到您的依赖项中以生成 dat 文件annotationProcessor('org.apache.logging.log4j:log4j-core:2.13.3')
猜你喜欢
  • 2015-05-13
  • 2016-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-27
  • 2010-09-06
相关资源
最近更新 更多