当前位置: 首页 > 面试题库 >

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

卢涵畅
2023-03-14
问题内容

我已经将我的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配置文件

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

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

选项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,因此这是您需要在配置中使用的名称。不是类名(尽管它们可以相同)。

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

<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中配置插件。



 类似资料:
  • 我正在尝试为log4j2.0创建一个自定义appender,但是在获取log4j配置以识别appender时遇到问题。我知道log4j 2.0不支持配置属性中的包。因此,正如这里所建议的,我尝试使用纯javac运行代码,但即使如此,它也会出现以下错误: 这是我的自定义附件: 和我的配置xml: 提前感谢您提供的有用信息

  • 问题内容: 检查JavaScript中的对象属性是否为最佳方法是什么? 问题答案: 检查属性值是否为特殊值的通常方法是: 要检查对象是否实际上没有这样的属性,并因此在尝试访问它时默认情况下将返回: 检查与标识符关联的值是否为特殊值, 或者 尚未声明该标识符。注意:此方法是引用 未声明的标识符(注意:与的值不同)的唯一方法,且不会出现早期错误: 在ECMAScript 5之前的JavaScript版

  • 试图向OpenLDAP添加一个新属性,但总是碰壁。我正在尝试向架构添加ipPhone属性,因为我不能在默认的telephoneNumber属性中包含*数字。 下面是我的LDIF文件,用于创建新属性并将其与objectClass类似。 我已经测试和谷歌了几个小时,但一直无法解决这个问题或找出我错过了什么!

  • 我创建了一个自定义追加器,但在运行测试时没有调用它。以下是这些属性的外观: 我的appender被称为WindowsEventLogappender。知道我的档案有什么问题吗?我看到了控制台测试消息,但没有看到来自我的appender的消息。现在我只是在我的自定义追加器中做一个system.out.println来验证它是否被调用。

  • 我基于此主题为log4j2记录器做了一个包装:如何向log4j消息添加前缀(在对象级别) 以下是我所拥有的: 进口org.apache.log4j.记录仪; 用法: 问题: 作为输出,我有一个到类的链接 "LogWrapper.java:17"它没有指向中调用记录器的行。 如何解决?

  • 我从一个xml模式生成java类,对于一个复杂类型,我希望jaxb使用一个现有的类,我有一个外部绑定定制文件。自定义类被解组为正确的,除了该类型的单个属性,该属性从未在java类中填充。 下面是类型/类问题的演示。 模式中定义的内容是: 读取匹配xml文件的代码段是: 在这个xml中阅读: 使用JAXB生成的Thing类(不使用自定义xjb),输出符合预期: 使用只有getters的自定义Thin