Log4j2自定义插件在EAR中不起作用

时间:2015-10-20 13:21:43

标签: java logging log4j log4j2

我正在将EAR应用程序从Log4J 1.2.17迁移到Log4J2 2.4。请在下面找到EAR结构。

EAR
-- APPLICATION JAR 1 (contains custom plugin)
-- APPLICATION JAR 2
-- APPLICATION JAR 3 (contains custom plugin)
-- APPLICATION JAR 4
-- APPLICATION WAR 1
-- APPLICATION WAR 2
-- APPLICATION WAR 3
-- OTHER THIRD PARTY APIs
-- lib/log4j-api-2.4.jar
-- lib/log4j-core-2.4.jar
-- lib/log4j-jcl-2.4.jar
-- lib/log4j-web-2.4.1.jar
-- META-INF/log4j2.xml
-- META-INF/MANIFEST.MF (contains all jars in class-path entry)

所有jar中的自定义插件类都在同一个包中 - com.test.it.logging

PFB初始化代码。

  1. 添加自定义插件包。

    PluginManager.addPackage( “com.test,it.logging”);

  2. 使用log4j2.xml初始化日志记录配置。

  3. String path =“path / log4j2.xml”;
    System.setProperty(“log4j.configurationFile”,路径);

    没有检测到定义的自定义插件,我尝试了所有可用的组合来初始化log4j2.xml和插件初始化但没有任何效果。

    我觉得自定义插件在EAR中完全不起作用,因为我尝试了所有的排列和组合。这是log4j2中的BUG(版本:2.4)吗?如果不是,那么请指导我如何在EAR中定义包含自定义插件的日志记录配置,其中包含分散在EAR中许多jar中的自定义插件?

    任何人都可以告诉我如何配置

    另外,PFB我的问题在stackoverflow中发布了同样的内容。

    Custom plugin not getting detected in EAR with log4j2 API

    我正在使用Wildfly 8.2.0-Final AS和maven来构建EAR。

    只是添加一条注释,我总是在包含自定义插件的Jars中找到Log4JPlugins.dat文件,而不管我尝试检测插件的选项。

    您的回复对我非常重要,谢谢。

2 个答案:

答案 0 :(得分:0)

我不相信log4j类可以看到战争和应用程序jar的classloaers。

答案 1 :(得分:0)

编译自定义插件时,Log4J pom.xml定义了一个插件,可以自动生成文件中的缓存数据META-INF / org / apache / logging / log4j / core / config / plugins / Log4j2Plugins.dat 您可以在Maven项目中的目标/类下看到这一点。

log4j-core-2.x.x.jar还包含一个定义其缓存数据的Log4j2Plugins.dat。

问题是在使用ShrinkWrap测试EAR时会创建一个JAR,并且通常将log4j-core-2.xxjar Log4j2Plugins.dat添加到测试JAR中,因为它很可能是类路径中的第一个。 / p>

这意味着您的自定义插件缓存缺失。

使用ShrinkWrap的解决方案是创建一个新的Log4j2Plugins.dat,将所有必需的自定义插件缓存文件与核心合并,然后将其添加到JAR。

以下功能实现了......

private static void mergeLog4J2Log4j2PluginsFile(JavaArchive ja, Class... uniqueJARClasses) {
  // @Author: Johnathan Ingram <jingram@rogueware.org>
  // Log4J2 uses /META-INF/org/apache/logging/log4j/core/config/plugins/Log4j2Plugins.dat within a JAR to define custom plugins
  //        This is automatically generated by the plugin defined in the log4j-core-2.x.x pom.xml when compiling your custom plugin
  //        The problem with shrinkwrap is that the JAR is not preserved and only a single 
  //        /META-INF/org/apache/logging/log4j/core/config/plugins/Log4j2Plugins.dat
  //        file can exist as JAR files cannot be added to a JAR file as a library.
  //        This is normally the default contained in log4j-core-2.x.x.jar which does not expose any custom plugins
  //        To rectify, both the core and the custom plugin JAR file Log4j2Plugins.dat need to be merged into a single Log4j2Plugins.dat
  try {
     // List of a unique class in each JAR containing a Log4j2Plugins.dat requiring merging
     Vector<URL> datUrls = new Vector<URL>();
     for (Class klass : uniqueJARClasses) {
        // Find  the JAR the class belongs to
        URL classLoc = klass.getProtectionDomain().getCodeSource().getLocation();
        URL resourceURL = classLoc.toString().endsWith(".jar")
                ? new URL("jar:" + URLDecoder.decode(classLoc.toString(), "UTF-8") + "!/META-INF/org/apache/logging/log4j/core/config/plugins/Log4j2Plugins.dat")
                : new URL(URLDecoder.decode(classLoc.toString(), "UTF-8") + "/META-INF/org/apache/logging/log4j/core/config/plugins/Log4j2Plugins.dat");
        datUrls.add(resourceURL);
     }

     // Use the Log4J2 PluginCache to build a merged Log4j2Plugins.dat
     File mergedDatFile = new File("target/Log4j2Plugins.dat");
     try (FileOutputStream fo = new FileOutputStream(mergedDatFile)) {
        org.apache.logging.log4j.core.config.plugins.processor.PluginCache pc = new org.apache.logging.log4j.core.config.plugins.processor.PluginCache();
        pc.loadCacheFiles(datUrls.elements());
        pc.writeCache(fo);
     }

     // Replace the default Log4j2Plugins.dat if present
     ja.delete("/META-INF/org/apache/logging/log4j/core/config/plugins/Log4j2Plugins.dat");
     ja.addAsManifestResource(mergedDatFile, "org/apache/logging/log4j/core/config/plugins/Log4j2Plugins.dat");

  } catch (Exception ex) {
     ex.printStackTrace(System.err);
  }
}

运行:

JavaArchive ja = ShrinkWrap.create(JavaArchive.class, "my-test.jar");
...
mergeLog4J2Log4j2PluginsFile(ja, org.apache.logging.log4j.core.config.plugins.processor.PluginCache.class, MyCustomPlugin.class);