¿Cómo configurar log4j.properties para SpringJUnit4ClassRunner?

De repente esto sigue sucediendo durante una prueba de JUnit. Todo funcionaba, escribí algunas nuevas pruebas y se produjo este error. Si lo revierto, no desaparecerá. ¿Porqué es eso?

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. 

Las nuevas pruebas que escribió (directa o indirectamente) usan clases que se registran con Log4j .

Log4J debe configurarse para que este registro funcione correctamente.

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

Debe tener alguna configuración básica tal 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 appender envía a la consola de forma predeterminada, pero también puede establecer explícitamente el objective de esta manera:

 log4j.appender.A1.Target=System.out 

Esto redireccionará toda la salida en un formato agradable a la consola. Más información se puede encontrar aquí en el manual de Log4J ,

Log4J El registro se configurará correctamente y esta advertencia desaparecerá.

Si no quieres molestarte con un archivo, puedes hacer algo como esto en tu código:

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

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

El contenido del archivo (log4j.properties) puede ser tan simple 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 habilitará el registro log4j con el nivel de registro predeterminado como WARN y usará la consola java para registrar los mensajes.

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

Estaba usando Maven en eclipse y no quería tener una copia adicional del archivo de propiedades en la carpeta raíz. Puedes hacer lo siguiente en eclipse:

  1. Abrir el cuadro de diálogo de ejecución (haga clic en la pequeña flecha junto al botón de reproducción y vaya a ejecutar configuraciones)
  2. Ir a la pestaña “classpath”
  3. Seleccione las “Entradas de usuario” 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

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

Como no me gusta tener archivos duplicados (log4j.properties en prueba y main), y tengo muchas clases de prueba, cada una funciona con la clase SpringJUnit4ClassRunner, así que tengo que personalizarla. Esto es lo que 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 uses, reemplaza SpringJUnit4ClassRunner con MySpringJUnit4ClassRunner

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