2011-08-17 18 views
5

Używam log4j do logowania do mojego projektu. Tutaj jest to próbka setup:log4j i weblogic: duplikowanie logów

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

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

    ... 

} 

Problemem jest to, że na każdym kolejnym rejestratora nazywają to powiela wiadomości dziennika (to znaczy na pierwsze wezwanie istnieje tylko 1 wiadomość, na drugim naborze są 2 takie same komunikaty, to istnieje 3 z nich i tak dalej). Wydaje się, że za każdym razem, gdy instancja nowego rejestratora jest tworzona i używana we wszystkich starych instancjach.
Jak uniknąć tego problemu? Dzięki.

UPP. Próbowałem zrobić to statycznie, ale i tak to nie działa. Nadal dostaję wiele komunikatów dziennika. Jakieś pomysły? Prawdopodobnie jakieś szczególne rzeczy z Weblogic?

Odpowiedz

4

Bądź rejestratora static

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

Kluczem tutaj jest stworzenie Logger dla każdej klasy, a nie dla każdej instancji.

+0

Dziękuję @ Shawn. – kardanov

+0

Hmm, próbowałem tego, ale się nie udało. I to jest naprawdę dziwne, ponieważ twoja rada wygląda bardzo rozsądnie. Jakieś inne pomysły? Co może spowodować problem? Prawdopodobnie jakieś specyficzne dla Weblogica rzeczy? – kardanov

+0

Znalazłeś rozwiązanie? Mam takie samo zachowanie tutaj i nie mogłem tego naprawić. –

2

spróbuj ustawić addytywność falseprogrammatically lub w config.

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

Do mnie, że wystarczyły kiedy ustawić go w 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

Dziękuję za odpowiedź @gnat, ale teraz otrzymuję wyjątek: 'log4j: WARN Nie znaleziono aplikatorów dla rejestratora log4j: WARN Proszę zainicjować system log4j we właściwy sposób' W ogóle nie zainicjowano żadnego rejestratora. – kardanov

+0

_WARN Brak elementów dodatkowych ... _ Rozumiem. Brzmi znajomo. Nigdy nie udało mi się ustalić przyczyny tego problemu (czy napisałem, że nienawidzę dokumentacji log4j - tylko dokumenty z serii "maven" wydają się gorsze od niej), ale zawsze czułem, że dzieje się tak, gdy ustalam jakiś atrybut zbyt wcześnie. Zastanów się nad ustawieniem addytywności tak późno, jak to możliwe. Przykład Btw 'xml' w mojej odpowiedzi jest kopiowany z bazy kodu, z którą pracuję w tej chwili (po prostu zaciemniłem nazwę firmy i refs) i udowodniono, że działa dobrze przez ostatnie pół roku lub coś w rodzaju – gnat

1

Jeśli się klasa Logger statyczne jak zasugerowano powyżej, a następnie upewnij się, że jesteś konfigurowania log4j za pośrednictwem właściwości systemu -D na poziomie maszyny JVM lub w konfiguracji aplikacji nie powinno mieć żadnych problemów. To wezwanie do parsowania konfiguracji w czasie ładowania klasy lub w czasie tworzenia instancji jest niepotrzebne narzut.

log4j powinien tylko raz zainicjalizować konfigurację - niezależnie od tego, czy jest to inicjalizacja serwera, czy też po uruchomieniu aplikacji.

Czy Twój projekt jest aplikacją internetową?

Ponadto, można dowiedzieć się więcej o spinanie do konfiguracji rejestrowania WebLogic Server jest tutaj: http://download.oracle.com/docs/cd/E12840_01/wls/docs103/logging/logging_services.html

nadzieję, że pomoże.

+0

dziękuję @kevinpowe – kardanov

+0

Przyjemność, @kardanov - jeśli uważasz, że odpowiedź jest przydatna, byłoby wspaniale, gdybyś mógł głosować na odpowiedź. Rejestrowanie nadziei traktuje cię teraz lepiej. – kevinpowe

0

Problem leży w metodzie BasicConfurator.configure(). Miałem dokładnie ten sam problem w moim projekcie java i nie używam WebLogic.

Przeprowadziłem moją metodę BasicConfigurator.configure() z mojego beforeTest() do beforeClass() i nagle problem zniknął.

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

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

Mam nadzieję, że pomoże Ci to znaleźć rozwiązanie.