包属性未检测到Log4j2(2.1)自定义插件

Xav*_*uza 6 java logging log4j log4j2

我已将我的log4j2自定义插件打包到一个单独的jar(仅包含插件类)中,并将其放在应用程序类路径中.但它没有被发现.

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

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

我经历了这个 - Log4j2自定义插件 - 使用Maven Assembly Plugin进行注释处理

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

Rem*_*pma 6

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

选项1:packages属性

有一个旧版本的log4j2,其中packages属性不再起作用,但这在2.0.1 中修复.这不应该是一个问题.

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

<Configuration status="trace" packages="com.mycompany.myproduct">
  ...
Run Code Online (Sandbox Code Playgroud)

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,您声明了插件的名称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>
...
Run Code Online (Sandbox Code Playgroud)

如果上述内容不足以解决问题,请发布一些更详细的信息,例如您的java代码中如何声明插件以及如何在log4j2.xml中配置它.