2010-07-15 11 views
90

Esto parece un error de descuido, pero parece que no puedo encontrar la causa. Inicio de sesión con logback/slf4j (versión más reciente slf4j-api-1.6.1, logback core/classic 0.9.24). configuración del registro más simple para la prueba es:¿Cómo evitar que logback genere su propio estado al inicio de cada registro?

configuración
<configuration> 
<appender name="stdout" class="ch.qos.logback.core.ConsoleAppender"> 
    <layout class="ch.qos.logback.classic.PatternLayout"> 
    <!-- DONT USE THIS FORMATTER FOR LIVE LOGGING THE %L LINE NUMBER OUTPUTTER IS SLOW --> 
    <pattern>%le %-1r [%c{1}:%L] %m%n</pattern> 
    </layout> 
</appender> 
<root level="DEBUG"> 
    <appender-ref ref="stdout" /> 
</root> 
</configuration> 

Cada registro se inicia con líneas de estado internos de logback:

11:21:27,825 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource [logback.groovy] 
11:21:27,826 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Found resource [logback-test.xml] at [file:.../logback-test.xml] 
11:21:28,116 |-INFO in ch.qos.logback.classic.joran.action.ConfigurationAction - debug attribute not set 
11:21:28,124 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - About to instantiate appender of type [ch.qos.logback.core.ConsoleAppender] 
11:21:28,129 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - Naming appender as [stdout] 
11:21:28,180 |-INFO in ch.qos.logback.core.joran.action.NestedComplexPropertyIA - Pushing component [layout] on top of the object stack. 
11:21:28,206 |-WARN in ch.qos.logback.core.ConsoleAppender[stdout] - This appender no longer admits a layout as a sub-component, set an encoder instead. 
11:21:28,206 |-WARN in ch.qos.logback.core.ConsoleAppender[stdout] - To ensure compatibility, wrapping your layout in LayoutWrappingEncoder. 
11:21:28,206 |-WARN in ch.qos.logback.core.ConsoleAppender[stdout] - See also http://logback.qos.ch/codes.html#layoutInsteadOfEncoder for details 
11:21:28,207 |-INFO in ch.qos.logback.classic.joran.action.RootLoggerAction - Setting level of ROOT logger to DEBUG 
11:21:28,207 |-INFO in ch.qos.logback.core.joran.action.AppenderRefAction - Attaching appender named [stdout] to Logger[ROOT] 

que es, de acuerdo con los documentos, la logback formato utiliza para el defecto. Luego, termina de leer la configuración (que está configurada para generar un formato diferente) y continúa con la salida formateada correctamente. Hay un parámetro de configuración <configuration debug="false"> que no afecta esto.

¿Alguien sabe cómo cerrar esto?

+0

Las versiones recientes de logback son mucho más rápidos en el cálculo de% L. –

Respuesta

37

Como described in the docs, si se producen advertencias o errores durante el análisis del archivo de configuración, logback imprimirá automáticamente los datos de estado en la consola.

Siga http://logback.qos.ch/codes.html#layoutInsteadOfEncoder es decir el enlace mencionado por logback en su mensaje de advertencia. Una vez que siga los pasos mencionados allí, es decir, si reemplaza < layout> element con < encoder>, logback dejará de imprimir mensajes en la consola.

+4

Más o menos bien, aunque me apuntó en la dirección correcta. Cambié a la sintaxis del codificador sin efecto, aunque resulta que quitar la otra línea en el archivo logback.xml que estaba causando una advertencia hizo el truco. Lo engañoso es que la salida parece emitir decisiones tomadas antes de que realmente analice su archivo logback, (1> NO se pudo encontrar el recurso [logback.groovy], 2> Found resource [logback-test.xml]). Es bastante confuso que una corrección en la prueba de logback oculte los mensajes de estado de lo que sucede antes de que se analice. Pero gracias por el puntero. –

+0

La advertencia proviene del elemento obsoleto como lo indica claramente la advertencia. Me temo que no puedo darle sentido a tu último comentario. – Ceki

+5

Creo que lo que Steve B. quiso decir es que es contra intuitivo (o al menos poco convencional) que Logback suprima * todos los mensajes de estado, incluidos (y particularmente) los que preceden a la carga del archivo de configuración, a menos que encuentre un error más adelante en La configuración. Cuando no esté familiarizado con esta regla y vea primero estos mensajes de estado (que implican una advertencia de configuración o error), la mayoría de los usuarios esperarían que una vez que se resuelva el error, Logback ya no imprimiría los mensajes de error relacionados, pero continuaría imprimiendo el otro mensajes de estado. –

