我已经将我的log4j2自定义插件打包到一个单独的jar中(仅包含插件类),并将其放在应用程序类路径中。但是不会被检测到。
我用谷歌搜索发现它是一个错误-“ packages”参数不再使用。还有一些链接建议了一些替代方案,其中将maven pom.xml和log4j2插件dat文件放入上下文中。问题是我不熟悉Maven,并且不知道如何生成dat文件。我只知道它包含在log4j-2.1-core.jar中,其中在pom.xml中定义了现有的log4j2插件。
有人可以建议我如何使自定义插件正常工作吗?
我经历了这个-Log4j2自定义插件-使用MavenAssemblyPlugin进行注释处理
但是还不清楚。我正在关注解决方案,但不确定如何为自定义插件创建插件dat文件,或者我到底需要在哪里进行更改。
有两种方法可以使log4j2找到您的自定义插件:通过程序包配置属性和通过javac生成的插件dat文件。
选项1:packages属性
在log4j2的旧版本中,packages属性不再起作用,但是在2.0.1中已修复。这不再是一个问题。
要使用此选项,请将插件类的包名称放在packages属性中。例如,如果您的插件的完全合格的类名称为com.mycompany.myproduct.MyPlugin,则使用以下命令启动log4j2.xml配置文件
packages
com.mycompany.myproduct.MyPlugin
<Configuration status="trace" packages="com.mycompany.myproduct"> ...
该status="trace"属性将显示控制台上显示的内部log4j2调试语句。这可能有助于解决任何问题,例如,如果找不到您的插件。
status="trace"
选项2:插件dat文件
如果使用类路径中的log4j-corejar进行编译,则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,因此这是您需要在配置中使用的名称。不是类名(尽管它们可以相同)。
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中配置插件。