2010-03-16 11 views
5

Mam konfigurację log4J, w której dziennik główny ma logować komunikaty o poziomie błędu i powyżej do konsoli, a inny program rejestruje wszystko do syslog.log4j rootLogger wydaje się dziedziczyć poziom dziennika innego rejestratora. Czemu?

log4j.properties jest:

# Root logger option 
log4j.rootLogger=ERROR,R 

log4j.appender.R=org.apache.log4j.ConsoleAppender 
log4j.appender.R.layout=org.apache.log4j.PatternLayout 
log4j.appender.R.layout.ConversionPattern=%d %p %t %c - %m%n 

log4j.logger.SGSearch=DEBUG,SGSearch 
log4j.appender.SGSearch=org.apache.log4j.net.SyslogAppender 
log4j.appender.SGSearch.SyslogHost=localhost 
log4j.appender.SGSearch.Facility=LOCAL6 
log4j.appender.SGSearch.layout=org.apache.log4j.PatternLayout 
log4j.appender.SGSearch.layout.ConversionPattern=[%-5p] %m%n 

W kodzie zrobić

private static final Logger logger = Logger.getLogger("SGSearch"); 
. 
. 
. 
logger.info("Commencing snapshot index [" + args[1] + " -> " + args[2] + "]"); 

Co się dzieje jest, że dostanę rejestrowanie konsoli dla wszystkich poziomów logowania. Wygląda na to, że poziom SGSearch w pewnym sensie nadpisuje poziom ustawiony dla loginu root. Nie mogę tego rozgryźć.

I potwierdziły, że Log4J czyta plik właściwości myślę, że jest, a nie inne (poprzez opcję -Dlog4j.debug)

+0

Napotkałem ten sam problem/zamieszanie. Zobacz http://stackoverflow.com/questions/3023690/why-is-log4j-rootlogger-not-filtering-log-events-cording-to-event-level. –

Odpowiedz

13

Sposób działania łączenia Log4j jest nieco sprzeczny z intuicją (przynajmniej dla mnie). Zobacz the log4j manual. Jeśli poziom żądania jest równy lub wyższy od progu najbardziej konkretnego programu dopasowującego, jest on akceptowany. Po zaakceptowaniu żądania zostaje on obsłużony przez cały łańcuch przodków, niezależnie od ich progów!

Aby stłumić zachowanie łańcuchowym, dodać:

log4j.additivity.SGSearch=false 

Spowoduje rozpatrzonych przez rejestratora SGSearch aby nie być przekazywane w górę łańcucha.

Jeszcze jedna sugestia: nie nazwij swojego loggera i aplikanta tym samym, ponieważ w pewnym momencie w przyszłości ty lub twój kolega je pomieszycie. Nazwa rejestratora powinna wskazywać, jaki rodzaj rejestrowania jest obsługiwany, nazwa dostawcy powinna określać miejsce rejestrowania. Tak więc w tym przypadku myślę, że "SGSearch" może być nazwą rejestratora, a program wysyłający powinien być nazywany "LocalSysLog".

BTW: Moim zdaniem postępujesz słusznie, ograniczając rejestrator główny z wysokim progiem i obniżając go dla określonych rejestratorów.Pozwala to uniknąć bałaganu z głośnych bibliotek (Apache ma kilka znanych).

+1

Zaskakuje mnie, że Log4j nie stosuje progu dziennika zdarzeń w dziennikach nadrzędnych (gdzie główny rejestrator jest najwyższym obiektem nadrzędnym) niezależnie od ich rejestratorów potomnych. –

+0

Dziękujemy! Twoja odpowiedź była bardzo pomocna. Odsyłam do twojej odpowiedzi w mojej odpowiedzi na http://stackoverflow.com/questions/3023690/why-is-log4j-rootlogger-not-filtering-log-events-cording-to-event-level/3024279#3024279 do mojego podobne pytanie na http://stackoverflow.com/questions/3023690/why-is-log4j-rootlogger-not-filtering-log-events-cording-to-event-level. –

+1

"Gdy żądanie zostanie zaakceptowane, zostanie obsłużone przez cały łańcuch przodków, niezależnie od ich progów!" Jeśli to prawda, to czy nie jest to błąd w Log4j? Zachowanie, które jest tak sprzeczne z intuicją, musi być błędem. –

5

szybkiej informacji na temat poziomów

Poziomy

LOG4J

Rejestratorom można przypisać poziomy. Zestaw możliwych poziomów, tj. DEBUG, INFO, WARN, ERROR i FATAL, to zdefiniowany w klasie org.apache.log4j.Level .

Jeśli dany rejestrator nie jest przypisany poziom, to dziedziczy jeden z jego najbliższego przodka z przypisanym poziomie.

Główny program rejestrujący znajduje się u góry hierarchii programu rejestrującego w górnej części . Zawsze istnieje i zawsze ma przypisany poziom.

Zmieniłem konfigurację log4j próbki do pracy w ten sposób:

# Root logger option 
log4j.rootLogger=ALL,R 

log4j.appender.R=org.apache.log4j.ConsoleAppender 
log4j.appender.R.Target=System.out 
log4j.appender.R.layout=org.apache.log4j.PatternLayout 
log4j.appender.R.layout.ConversionPattern=%d %p %t %c - %m%n 
log4j.appender.R.Threshold=ERROR 

log4j.appender.SGSearch=org.apache.log4j.net.SyslogAppender 
log4j.appender.SGSearch.SyslogHost=localhost 
log4j.appender.SGSearch.Facility=LOCAL6 
log4j.appender.SGSearch.layout=org.apache.log4j.PatternLayout 
log4j.appender.SGSearch.layout.ConversionPattern=[%-5p] %m%n 
log4j.appender.SGSearch.Threshold=DEBUG 

Mam nadzieję, że to pomaga.

+0

Dzięki. To zadziałało, ale musiałem dodać wiersz "log4j.logger.SGSearch = ALL, SGSearch" również do podanego przykładu. – AndrewR

+0

@AndrewR: Albo mógłbyś zrobić to "log4j.appender.SGSearch.Threshold = ALL", ale wtedy to uczyniłoby 'log4j.rootLogger' bezużytecznym (jeśli się nie mylę). –

+0

Myślę, że to rozwiązanie jest nieoptymalne. Zobacz moją sugestię poniżej. –

Powiązane problemy