包属性未检测到 Log4j2 (2.1) 自定义插件
Log4j2 (2.1) custom plugin not detected by packages attribute
我已将我的 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 文件,或者我到底需要在哪里进行更改..
有两种方法可以让 log4j2 找到您的自定义插件:通过 packages 配置属性和通过 javac 生成的插件 dat 文件。
选项 1:包属性
有一个旧版本的 log4j2,其中 packages 属性不再起作用,但是这个 was fixed 在 2.0.1 中。这应该不再是问题了。
要使用此选项,请将插件的包名称 class 放入 packages
属性中。例如,如果您的插件的完全限定 class 名称是 com.mycompany.myproduct.MyPlugin
,那么您的 log4j2.xml 配置文件使用
<Configuration status="trace" packages="com.mycompany.myproduct">
...
status="trace"
属性将显示控制台上显示的内部 log4j2 调试语句。这可能有助于解决任何问题,例如,如果找不到您的插件。
选项2:插件dat文件
如果使用class路径中的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
,所以这就是您需要在配置中使用的名称。不是 class 名称(尽管它们可以相同)。
使用您的插件的示例配置如下所示:
<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>
...
如果以上方法不足以解决问题,请 post 更详细一点,例如如何在 java 代码中声明插件以及如何在 [=51] 中配置插件=].
我已将我的 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 文件,或者我到底需要在哪里进行更改..
有两种方法可以让 log4j2 找到您的自定义插件:通过 packages 配置属性和通过 javac 生成的插件 dat 文件。
选项 1:包属性
有一个旧版本的 log4j2,其中 packages 属性不再起作用,但是这个 was fixed 在 2.0.1 中。这应该不再是问题了。
要使用此选项,请将插件的包名称 class 放入 packages
属性中。例如,如果您的插件的完全限定 class 名称是 com.mycompany.myproduct.MyPlugin
,那么您的 log4j2.xml 配置文件使用
<Configuration status="trace" packages="com.mycompany.myproduct">
...
status="trace"
属性将显示控制台上显示的内部 log4j2 调试语句。这可能有助于解决任何问题,例如,如果找不到您的插件。
选项2:插件dat文件
如果使用class路径中的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
,所以这就是您需要在配置中使用的名称。不是 class 名称(尽管它们可以相同)。
使用您的插件的示例配置如下所示:
<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>
...
如果以上方法不足以解决问题,请 post 更详细一点,例如如何在 java 代码中声明插件以及如何在 [=51] 中配置插件=].