2

Esto parece ser reparado en 0.9.29. Acabo de hacer varias pruebas. Ya no hay información de Joran. Supongo que this es la confirmación de la fijación.

4

Me di cuenta de que Steve encontró la solución, pero no lo mencionó en el hilo. En caso de que otra persona haga lo mismo, aquí está la solución.

reemplazar "< disposición > con" elementos "<codificador> .. </codificador >" este es el culpable .. clase < layout = " ch.qos.logback.classic.PatternLayout " >

+1

Si desea eliminar por completo esos mensajes, use el NopStatusListener como lo describió Rasmus. El enfoque del codificador frente al diseño no suprime mensajes como 'logback.groovy no encontrado', por ejemplo. Estoy utilizando logback-classic 1.1.3 (marzo de 2015) –

140

Si configura el atributo debug del elemento configuration en true, obtendrá toda la información de estado en la consola. Si este es su problema, simplemente configúrelo en falso o quítelo.

Si tiene problemas de configuración del nivel WARN o superior, también obtendrá toda la información de estado registrada en la consola (incluidos los mensajes del nivel INFO). La mejor solución a este problema es solucionar el problema (en su caso, reemplace el elemento <layout> con un elemento <encoder>).

Si por algún motivo no puede solucionar el problema, pero desea eliminar la información de estado de la consola, puede configurar una alternativa StatusListener. Usar la NopStatusListener para eliminar por completo el estado-información:

<configuration> 
    <statusListener class="ch.qos.logback.core.status.NopStatusListener" /> 
    <!-- etc --> 
</configuration> 
+8

Esta es la respuesta correcta, se debe subir la apuesta más, gracias. (logback 1.0.11) –

+3

¡Esto funcionó, debería ser aceptado respuesta! – raffian

+3

Esto funcionó. No estaba del todo claro que los mensajes de registro 'INFO' también desaparecerían, pero de hecho lo hacen. Sé que la respuesta dice esto, pero por alguna razón no estaba claro para mí. Para ser tan claro: corrija el problema del codificador/diseño y no solo desaparecerán los mensajes de advertencia, sino que los mensajes de información también desaparecerán, aunque no estén relacionados con el problema. – Jason

0

He intentado todo y nada funcionó para mí. Mi problema se debió a varios archivos logback.xml en mi classpath. Este es el caso común en proyectos multi-modulares. Cuando solo hay un archivo logback.xml en classpath, no hay ambigüedad y el problema está resuelto.

6

Ceki respuesta es correcta:

(...) si se presentan advertencias o errores durante el análisis del archivo de configuración, logback imprimirá automáticamente los datos de estado en la consola.

Una vez que lo haga bien, ya no habrá contaminación en las primeras líneas de su registro.

A partir de marzo de 2015, en Logback 1.1.2, es necesario utilizar <encoder> subcomponente - <layout> ahora es obsoleto y si usarlo, aparecerán mensajes de error. No puede controlar esto, es Logback comportamiento predeterminado.

Algunas clases internas también se han renombrado, e incluso los ejemplos en su página de manual están desactualizados.

Aquí está el fragmento de código de su página de Ayuda de código de errores, que tiene la forma correcta de configurar el registrador. Esto solucionó el problema completamente en mi proyecto. http://logback.qos.ch/codes.html#layoutInsteadOfEncoder

<appender name="FILE" class="ch.qos.logback.core.FileAppender"> 
    <file>testFile.log</file> 
    ... 
    <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> 
    <pattern>%msg%n</pattern> 
    </encoder> 
</appender> 
0

luchado con el mismo problema a mí mismo decir que había un montón de líneas registra desde el principio que no estaban relacionados con mi código. Así es como lo arreglé.

<configuration debug="false"> 

<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> 
    <!-- <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level 
     %logger{36} - %msg%n</pattern> </encoder> --> 
    <encoder> 
     <pattern>%d{HH:mm:ss.SSS} %-5level %logger{10} - %msg%n</pattern> 
    </encoder> 
</appender> 

<root level="error"> 
    <appender-ref ref="STDOUT" /> 
</root> 

<logger name="fun.n.games" level="DEBUG" /> 

Esto se está ejecutando con la siguiente entrada en el pom.xml

 <dependency> 
     <groupId>ch.qos.logback</groupId> 
     <artifactId>logback-classic</artifactId> 
     <version>1.2.3</version> 
    </dependency> 
Cuestiones relacionadas