java - mkyong - org/apache/logging/log4j/logmanager
Log4j: ¿Por qué el registrador de raíz recopila todos los tipos de registro independientemente de la configuración? (6)
Dos cosas: compruebe la capacidad de adición y decida si desea que los eventos de registro capturados por niveles de registro más detallados se propaguen al registrador de raíz.
En segundo lugar, verifique el nivel para el registrador de raíz. Además, también puede agregar filtros en el propio appender, pero esto normalmente no debería ser necesario.
Tengo un problema que, aunque especifico el nivel a ERROR en la etiqueta raíz, el appender especificado registra todos los niveles (depuración, información, advertencia) en el archivo independientemente de la configuración. No soy un experto en log4j así que cualquier ayuda es apreciada.
Aquí hay un poco más de información sobre el tema:
- He comprobado el classpath para log4j.properties (no hay ninguno) excepto el log4j.xml
aquí está el archivo log4j.xml:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j=''http://jakarta.apache.org/log4j/''>
<!-- ============================== -->
<!-- Append messages to the console -->
<!-- ============================== -->
<appender name="console" class="org.apache.log4j.ConsoleAppender">
<param name="Target" value="System.out" />
<layout class="org.apache.log4j.PatternLayout">
<!-- The default pattern: Date Priority [Category] Message/n -->
<param name="ConversionPattern" value="[AC - %5p] [%d{ISO8601}] [%t] [%c{1} - %L] %m%n" />
</layout>
</appender>
<appender name="logfile" class="org.apache.log4j.RollingFileAppender">
<param name="File" value="./logs/server.log" />
<param name="MaxFileSize" value="1000KB" />
<param name="MaxBackupIndex" value="2" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="[AC - %-5p] {%d{dd.MM.yyyy - HH.mm.ss}} %m%n" />
</layout>
</appender>
<appender name="payloadAppender" class="org.apache.log4j.RollingFileAppender">
<param name="File" value="./logs/payload.log" />
<param name="MaxFileSize" value="1000KB" />
<param name="MaxBackupIndex" value="10" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="[AC - %-5p] {%d{dd.MM.yyyy - HH.mm.ss}} %m%n" />
</layout>
</appender>
<appender name="errorLog" class="org.apache.log4j.RollingFileAppender">
<param name="File" value="./logs/error.log" />
<param name="MaxFileSize" value="1000KB" />
<param name="MaxBackupIndex" value="10" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="[AC - %-5p] {%d{dd.MM.yyyy - HH.mm.ss}} %m%n" />
</layout>
</appender>
<appender name="traceLog"
class="org.apache.log4j.RollingFileAppender">
<param name="File" value="./logs/trace.log" />
<param name="MaxFileSize" value="1000KB" />
<param name="MaxBackupIndex" value="20" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern"
value="[AccessControl - %-5p] {%t: %d{dd.MM.yyyy - HH.mm.ss,SSS}} %m%n" />
</layout>
</appender>
<appender name="traceSocketAppender" class="org.apache.log4j.net.SocketAppender">
<param name="remoteHost" value="localhost" />
<param name="port" value="4445" />
<param name="locationInfo" value="true" />
</appender>
<logger name="TraceLogger">
<level value="trace" /> <!-- Set level to trace to activate tracing -->
<appender-ref ref="traceLog" />
</logger>
<logger name="org.springframework.ws.server.endpoint.interceptor">
<level value="DEBUG" />
<appender-ref ref="payloadAppender" />
</logger>
<root>
<level value="error" />
<appender-ref ref="errorLog" />
</root>
</log4j:configuration>
Si reemplazo la raíz con otro registrador, nada se registra en absoluto en el appender especificado.
<logger name="com.mydomain.logic">
<level value="error" />
<appender-ref ref="errorLog" />
</logger>
... y gracias chicos por las pistas hasta ahora :-)
Ejecute su programa con -Dlog4j.debug para que la salida estándar obtenga información sobre cómo se configura log4j. Sospeché que no está configurado de la manera que usted cree que es.
El registrador de raíz reside en la parte superior de la jerarquía del registrador. Es excepcional de tres maneras:
- siempre existe,
- su nivel no se puede establecer en nulo
- no puede ser recuperado por su nombre.
El rootLogger es el padre de todos los appenders. Cada solicitud de registro habilitada para un registrador determinado se reenviará a todos los appenders en ese registrador, así como a los appenders que estén más arriba en la jerarquía (incluido el rootLogger)
Por ejemplo, si el apilador de la console
se agrega al root logger
, todas las solicitudes de registro habilitadas se imprimirán al menos en la consola. Si además se agrega un appender de archivo a un registrador, responda L
, luego las solicitudes de registro habilitadas para L
y L''s
hijos de L
se imprimirán en un archivo y en la console
. Es posible anular este comportamiento predeterminado para que la acumulación de apéndices ya no sea aditiva estableciendo el indicador de aditividad en falso .
Del manual de log4j
Para resumir:
Si no desea propagar un evento de registro a los registradores principales (por ejemplo, rootLogger), agregue el indicador de aditividad a falso en esos registradores. En tu caso:
<logger name="org.springframework.ws.server.endpoint.interceptor"
additivity="false">
<level value="DEBUG" />
<appender-ref ref="payloadAppender" />
</logger>
En el estilo de configuración log4j estándar (que prefiero a XML):
log4j.logger.org.springframework.ws.server.endpoint.interceptor = INFO, payloadAppender
log4j.additivity.org.springframework.ws.server.endpoint.interceptor = false
Espero que esto ayude.
Este es el comportamiento correcto. El registrador de raíz es como el comportamiento predeterminado. Entonces, si no especifica ningún registrador, tomará el nivel de registrador de raíz como el nivel predeterminado, pero esto no significa que el nivel de registrador de raíz sea el nivel para todos sus registros.
Cualquiera de su código que se registre usando el registrador ''TraceLogger''logger o'' org.springframework.ws.server.endpoint.interceptor ''registrará los mensajes usando el nivel TRACE y DEBUG respectivamente cualquier otro código usará el registrador de raíz para registrar el mensaje usando el nivel, que es en tu caso ERROR.
Por lo tanto, si utiliza un registrador que no sea raíz, el nivel de registro de ese registrador anulará el nivel de registro raíz. Para obtener la salida deseada, cambie los otros dos niveles de registro a ERROR.
Espero que esto sea útil.
Para agregar a lo que dijeron James AN Stauffer y cynicalman, apostaría a que hay otro log4j.xml / log4j.properties en tu classpath que no sea el que deseas utilizar y que está causando que log4j se configure como está.
-Dlog4j.debug
es una manera absolutamente asesina de solucionar problemas de log4j.
Si está utilizando un archivo log4j.properties
, normalmente se espera que este archivo esté en la raíz de su ruta de clase, así que asegúrese de que esté allí.