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

Log4j 2.8 cannot load custom converters in OSGi environment

我目前正在切换到 log4j2,并且在 OSGi 环境中工作。 log4j 2.7 分支中的 OSGi 出现了几个问题,这促使我选择 2.8 作为最终库。
问题是我在我的项目中实现了几个自定义 PatternConverter,但我无法加载和识别它们

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)。
插件实现已注释,newInstanceformat 方法均根据 this guide

实现

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

log4j-core-2.8.jar 包在 Equinox 容器启动时与 log4j-api-2.8.jar 一起激活。配置文件由系统 属性 指向并且可以工作(显然从我收到的调试消息中可以看出)。

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

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

非常感谢您的帮助。

好的,所以我要自己回答这个问题,也许它也会对其他人有所帮助。我做了很多尝试,老实说,错误出在我不太熟悉的 OSGi 上。

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

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

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

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].