¿Dónde configuro log4j en una clase de prueba JUnit?

85

Mirando el último caso de prueba JUnit que escribí, llamé al método BasicConfigurator.configure () de log4j dentro del constructor de la clase. Eso funcionó bien para ejecutar solo esa clase del comando "ejecutar como caso de prueba JUnit" de Eclipse. Pero me doy cuenta de que es incorrecto: estoy bastante seguro de que nuestro conjunto de pruebas principal ejecuta todas estas clases desde un proceso y, por lo tanto, la configuración de log4j debería estar ocurriendo más arriba en algún lugar.

Pero todavía necesito ejecutar un caso de prueba por sí solo algunas veces, en cuyo caso quiero configurar log4j. ¿Dónde debería colocar la llamada de configuración para que se ejecute cuando el caso de prueba se ejecute de forma independiente, pero no cuando el caso de prueba se ejecute como parte de una suite más grande?

skiphoppy
fuente
Voy a asumir log4j 1.x aquí, no 2 ...
rogerdpack

Respuestas:

51

La LogManagerclase determina qué configuración de log4j usar en un bloque estático que se ejecuta cuando se carga la clase. Hay tres opciones destinadas a los usuarios finales:

  1. Si especifica log4j.defaultInitOverridefalse, no configurará log4j en absoluto.
  2. Especifique usted mismo la ruta al archivo de configuración manualmente y anule la búsqueda de classpath. Puede especificar la ubicación del archivo de configuración directamente mediante el siguiente argumento para java:

    -Dlog4j.configuration=<path to properties file>

    en su configuración de corredor de prueba.

  3. Permita que log4j escanee la ruta de clases en busca de un archivo de configuración log4j durante su prueba. (el valor por defecto)

Consulte también la documentación en línea .

Paul Morie
fuente
¿Cómo sabrá que es un "archivo de configuración log4j"? ¿Cuál es el nombre del archivo? (log4j.xml?)
Chad
1
@Chad: He editado mi respuesta para responder a su pregunta. Consulte el enlace al bloque estático para ver exactamente cómo se implementa.
Paul Morie
Estoy usando log4j2 y tuve que utilizar la siguiente configuración para indicar un archivo: -Dlog4j.configurationFile=log4j2.xml. Además, si usted está tratando de carga de depuración / arranque, este ajuste puede ser útil: -Dlog4j2.debug=true.
Kent
¿Alguna forma de ser un poco más específico en esta respuesta?
markthegrea
61

Por lo general, solo pongo un archivo log4j.xml en src / test / resources y dejo que log4j lo encuentre por sí mismo: no se requiere código, la inicialización predeterminada de log4j lo recogerá. (Normalmente quiero configurar mis propios registradores en 'DEPURACIÓN' de todos modos)

arácnido
fuente
6
Para las pruebas de construcción estándar, establecería Log4j en advertencia o incluso en error. Si las pruebas tienen éxito (también pruebas negativas), no debería haber ningún registro, lo que llama la atención de los usuarios.
keiki
2
Sí, eso es correcto para log4j 1.x. Para log4j2 aparentemente puede usar archivos más "exóticos" como el archivo log4j2-test.properties ... logging.apache.org/log4j/2.x/manual/configuration.html :)
rogerdpack
6

Es posible que desee consultar Simple Logging Facade para Java (SLF4J) . Es una fachada que envuelve Log4j que no requiere una llamada de configuración inicial como Log4j. También es bastante fácil cambiar Log4j por Slf4j ya que las diferencias de API son mínimas.

James McMahon
fuente
5

Yo uso las propiedades del sistema en log4j.xml:

...
<param name="File" value="${catalina.home}/logs/root.log"/>
...

y comience las pruebas con:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.16</version>
    <configuration>
        <systemProperties>
            <property>
                <name>catalina.home</name>
                <value>${project.build.directory}</value>
            </property>
        </systemProperties>
    </configuration>
</plugin>
Gavenkoa
fuente