2010-01-21 34 views
15

al desplegar mi aplicación/Hibernate primavera, me sale el siguiente mensaje de advertencia relacionados con la tala:desconcertado por los sistemas de registro de Java con Spring e Hibernate

log4j:WARN No appenders could be found for logger (org.springframework.web.context.ContextLoader). 
log4j:WARN Please initialize the log4j system properly. 

sorprendente para mí fue la falta de información de un Google/SO buscar . Lo único relevante fue este SO poste Problem with Commons Logging/Log4j setup in spring webapp with tomcat 6

Sin embargo, esto es incluso más allá de mí. ¿Puede alguien aclarar los sistemas de registro en juego aquí, o señalarme un recurso RECIENTE sobre el asunto (hay algunos resultados de búsqueda de Google antiguos que realmente no se aplican). En concreto, los temas que estoy luchando con son:

  • La distinción entre commons-logging, log4j, slf4j y JCL. Mi entendimiento es que slf4j es un contenedor, mientras que el registro de commons y log4j son implementaciones reales. No sé dónde encaja JCL.

  • Cómo configurar el registro para Spring. ¿Qué hace en el archivo web.xml, necesito un archivo log4j.properties o un archivo log4j.xml? ¿A dónde va, en WEB-INF? ¿Pasa algo en mi archivo applicationContext.xml? (lo siento, pero necesito comenzar desde cero aquí).

  • Estoy usando Hibernate en mi proyecto e incluido a través de Maven. Parece que Hibernate usa slf4j-simple. He visto advertencias que dicen que no puedo tener slf4j-simple y slf4j-log4j en el classpath. No he incluido slf4j-log4j como dependencia, pero Hibernate debe incluirlo. ¿Cómo resuelvo este problema? ¿Puedo forzar a Hibernate a usar log4j en su lugar?

Cualquier ayuda sería muy apreciada. Gracias.


edición:

Gracias por todas las respuestas hasta el momento. Estoy dando una oportunidad a estas sugerencias. ¿Qué hay de la aplicación web Spring específicamente? He visto ejemplos de oyentes y parámetros y otros que no se incluyen en el archivo web.xml. ¿Esto también es obligatorio?

Respuesta

12
  • commons-loggingSLF4J y son a la vez Envoltorios de API alrededor de otras implementaciones de registro. SLF4J es el más moderno de los dos, y bastante más capaz. Log4j es una implementación de registro, y prácticamente el estándar de facto. JUL (abreviatura de java.util.logging) es la implementación de registro (generalmente horrible) que viene con el JRE. Otra implementación de registro es logback, que poco a poco está ganando tracción, pero que aún no se ha generalizado.
  • log4j.properties y log4j.xml son formas diferentes de configurar log4j, ambos son igualmente válidos. Cuál de ustedes es depende de usted, aunque algunos servidores de aplicaciones dictan uno o el otro. Lea el log4j manual para descubrir cómo configurar esto.
  • Si Hibernate usa SLF4J como su API, esa es la elección de los desarrolladores de Hibernate. Sin embargo, puede elegir a qué implementación de registro delegará SLF4J. Nuevamente, lea el slf4j manual para averiguar cómo seleccionar la implementación elegida.

Sí, es bastante confuso. Dada una opción abierta, SLF4J y Logback es la combinación más capaz, pero generalmente no se obtiene una opción abierta. Diferentes marcos (como Hibernate y Spring) potencialmente utilizarán diferentes API de registro, generalmente de registro común o SLF4J, pero puede obtener todas esas API para iniciar sesión en la misma implementación subyacente (generalmente log4j).

+0

excelente respuesta skaffman – underdog

2

Necesita un archivo log4j.properties en su classpath. Aquí está un archivo de propiedades mínimas Me pasó a haber creado ayer:

log4j.logger.BillReview=INFO,BillReviewLog 
log4j.appender.BillReviewLog=org.apache.log4j.RollingFileAppender 
log4j.appender.BillReviewLog.File=BillReview.log 
log4j.appender.BillReviewLog.Append=true 
log4j.appender.BillReviewLog.MaxFileSize=5000KB 
log4j.appender.BillReviewLog.MaxBackupIndex=5 
log4j.appender.BillReviewLog.layout=org.apache.log4j.PatternLayout 
log4j.appender.BillReviewLog.layout.ConversionPattern=%c %p %-10.10X{server} %-4.4X{user} %d{ISO8601} %m%n 

poner esto en un archivo log4j.properties, cambian todas las referencias a 'BillReview' a algo más parecido a su proyecto y que van a conectarse a una archivar y detener esos mensajes.

Sus preguntas sobre qué marco de registro son en gran medida elección personal. Log4j es el estándar anterior y funciona bien, el registro de Commons y slf4j son API más recientes y permiten casos de uso más complicados.

1

Dejaré que algunos gurús más experimentados respondan la primera viñeta.

responder a su segunda bala ...

