2011-08-17 16 views
5

Uso log4j para iniciar sesión en mi proyecto. Aquí está su configuración de ejemplo:log4j y weblogic: mensajes de registro duplicados

public class MyClass { 
    private final Logger logger = Logger.getLogger(MyClass.class); 

    public MyClass() { 
    BasicConfigurator.configure(); 
    Logger.getLogger(MyClass.class).setLevel(Level.INFO); 
    } 

    ... 

} 

El problema es que en cada lado registrador llaman duplica los mensajes de registro (me refiero en primera convocatoria sólo hay 1 mensaje, en segunda convocatoria hay 2 mismos mensajes, entonces hay 3 de ellos y así sucesivamente). Parece que cada vez que se crea una nueva instancia de registrador se usa con todas las instancias antiguas.
Cómo evitar este problema? Gracias.

UPP. Traté de hacerlo estático, pero no funciona de todos modos. Todavía recibo múltiples mensajes de registro. ¿Algunas ideas? Probablemente algunas cosas específicas de Weblogic?

Respuesta

4

Hacer el registrador static

private static final Logger logger = Logger.getLogger(MyClass.class); 

La clave aquí es crear un Logger para cada clase, y no para cada instancia.

+0

Gracias @Shawn. – kardanov

+0

Mmm, lo intenté, pero no funcionó. Y eso es realmente extraño porque tus consejos parecen muy razonables. ¿Alguna otra idea? ¿Qué puede causar el problema? ¿Probablemente algunas cosas específicas de Weblogic? – kardanov

+0

¿Has encontrado una solución para eso? Tengo el mismo comportamiento aquí y no pude solucionar esto hasta ahora. –

2

intente configurar la adición falseprogrammatically o config.

Logger.getLogger(MyClass.class).setAdditivity(false); 

Para mí, eso hizo el truco cuando me puse en log4j.xml

<logger name="com.stackoverflow.answers.gnat" additivity="false"> 
    <!-- note additivity value set above --> 
    <level value="INFO"/> 
    <appender-ref ref="knowledge"/> 
    <appender-ref ref="reputation"/> 
</logger> 
+0

Gracias por su respuesta @gnat, pero ahora estoy recibiendo una excepción: 'log4j: WARN No se encontraron appenders para el registrador log4j: WARN Inicialice el sistema log4j correctamente' No parece que se haya inicializado ningún registrador. – kardanov

+0

_WARN No hay appenders ..._ Ya veo. Suena familiar. Nunca pude precisar el motivo (escribí que odiaba la documentación de log4j, solo los documentos de maven parecen ser peores), pero siempre me pareció que sucedía cuando establecía algún atributo demasiado pronto. Considere tratar de establecer la aditividad lo más tarde posible. El ejemplo de Btw 'xml' en mi respuesta se copia de la base de código con la que trabajo ahora (acabo de ofuscar el nombre y refs específicos de la compañía) y está comprobado que funciona bien durante el último medio año o algo – gnat

1

Si usted hace su clase Logger estática como se sugirió anteriormente, y luego asegurarse de que está configurando log4j ya sea a través de una propiedad del sistema -D en el nivel JVM o en la configuración de su aplicación, no debería tener ningún problema. Esa llamada para analizar la configuración, ya sea en el tiempo de carga de la clase o en el momento de creación de la instancia, es una sobrecarga innecesaria.

log4j solo debería inicializar la configuración una vez, ya sea en la inicialización del servidor o en la implementación de la aplicación.

¿Su proyecto es una aplicación web?

También, usted puede encontrar más información acerca de enganchar en el registro de configuración del servidor WebLogic aquí: http://download.oracle.com/docs/cd/E12840_01/wls/docs103/logging/logging_services.html

Espero que ayude.

+0

gracias @kevinpowe – kardanov

+0

Pleasure, @kardanov: si la respuesta le resultó útil, sería genial si pudiera votar la respuesta. Hope Logging te trata mejor ahora. – kevinpowe

0

El problema está en el método BasicConfurator.configure(). Tuve exactamente el mismo problema en mi proyecto de Java, y no estoy usando WebLogic.

Moví mi método BasicConfigurator.configure() de mi beforeTest() a beforeClass(), y de repente el problema desapareció.

@BeforeClass 
public static void beforeClass() { 
    BasicConfigurator.configure(); 
    GeoLogger.setLogLevel(Level.INFO); 
} 

@Before 
public void beforeTest() { 
    //BasicConfigurator.configure(); 
} 

Espero que eso lo ayude a llegar a una solución.

Cuestiones relacionadas