Log4j 2.8无法在OSGi环境中加载自定义转换器

时间:2017-01-30 14:18:49

标签: java plugins osgi converter log4j2

我目前正在切换到log4j2,而我正在OSGi环境中工作。 log4j 2.7分支中的OSGi存在几个问题,这鼓励我将2.8作为最终库 问题是我在我的项目中实现了几个自定义PatternConverters,我无法让它们加载和识别

DEBUG Initializing configuration XmlConfiguration[location=C:\Program Files\...\etc\log4j2.xml]
.
.
DEBUG Took 0,001043 seconds to load 0 plugins from package common.audit.sink.impl.log4j2.converter

尽管其中至少有10个。以后会导致错误,如:

DEBUG Building Plugin[name=layout, class=org.apache.logging.log4j.core.layout.PatternLayout].
DEBUG PatternLayout$Builder(pattern="%ED;...
ERROR Unrecognized format specifier [ED]
ERROR Unrecognized conversion specifier [ED] starting at position 3 in conversion pattern.

我几乎所有设置都必要(无论如何都适用于2.7) 插件实现已注释,并且根据this guide

实现了 newInstance format 方法

log4j2.xml中的包声明:

<Configuration status="trace" name="Systemtest_Server" packages="common.audit.sink.impl.log4j2.converter">

插件元数据生成并出现在包含插件的* .jar包中

META-INF\org\apache\logging\log4j\core\config\plugins\Log4j2Plugins.dat

在Equinox容器启动时,log4j-core-2.8.jar包与log4j-api-2.8.jar一起激活。配置文件由系统属性指向并且有效(显然来自我收到的调试消息)。

但是,我在log4j Jira上发现了this issue,这是我的问题,因为我在修改 log4j-api-2.8.jar 之前遇到了同样的异常导入 org.apache.logging.log4j.core.util 包,这样我的服务器就可以正常启动了。有一些评论表明这可能导致OSGi中log4j2的不可扩展性。

那么有什么方法可以解决这个问题(快速修复就足够了)?或者,有什么我可能忘记在这里配置?

非常感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

好的,所以我会为自己回答这个问题,也许这对某些人也有帮助。老实说,我做了很多游戏,故障发生在OSGi中,我并不熟悉它。

我最终发现你必须确保这些事情:

  • 必须在OSGi容器中激活捆绑包。不会为插件扫描非活动包。您在配置中将bundle标记为激活的事实并不一定意味着它将实际发生。例如,我的捆绑包清单中的一些错误可以防止这种情况发生。所以要确保我用左边建立捆绑 Export-Package: common.audit.sink.impl.log4j2.*
    Import-Package: *
  • 以下至少有一个必须按住才能加载插件:
    • 您的自定义插件包是log4j-core的一个片段,在其清单中说明: Fragment-Host: org.apache.logging.log4j.core
      可能是正确的方法。
    • 您的软件包的激活优先级与log4j软件包相同(不仅是API,还需要Core才能启用插件搜索)

当然,我的问题中提到的配置也是必需的。在此之后我没有错误,看到了这样的痕迹:

DEBUG Oracle Nashorn Version: 1.8.0_102, Language: ECMAScript, Threading: Not Thread Safe, Compile: true, Names: {nashorn, Nashorn, js, JS, JavaScript, javascript, ECMAScript, ecmascript}
DEBUG Took 0,008133 seconds to load 16 plugins from package common.audit.sink.impl.log4j2.converter
DEBUG PluginManager 'Core' found 112 plugins
DEBUG PluginManager 'Level' found 0 plugins
...
DEBUG Building Plugin[name=layout, class=org.apache.logging.log4j.core.layout.PatternLayout].
DEBUG PatternLayout$Builder(pattern="%ED;%EU;%EL;...
DEBUG Building Plugin[name=appender, class=org.apache.logging.log4j.core.appender.FileAppender].