2012-02-21 11 views
5

Używam slf4j ponad logowaniem. Czasami logi nie są drukowane w kolejności (znacznik czasu). Czy możemy zmusić go do zalogowania się w takiej samej kolejności, w jakiej działa kod?force slf4j do drukowania logów w sekwencji

Aktualizacja 1: Dzieje się to podczas prowadzenia testów jednostkowych na Jenkinsie przez maven. Dzieje się to konsekwentnie. Pierwsze logi z kodu nadchodzą, a nadchodzą logi z testu jednostkowego.

Również wszystkie pliki logback wygląda normalnie, jak poniżej.

<appender name="STDOUT" 
      class="ch.qos.logback.core.ConsoleAppender"> 
    <layout class="ch.qos.logback.classic.PatternLayout"> 

Aktualizacja 2: Fragmenty dziennika są tak (mam edytować nazwę pliku etc ..). Podczas wykonywania testu test1 wywołujemy kod, aby odwrócić transakcję, która nie powiodła się z powodu jakiegoś błędu. Ale dziwne jest, że wyjątek jest drukowany jako pierwszy, a następnie drukowane są instrukcje dziennika z metod testowych. Także znaczniki czasu sprawozdań z bali są zgodnie z oczekiwaniami, ale ich kolejność w pliku jest inna (14:33:34. przychodzi przed 14:33:34.)

14:33:34.667 [[email protected]05558-0] [] WARN org.hibernate.ejb.Ejb3Configuration - hibernate.connection.autocommit = false break the EJB3 specification 
14:33:34.718 [[email protected]] [] WARN o.h.impl.SessionFactoryObjectFactory - InitialContext did not implement EventContext 
14:33:34.843 [[email protected]] [] DEBUG c.r.a.exception.ExceptionMapper - <3003> can't reverse transaction. [id=10000000100120014] 
. 
. 
. 
. 
. 
14:33:34.158 [main] [] DEBUG c.r.a.test - ========================= test0: finished. 
14:33:34.158 [main] [] DEBUG c.r.a.test - ========================= test1: started. 
. 
. 
. 
. 
14:33:34.449 [main] [] DEBUG c.r.a.test - reversing transaction, id=10000000100120014 
14:33:34.856 [main] [] DEBUG c.r.a.test - ========================= test2: started. 

Aktualizacja 3: Nasz projekt wykorzystuje narzędzie maven i istnieje wiele modułów. Mamy logback-test.xml w folderze src/test/resources.

Struktura projektu wygląda następująco:
codemodule/src/test/resources/logback-test.xml - ten moduł zostanie spakowany w pliku jar. Przypadek testowy wywołuje kod tego modułu.
parent/src/test/resources/logback-test.xml - jest to moduł nadrzędny, który opakowuje wszystkie pliki jar i pakiety innych modułów w stan wojny. Tutaj mam uruchomiony test, który wywołuje powyższy kod modułu.

Mam instrukcje dziennika zarówno w kodzie przypadków testowych, jak iw kodzie rzeczywistym. Sprawdziłem, że zarówno przypadek testowy, jak i kod używają wzorca z pliku loginu nadrzędnego (wzór w kodzieodule jest inny). Konsekwentnie drukuje instrukcje dziennika kodu przed wydrukowaniem dzienników zdarzeń testowych.

Również nie przeprowadzamy testów równolegle.
Concurrency config is parallel='none', perCoreThreadCount=true, threadCount=2, useUnlimitedThreads=false

Update 4: Rozumiem problem. Robimy żądanie http, a nie bezpośrednie wywołanie metody. Tak więc przypadki testowe działają w wątku main, a aktualny kod działa w innym wątku (Thanks Sebbe).

Rozumiem, że wymuszanie sekwencji logowania może być skutecznym działaniem, ale dla kompletności pytania zadam jeszcze jedno pytanie.

Ponieważ oba logi przechodzą do pojedynczego aplikanta (STDOUT), czy mogę wymusić na nim zalogowanie się w kolejności znacznika czasu?

+0

Czy mówisz, że w dzienniku widzisz wiadomości mieszane znaczniki czasu (nie rośnie?) Nigdy nie widziałem takich zjawisk. Którego aplikanta używasz? –

+0

@TomaszNurkiewicz Tak, używam ch.qos.logback.core.ConsoleAppender – Reddy

+0

Czy używasz jakiejkolwiek współbieżności? To może być powód. Ponadto, możesz podać fragment dziennika – Fixpoint

Odpowiedz

2

Z samego loga widać, że działają co najmniej 2 wątki: [email protected] i main.

Nie można kontrolować kolejności, w której oddzielne wątki rejestrują swoje zdarzenia na tym samym wyjściu (prawdopodobnie można, ale byłby to zły pomysł).

Z wątku dziennika [email protected] otrzymasz najpierw dostęp do zapisu do konsoli. Podczas zapisywania do niego zdarzenia są rejestrowane od main. Po zwolnieniu blokady przez [email protected], main pobiera ją i może opróżnić dzienniki do pliku.

+0

Dziękuję Sebbe, to może być problem. Ale nadal muszę sprawdzić, dlaczego dzieje się to konsekwentnie i skąd pochodzi '' 869082978 @ qtp-1587505558-0'. – Reddy

+0

Mam problem, ale miałem inne pytanie. Zaktualizowano (# 4) pytanie. – Reddy