El complemento personalizado no se detecta en EAR con log4j2 API

Estoy migrando una aplicación EAR de log4j a log4j2 . Tuve clases que extendían agregadores, filtros, diseños en diferentes tarros de EAR y ahora los he convertido en complementos. Esto significa que tengo complementos personalizados en más de un tarro (suponga 3 tarros).

No estoy usando el atributo de packages en log4j2.xml y estoy inicializando el sistema de registro mediante el uso del argumento JVM Dlog4j.configurationFile que apunta a la ubicación log4j2.xml en META-INF de EAR.

Agregar el complemento a continuación en los tres proyectos jar no funcionó.

  org.apache.maven.plugins maven-compiler-plugin   log4j-plugin-processor  compile  process-classes  only  org.apache.logging.log4j.core.config.plugins.processor.PluginProcessor      

Diseño de patrón: en el siguiente patrón de diseño, e es el patrón personalizado donde se escribe un complemento convertidor de patrón personalizado para convertir esta cadena.

 %d %-5p [%c{1}] [EventId: %e] [%t] %m%n 

Plugin convertidor personalizado para el diseño del patrón anterior (en jar1):

jar1 tiene el archivo Log4J2Plugins.dat bajo META-INF en la carpeta org.apache..

 @Plugin(name = "EventPatternConverter", category = "Converter") @ConverterKeys({"e"}) public class EventPatternConverter extends LogEventPatternConverter { protected EventPatternConverter(String name, String style) { super(name, style); } public static EventPatternConverter newInstance(String[] options) { return new EventPatternConverter("e", "e"); } @Override public void format(LogEvent event, StringBuilder toAppendTo) { String eventId= ""; // Append empty string (OR) value toAppendTo.append(eventId); } } 

Pero, estoy recibiendo el error de abajo

 ERROR Unrecognized format specifier [e] 

Incluso, ninguno de los complementos personalizados se identifica porque estoy obteniendo invalid element para el rest de los complementos personalizados que están disponibles en jar2, jar3 y todos tienen el archivo Log4J2Plugins.dat .

 ERROR File contains an invalid element or attribute "TestFilter" 

Estoy usando log4j-api-2.4.jar , log4j-core-2.4.jar , log4j-jcl-2.4.jar , log4j-web-2.4.1.jar , commons-logging-1.1.1.jar en el EAR .

He definido un complemento de convertidor de patrones personalizado y espero que este convertidor se aplique a todo el diseño de patrones, incluido el diseño de patrones predeterminado definido mediante . Es esto correcto ?

Si es así, por favor, ayude si alguien se enfrentó a este problema y guíeme si estoy equivocado al definir el complemento personalizado, ya que no se detectan en los archivos jar en EAR.

Al comstackr un complemento personalizado, Log4J pom.xml define un complemento que genera automáticamente datos de caché en el archivo META-INF / org / apache / logging / log4j / core / config / plugins / Log4j2Plugins.dat. Puede ver esto debajo de su destino. / Clases en un proyecto Maven.

El log4j-core-2.xxjar también contiene un Log4j2Plugins.dat que define sus datos de caché.

El problema es que se crea un solo JAR cuando se prueba un EAR con ShrinkWrap y normalmente el log4j-core-2.xxjar Log4j2Plugins.dat se agrega al JAR de prueba, ya que probablemente sea el primero en la ruta de clase.

Esto significa que falta el caché de complementos personalizado.

La solución que utiliza ShrinkWrap es crear un nuevo Log4j2Plugins.dat que combine los archivos de caché de complementos personalizados necesarios con los núcleos y luego los agregue al JAR.

La siguiente función logra que …

 private static void mergeLog4J2Log4j2PluginsFile(JavaArchive ja, Class... uniqueJARClasses) { // @Author: Johnathan Ingram  // 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.xx 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.xxjar 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 datUrls = new Vector(); 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); } } 

Para ejecutar usando tu ejemplo:

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