Configuración de log4j2: no se ha encontrado ningún archivo de configuración de log4j2

91

Últimamente decidí aprender a usar el registrador log4j2. Descargué los archivos jar requeridos, creé la biblioteca, el archivo de configuración xml e intenté usarlo. Desafortunadamente, obtengo esta declaración en la consola (Eclipse):

ERROR StatusLogger No log4j2 configuration file found. Using default configuration:       logging only errors to the console.

Este es mi código de clase de prueba:

package log4j.test;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

public class Log4jTest
{
    static final Logger logger = LogManager.getLogger(Logger.class.getName());

    public static void main(String[] args) {    
        logger.trace("trace");
        logger.debug("debug");
        logger.info("info");
        logger.warn("warn");
        logger.error("error");
        logger.fatal("fatal");
    }
}

Y mi archivo de configuración xml:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration package="log4j.test" 
               status="WARN">
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
        </Console>
    </Appenders>
    <Loggers>
        <Logger name="log4j.test.Log4jTest" level="trace">
            <AppenderRef ref="Console"/>
        </Logger>
        <Root level="trace">
            <AppenderRef ref="Console"/>
        </Root>
    </Loggers>
</Configuration>

Intenté también con xml sin <Logger>etiquetas, y la especificación del paquete y en varios directorios de carpetas / paquetes, pero no ayudó. Ahora mi log4j2.xmlarchivo se encuentra directamente en la carpeta del proyecto en eclipse.

Qbisiek
fuente
2
El documento dice, solo tiene que estar en el classpath. ¿Lo es?
Fildor
sí, me lo perdí. Perdón por la pregunta estúpida y gracias :)
Qbisiek

Respuestas:

139

¿Es este un simple proyecto java de eclipse sin maven, etc.? En ese caso, deberá colocar el log4j2.xmlarchivo en la srccarpeta para poder encontrarlo en la ruta de clases. Si usa maven, póngalo debajo src/main/resourcesosrc/test/resources

Tomasz W
fuente
4
¡Mi héroe! Tenía el archivo de configuración en la ruta de clase (creo), pero no estaba en la carpeta src. ¡Lo mudé allí y está funcionando ahora!
Shadoninja
¿Cómo se configura con un proyecto maven? (como el método maven porque supongo que si pongo un 'log4j2.xml' debajo del classpath funcionaría), gracias por los consejos :)
Enrique San Martín
log4j2.xml está en mi src (Proyecto JavaFX sin maven) pero no se encuentra ... ¿Es esto tan complicado?!?! :(
Ewoks
2
Para sbtlas log4j2.xmlentradas src/main/resourcestambién.
Akavall
No puedo encontrar este archivo log4j2.xml
Karthiga
32

Debe elegir una de las siguientes soluciones:

  1. Coloque el archivo log4j2.xml en el directorio de recursos de su proyecto para que log4j ubique los archivos en la ruta de clase.
  2. Utilice la propiedad del sistema -Dlog4j.configurationFile = file: /path/to/file/log4j2.xml
Abdulghaffar Al-Labadi
fuente
1
-Dlog4j.configurationFilees lo que necesitaba, ya que el proyecto en el que estoy trabajando no está basado en Maven. Awesome
Kimchi Man
15

Estaba siguiendo las documentaciones: Apache Log4j2 Configuratoin y Apache Log4j2 Maven en la configuración de log4j2 con yaml. Según la documentación, se requieren las siguientes dependencias de maven:

  <dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-api</artifactId>
    <version>2.8.1</version>
  </dependency>
  <dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-core</artifactId>
    <version>2.8.1</version>
  </dependency>

y

<dependency>
    <groupId>com.fasterxml.jackson.dataformat</groupId>
    <artifactId>jackson-dataformat-yaml</artifactId>
    <version>2.8.6</version>
</dependency>

El simple hecho de agregar estos no eligió la configuración y siempre dio error. La forma de depurar la configuración mediante la adición -Dorg.apache.logging.log4j.simplelog.StatusLogger.level=TRACEayudó a ver los registros. Más tarde tuvo que descargar la fuente usando Maven y la depuración ayudó a comprender las clases dependientes de log4j2. Están listados en org.apache.logging.log4j.core.config.yaml.YamlConfigurationFactory:

com.fasterxml.jackson.databind.ObjectMapper
com.fasterxml.jackson.databind.JsonNode
com.fasterxml.jackson.core.JsonParser
com.fasterxml.jackson.dataformat.yaml.YAMLFactory

Agregar mapeo de dependencia para jackson-dataformat-yamlno tendrá las dos primeras clases. Por lo tanto, agregue la jackson-databinddependencia para que la configuración de yaml funcione:

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.8.6</version>
</dependency>

Puede agregar la versión consultando la Test Dependenciessección del log4j-apielemento de versión del Repositorio MVN . Por ejemplo, para la versión 2.8.1 de log4j-api, consulte este enlace y busque la jackson-databindversión.

Además, puede usar el siguiente código Java para verificar si las clases están disponibles en la ruta de clases:

System.out.println(ClassLoader.getSystemResource("log4j2.yml")); //Check if file is available in CP
ClassLoader cl = Thread.currentThread().getContextClassLoader(); //Code as in log4j2 API. Version: 2.8.1
 String [] classes = {"com.fasterxml.jackson.databind.ObjectMapper",
 "com.fasterxml.jackson.databind.JsonNode",
 "com.fasterxml.jackson.core.JsonParser",
 "com.fasterxml.jackson.dataformat.yaml.YAMLFactory"};

 for(String className : classes) {
     cl.loadClass(className);
 }
James Jithin
fuente
4

Además de lo que escribió Tomasz W, al iniciar su aplicación, podría usar la configuración:

-Dorg.apache.logging.log4j.simplelog.StatusLogger.level=TRACE 

para solucionar la mayoría de los problemas de configuración.

Para obtener más información, consulte Preguntas frecuentes de Log4j2: ¿Cómo depuro mi configuración?

Seweryn Habdank-Wojewódzki
fuente
3

Eclipse nunca verá un archivo hasta que fuerce una actualización del IDE. ¡Es una característica! Entonces, puede colocar el archivo en todo el proyecto y Eclipse lo ignorará por completo y arrojará estos errores. Presiona actualizar en la vista del proyecto Eclipse y luego funciona.

Mike Ashby
fuente
0

En mi caso, tuve que ponerlo en la carpeta bin de mi proyecto, incluso el hecho de que mi classpath está configurada en la carpeta src. No tengo idea de por qué, pero vale la pena intentarlo.

Florian
fuente
Esto sugiere que el proyecto no reconoce que la carpeta que contiene su configuración es una carpeta de recursos, por lo que no copia el archivo automáticamente como parte de la compilación. Sugeriría investigar esto más a fondo porque eventualmente realizará un cambio en la fuente que no se copiará en la carpeta bin y terminará pasando años preguntándose por qué su cambio no funcionó.
Sarah Phillips