2009-08-07 12 views
9

En mis log4j.properties tengo:log4j dirige todas las salidas de registro de la salida estándar a pesar de que no se supone que

log4j.rootLogger=DEBUG,stdout 

log4j.logger.notRootLogger=DEBUG,somewhereelse 

El appenders stdout y somewhereelse se configuran adecuadamente tanto, la salida estándar escribe en la consola y escribe a somewhereelse un archivo.

En mi código en cada clase o yo Seleccione:

static Logger log = Logger.getLogger("notRootLogger); 

^Cuando no quiero cosas pasando a la consola.

-O-

static Logger log = Logger.getRootLogger(); 

^Cuando hago.

¿Qué debo hacer en log4.properties para evitar que las cosas escritas en notRootLogger terminen en stdout? ¿Hay algún tipo de herencia de donde sea que el registrador de raíz escriba para continuar que debe ser desactivado de alguna manera?

No quiero tener que configurar un registrador para cada clase individualmente que solo quiero iniciar sesión en la consola.

Respuesta

23

Debe configurar additivity = false, IIRC. Desde el log4j manual:

Cada solicitud de registro habilitado para un registrador dada será remitida a todos los appenders en ese registrador, así como los appenders más altos en la jerarquía . En otras palabras, los appenders se heredan de forma aditiva de la jerarquía del registrador . Por ejemplo, si se agrega un appender de consola al registrador raíz , todas las solicitudes de registro habilitado se imprimirán al menos en la consola . Si además se agrega un archivo appender a un registrador, responda C, y luego habilita las solicitudes de registro para C y los hijos de C imprimirán en un archivo y en la consola. Es posible anular este comportamiento predeterminado para que la acumulación appender ya no sea aditivo estableciendo el marcador de aditividad en falso.

Prueba esto:

log4j.rootLogger=DEBUG,stdout 
log4j.logger.notRootLogger=DEBUG,somewhereelse 
log4j.additivity.notRootLogger=false 
0

Hmm, debería haber leído la introducción corta a LOG4J más cuidadosamente

log4j.additivity.notRootLogger=false 

correcciones, porque hereda appenders de los registradores por encima de él en la jerarquía , y el registrador de raíz está obviamente en la parte superior de la jerarquía.

+0

¿Qué tiene esto que ver con la optimización? – skaffman

+3

¿De qué manera es la "optimización prematura"? No es una "optimización" en absoluto. Ocurre que quieres una opción diferente de la predeterminada.Si el valor predeterminado fuera que la aditividad fuera falsa, eso significaría que un buen número de personas tendría que establecerlo explícitamente como verdadero. Sospecho que más gente lo quiere "verdadero" que "falso". –

+0

la expectativa es bastante clara si ha leído los documentos de introducción de log4j o lo ha usado –

0

Si las propiedades del registrador se han definido en la clase Java, puede llamar al método logger.shutdown() al final, preferiblemente en el bloque finally para prohibir la naturaleza aditiva del registrador.

Cuestiones relacionadas