2010-12-31 16 views
58

De repente esto sigue sucediendo durante una prueba JUnit. Todo estaba funcionando, escribí algunas pruebas nuevas y ocurrió este error. Si lo revierto, no desaparecerá. ¿Porqué es eso?¿Cómo se configura log4j.properties para SpringJUnit4ClassRunner?

log4j:WARN No appenders could be found for logger (org.springframework.test.context.junit4.SpringJUnit4ClassRunner). 
log4j:WARN Please initialize the log4j system properly. 
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info. 

Respuesta

66

Las nuevas pruebas que escribió (directa o indirectamente) el uso de clases que registro utilizando Log4J.

Es necesario configurar Log4J para que este registro funcione correctamente.

poner un archivo log4j.properties (o log4j.xml) en el raíz de su ruta de clase de prueba.

que debería haber alguna configuración básica, como

# Set root logger level to DEBUG and its only appender to A1. 
log4j.rootLogger=DEBUG, A1 

# A1 is set to be a ConsoleAppender. 
log4j.appender.A1=org.apache.log4j.ConsoleAppender 

# A1 uses PatternLayout. 
log4j.appender.A1.layout=org.apache.log4j.PatternLayout 
log4j.appender.A1.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n 

# An alternative logging format: 
# log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1} - %m%n 

Un salidas appender a la consola por defecto, pero también se puede establecer explícitamente el objetivo de la siguiente manera:

log4j.appender.A1.Target=System.out 

Esto redireccionará todo salida en un buen formato para la consola. Más información se puede encontrar aquí en el Log4J manual,

Log4J Logging se configurará correctamente y esta advertencia desaparecerá.

+1

Sólo como referencia, aquí hay un enlace para la conversión de referencia del patrón: http: //logging.apache. org/log4j/1.2/apidocs/org/apache/log4j/EnhancedPatternLayout.html – lanoxx

+0

¿Puedes explicar por qué estamos haciendo esto? – iLoveCamelCase

+0

project/src/test/resources/log4j.properties –

8

Agregue un archivo log4j.properties (log4j.xml) con al menos un appender en la raíz de su classpath.

El contenido del archivo (log4j.properties) pueden ser tan simples como

log4j.rootLogger=WARN,A1 

# A1 is set to be a ConsoleAppender. 
log4j.appender.A1=org.apache.log4j.ConsoleAppender 
log4j.appender.A1.layout=org.apache.log4j.PatternLayout 
log4j.appender.A1.layout.ConversionPattern=%d{ISO8601} [%t] %-5p %c %x - %m%n 

Esto permitirá el registro de log4j con el nivel de registro predeterminado como WARN y utilizar la consola de Java para registrar los mensajes.

3

Tengo log4j.properties configurado correctamente. Ese no es el problema. Después de un tiempo descubrí que el problema estaba en Eclipse IDE, que tenía una compilación antigua en "caché" y no creaba una nueva (problema de dependencia de Maven). Tuve que construir el proyecto manualmente y ahora funciona.

+0

Hola Tom, ¿podrías explicarnos más sobre este tema? ¡Piensa que también lo estoy experimentando! Gracias – VLostBoy

+0

@ vlostboy: ¿y limpiar el proyecto no ayudó? – user219882

+0

@ vlostboy: La solución que funcionó para mí fue construirlo desde la línea de comandos: 'mvn clean package' – user219882

44

Si no quiere preocuparse por un archivo, se puede hacer algo como esto en su código:

static 
{ 
    Logger rootLogger = Logger.getRootLogger(); 
    rootLogger.setLevel(Level.INFO); 
    rootLogger.addAppender(new ConsoleAppender(
       new PatternLayout("%-6r [%p] %c - %m%n"))); 
} 
+0

¡Guardado por día! Gracias @tster. –

3

que estaba usando Maven en Eclipse y yo no quiero tener una copia adicional de el archivo de propiedades en la carpeta raíz. Usted puede hacer lo siguiente en Eclipse:

  1. de diálogo Abrir plazo (haga clic en la pequeña flecha al lado del botón de reproducción y vaya a ejecutar configuraciones)
  2. Ir a la pestaña "ruta de clases"
  3. Seleccione el "Usuario Entradas "y haga clic en el botón" Avanzado "en el lado derecho.
  4. Ahora seleccione el botón de opción "Agregar carpeta externa".
  5. Seleccione la carpeta de recursos
1

Sé que esto es viejo, pero yo estaba teniendo problemas también.Para Spring 3 usando Maven y Eclipse, tuve que poner log4j.xml en src/test/resources para que la prueba de la Unidad se registrara correctamente. Colocarte en la raíz de la prueba no funcionó para mí. Espero que esto ayude a otros.

2

Como no me gusta tener archivos duplicados (log4j.properties en prueba y principal), y tengo muchas clases de prueba, cada uno corre con la clase SpringJUnit4ClassRunner, así que tengo que personalizarlo. Esto es lo que yo uso:

import java.io.FileNotFoundException; 

import org.junit.runners.model.InitializationError; 
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; 
import org.springframework.util.Log4jConfigurer; 

public class MySpringJUnit4ClassRunner extends SpringJUnit4ClassRunner { 

    static { 
     String log4jLocation = "classpath:log4j-oops.properties"; 
     try { 
      Log4jConfigurer.initLogging(log4jLocation); 
     } catch (FileNotFoundException ex) { 
      System.err.println("Cannot Initialize log4j at location: " + log4jLocation); 
     } 
    } 

    public MySpringJUnit4ClassRunner(Class<?> clazz) throws InitializationError { 
     super(clazz); 
    } 
} 

Cuando lo utilice, reemplace SpringJUnit4ClassRunner con MySpringJUnit4ClassRunner

@RunWith(MySpringJUnit4ClassRunner.class) 
@ContextConfiguration("classpath:conf/applicationContext.xml") 
public class TestOrderController { 
    private Logger LOG = LoggerFactory.getLogger(this.getClass()); 

    private MockMvc mockMvc; 
... 
} 
Cuestiones relacionadas