ya sea un archivo o log4j.properties log4j.xml Puede utilizar (no importa cuál). Lo que elija debe agregarlo a su classpath (normalmente debe ir en el mismo directorio que su código fuente). Si está utilizando Spring, una buena manera de dividir su directorio src en porciones lógicas es mediante el uso de la siguiente estructura de directorios .../ Java principal/

src - puso fuente principal aquí
src/main/resources - recursos puestos utilizados por que la fuente principal aquí prueba de java
src// - poner fuente de prueba aquí (para pruebas)
src/test/resources - poner recursos para las pruebas aquí

Por lo tanto, pondría su log4j.properties en el directorio src/test/resources.

responder a su tercera bala ...

Puede excluir una dependencia dentro de una dependencia en la que pom.xml archivo de la siguiente manera ...

<dependency> 
    <groupId>org.apache.xbean</groupId> 
    <artifactId>xbean-spring</artifactId> 
    <version>${xbean.version}</version> 
    <exclusions> 
     <exclusion> 
      <groupId>commons-logging</groupId> 
      <artifactId>commons-logging</artifactId> 
     </exclusion> 
    </exclusions> 
</dependency> 
4
  • La distinción entre commons-logging, log4j, slf4j y JCL. Mi entendimiento es que slf4j es un contenedor, mientras que el registro de commons y log4j son implementaciones reales. No sé donde cabe en JCL.

Jakarta Commons Logging (JCL) y la fachada de registro simple para Java SLF4J son ambos abstracciones para diversos marcos de registro por ejemplo, java.util.logging, log4j y logback, lo que permite al usuario final conectar el marco de registro deseado en despliegue tiempo. Se sabe que Commons Logging sufre problemas de carga de clases, que es lo que SLF4J intenta resolver (se sabe que SLF4J es una biblioteca más limpia).

Habiendo dicho esto, el hecho es que la primavera utiliza Jakarta Commons API de registro (ver Logging Dependencies in Spring): El resorte está compilado contra JCL y el resorte hace JCL Log objetos disponibles para las clases que se extienden de primavera. En realidad, es la única dependencia externa en Spring.Esta opción es has been made porque muchos otros marcos también la usan (por ejemplo, Struts). La idea era evitar tener que tener múltiples bibliotecas de fachada en la ruta de la clase al construir aplicaciones ("A" para Spring, "B" para Struts, etc.). Sin embargo, es posible para reemplazar JCL por SLF4J si lo desea (SFL4J proporciona enlaces a marcos de trabajo de registro pero también un puente "JCL a SLF4J"). Consulte la publicación mencionada Logging Dependencies in Spring para obtener todos los detalles.

  • Cómo configurar el registro para Spring. ¿Qué hace en el archivo web.xml, necesito un archivo log4j.properties o un archivo log4j.xml? ¿A dónde va, en WEB-INF? ¿Pasa algo en mi archivo applicationContext.xml? (lo siento, pero necesito comenzar desde cero aquí).

Para iniciar la sesión, usted tiene que decidir qué 1. aplicación que desea utilizar (java.util.logging, log4j o logback), 2. poner el elegido en la ruta de clases, si es necesario (java. util.logging está en Java SE para que no requiera bibliotecas adicionales) y 3. para configurarlo (poniendo un archivo config en classpath). Si opta por usar log4j, solo agregue su jar y log4j.properties o uno más sofisticado (pero más detallado) log4j.xml (este es solo otro formato para la configuración) para el classpath.

  • estoy usando Hibernate en mi proyecto y también a través de Maven. Parece que Hibernate usa slf4j-simple. He visto advertencias que dicen que no puedo tener slf4j-simple y slf4j-log4j en el classpath. No he incluido slf4j-log4j como dependencia, pero Hibernate debe incluirlo. ¿Cómo resuelvo este problema? ¿Puedo forzar a Hibernate a usar log4j en su lugar?

Hibernate utilizes Simple Logging Facade for Java (SLF4J) y, de hecho, no se puede tener varios bindings (por ejemplo slf4j-simple.jar y slf4j-logj12.jar) en la ruta de clases al mismo tiempo. Aquí, es muy probable que obtenga slf4j-simple.jar transitivamente de otra dependencia. Para resolver este problema, ejecute mvn dependency:tree para averiguar de dónde viene y excluirlo si es necesario.

Y por cierto, en su caso, configuraría Spring para usar SLF4J, ya que Hibernate lo está usando. Siga los pasos en el enlace mencionado en el primer párrafo para eso. Y usaría logback como logging framework (que es el sucesor de log4j), aquí es donde suceden las cosas ahora.

0

Tuve problemas en la misma área mientras ejecutaba mis pruebas. Eventualmente noté que Junit traía slf4j-nop como una dependencia, además del slf4j-log4j12 que yo quería. Una vez que excluí slf4j-nop, comenzó a funcionar.

Cuestiones relacionadas