2011-08-17 2 views
5

Uso log4j per accedere al mio progetto. Qui si è messa a punto del campione:log4j e weblogic: messaggi di registro duplicati

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

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

    ... 

} 

Il problema è che su ogni successivo logger chiamano duplica i messaggi di log (mi riferisco in prima convocazione c'è solo 1 messaggio, in seconda convocazione ci sono 2 stessi messaggi, poi ci sono 3 di loro e così via). Sembra che ogni volta l'istanza del nuovo logger venga creata e utilizzata con tutte le vecchie istanze.
Come evitare questo problema? Grazie.

UPP. Ho cercato di renderlo statico, ma non funziona comunque. Ricevo ancora più messaggi di registro. Qualche idea? Probabilmente alcune cose specifiche su Weblogic?

risposta

4

Fai il logger static

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

La chiave qui è quello di creare un Logger per ogni classe, e non per ogni istanza.

+0

Grazie @Shawn. – kardanov

+0

Hmm, l'ho provato, ma non ci è riuscito. Ed è davvero strano perché il tuo consiglio sembra molto ragionevole. Altre idee? Cosa può causare il problema? Probabilmente alcune cose specifiche su Weblogic? – kardanov

+0

Hai trovato una soluzione per questo? Ho lo stesso comportamento qui e non ho potuto risolvere questo finora. –

2

provare l'impostazione di additività falseprogrammatically o in configurazione.

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

Per me, che ha fatto il trucco, quando ho impostato in 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

Grazie per la risposta @gnat, ma ora sto ottenendo un'eccezione: 'log4j: WARN Impossibile trovare appendici per il logger log4j: WARN Si prega di inizializzare correttamente il sistema log4j' Nessun logger sembra essere inizializzato. – kardanov

+0

_WARN Nessuna appendice ..._ Capisco. Suona familiare. Non è mai stato in grado di individuare la ragione di ciò (ho scritto che odio la documentazione di log4j? Solo i documenti di Maven sembrano essere peggiori di così) ma mi è sempre sembrato che succedesse quando imposto alcuni attributi troppo presto. Potresti provare a impostare l'additività il più tardi possibile. Btw 'xml' esempio nella mia risposta è copiato da codebase con cui lavoro in questo momento (ho solo offuscato nome e refs specifici dell'azienda) e si è dimostrato che funziona bene per l'ultimo semestre o qualcosa – gnat

1

Se fate la vostra classe Logger statico come suggerito sopra, e quindi garantire che si sta configurando log4j tramite una proprietà di sistema -D a livello di JVM o nella configurazione della tua applicazione, non dovresti avere problemi. Quella chiamata per analizzare la configurazione al momento del caricamento della classe o al momento della creazione dell'istanza non è necessaria.

log4j dovrebbe solo essere necessario inizializzare la configurazione una volta, indipendentemente dall'inizializzazione del server o dalla distribuzione dell'applicazione.

Il tuo progetto è un'applicazione web?

Inoltre, è possibile trovare maggiori informazioni su aggancio in configurazione di registrazione di WebLogic Server qui: http://download.oracle.com/docs/cd/E12840_01/wls/docs103/logging/logging_services.html

Speranza che aiuta.

+0

grazie @kevinpowe – kardanov

+0

Piacere, @kardanov - se hai trovato la risposta utile, sarebbe bello se potessi votare la risposta. Spero che il disboscamento ti stia trattando meglio ora. – kevinpowe

0

Il problema si trova nel metodo BasicConfurator.configure(). Ho avuto lo stesso identico problema nel mio progetto java e non sto usando WebLogic.

Ho spostato il mio metodo BasicConfigurator.configure() dal mio beforeTest() a beforeClass() e improvvisamente il problema è andato via.

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

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

Spero che ti aiuti a indirizzarti verso una soluzione.