Debido a la reciente vulnerabilidad encontrada en Log4j, se nos encargó pasar a la versión >= 2.16.0. Inicialmente, mi proyecto usaba <version>1.2.17</version>
Después de agregar la dependencia necesaria y realizar los cambios necesarios, al iniciar una solicitud, aparece el siguiente error:
Causado por: java.lang.NoClassDefFoundError: no se pudo inicializar la clase org.apache.logging.log4j.core.LoggerContext
Mi archivo POM
<dependencies> <dependency> <groupId>javax</groupId> <artifactId>javaee-api</artifactId> <version>8.0</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-api</artifactId> <version>2.16.0</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.16.0</version> </dependency> <dependency> <groupId>com.squareup.okhttp3</groupId> <artifactId>okhttp</artifactId> <version>4.9.1</version> </dependency> <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> <version>4.5.12</version> </dependency> <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpcore</artifactId> <version>4.4.13</version> <type>jar</type> </dependency> <dependency> <groupId>org.json</groupId> <artifactId>json</artifactId> <version>20190722</version> <type>jar</type> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.47</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.10.2</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-annotations</artifactId> <version>2.10.2</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> <version>2.10.2</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.dataformat</groupId> <artifactId>jackson-dataformat-xml</artifactId> <version>2.10.2</version> </dependency> <dependency> <groupId>org.codehaus.sonar</groupId> <artifactId>sonar-plugin-api</artifactId> <version>5.1</version> <scope>provided</scope> </dependency> <dependency> <groupId>javax.validation</groupId> <artifactId>validation-api</artifactId> <version>2.0.0.Final</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.hibernate.validator</groupId> <artifactId>hibernate-validator-annotation-processor</artifactId> <version>6.0.2.Final</version> <scope>provided</scope> </dependency> <dependency> <groupId>com.fasterxml.woodstox</groupId> <artifactId>woodstox-core</artifactId> <version>5.0.2</version> </dependency> <dependency> <groupId>org.apache.velocity</groupId> <artifactId>velocity</artifactId> <version>1.7</version> </dependency> <dependency> <groupId>org.apache.velocity</groupId> <artifactId>velocity-tools</artifactId> <version>2.0</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>5.0.0</version> </dependency> <!-- Tests Dependencies --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> <dependency> <groupId>org.mockito</groupId> <artifactId>mockito-core</artifactId> <version>3.5.13</version> <scope>test</scope> </dependency> <dependency> <groupId>org.glassfish.jersey.core</groupId> <artifactId>jersey-common</artifactId> <version>2.22.2</version> <scope>test</scope> </dependency> <dependency> <groupId>org.hamcrest</groupId> <artifactId>hamcrest-core</artifactId> <version>1.3</version> <scope>test</scope> </dependency> <dependency> <groupId>org.eclipse.microprofile</groupId> <artifactId>microprofile</artifactId> <version>2.0.1</version> <type>pom</type> <scope>provided</scope> </dependency>y mi código y la inicialización de Log4J2
@Stateless public class SessionKeyService { private static final Logger LOGGER = LogManager.getLogger(SessionKeyService.class); public String getSessionKeyID() { try { String url = properties.getProperty(Global.ENDPOINT_URL); ........ SessionKey sessionKey = new SessionKey(); sessionKey.setStatus(tokenObj.optString("Status")); sessionKey.setMessage(tokenObj.optString("Message")); sessionKey.setKey(tokenObj.optString("SessionKey")); return sessionKey.getKey(); } catch (Exception ex) { LOGGER.error("Error: "+ex); } return null; }Archivo XML log4j2
<?xml version="1.0" encoding="UTF-8"?> <Configuration status="info" name="AppName" packages=""> <Appenders> <Console name="LogToConsole" target="SYSTEM_OUT"> <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %m%n"/> </Console> <RollingFile name="LogToRollingFile" fileName="/opt/log/app-name.log" filePattern="logs/$${date:yyyy-MM}/app-%d{MM-dd-yyyy}-%i.log.gz"> <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %m%n"/> <Policies> <TimeBasedTriggeringPolicy /> <SizeBasedTriggeringPolicy size="50 MB" /> </Policies> <DefaultRolloverStrategy max="10"/> </RollingFile> </Appenders> <Loggers> <Root level="INFO"> <!-- <AppenderRef ref="syslogAppender" />--> <AppenderRef ref="LogToRollingFile"/> <AppenderRef ref="LogToConsole" /> </Root> </Loggers> </Configuration>Por favor, no sé dónde aparece el LoggerContext.
Descubrí que el registro de WildFly (WidlFly versión 24) está en conflicto con la aplicación cuando intento implementar.
SOLUCIÓN: creé un jboss-deployment-structure.xml en mi /resources/webapp/WEB-INF/ e incluí lo siguiente
<?xml version="1.0" encoding="UTF-8"?> <jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <deployment> <exclude-subsystems> <subsystem name="logging"/> </exclude-subsystems> </deployment> </jboss-deployment-structure>Encontré este error cuando actualicé la dependencia de log4j-core (porque las versiones anteriores tenían una vulnerabilidad), pero olvidé actualizar la dependencia de log4j-api. Actualizar ambos a la última versión (en el momento de escribir 2.16.0) me lo arregló.
<dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.16.0</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-api</artifactId> <version>2.16.0</version> </dependency>Nos enfrentamos a este problema similar y descubrimos que dos de las dependencias de nuestro proyecto también usaban de forma transitiva archivos jar log4j-core y log4j-api de diferentes/mismas versiones.
Entonces, en el tiempo de ejecución, podría haber una posibilidad de conflicto de múltiples LoggerContext debido a lo cual vimos este error.
Eliminamos el error al excluir esa dependencia ya que no era necesaria. Y funcionó bien para nosotros.
Aunque también podríamos excluir directamente log4j de la dependencia para resolver el problema como se muestra a continuación.
<dependency> <groupId>GroupId</groupId> <artifactId>ArtifactId</artifactId> <version>version</version> <exclusions> <exclusion> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-api</artifactId> </exclusion> <exclusion> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> </exclusion> </exclusions> </dependency>