2012-08-23 13 views
5

Jeśli moich log4j.properties wygląda toJak uzyskać odrębne rejestratory w log4j?

# General configuration 
log4j.rootLogger = ERROR, ConsoleAppender 

# Appender configuration 
log4j.appender.ConsoleAppender = org.apache.log4j.ConsoleAppender 
log4j.appender.ConsoleAppender.layout = org.apache.log4j.PatternLayout 
log4j.appender.ConsoleAppender.layout.ConversionPattern = %5p (%c) %m%n 
#Other Loggers 
log4j.logger.com.foo=INFO 
log4j.logger.com.foo.Bar=DEBUG 
log4j.logger.org.springframework=INFO 

Czy istnieje prosty sposób uzyskać tylko rejestratory com.foo, com.foo.Bar, root i org.springframework. A nie konkretne klasy, które zostały utworzone i dziedziczą poziomy (IE com.foo.bar.Baz?
Dla moich celów chcę utworzyć stronę admin, która wyświetla te rejestratory i ich poziomy, ale nie wszystkie loggery, tylko te, które zostały skonfigurowane bezpośrednio poprzez właściwości. aktualnie przechodzę do hierarchii nadrzędnej, aż natknę się na program rejestrujący, który ma inny poziom niż jego macierzysty, ale który może ukryć niektóre skonfigurowane rejestratory, jeśli znajdują się one w hierarchii i ustawić ten sam poziom co wyższy.

+1

Czy parsowanie pliku właściwości nie wchodzi w grę? –

+0

Nie, za pomocą log4j programowo wykryć, które rejestratory zostały skonfigurowane, i nie są tylko dziedziczenie z innych rejestratorów. – Kodi

Odpowiedz

4

można zrobić coś takiego Pierwszy uzyskać wszystkie rejestratory z menedżera dziennika.

Enumeration<Category> loggers = LogManager.getCurrentLoggers(); 

Następnie można poprosić każdego rejestratora do jego poziomu:

Level currentLevel = logger.getLevel(); 

currentLevel będzie null jeśli nigdy nie zostały wyraźnie określone. Tak więc, jeśli rejestrator został ustawiony na konkretny poziom w log4j.properties, otrzymasz wartość inną niż null. W przeciwnym razie otrzymasz wartość null. Rejestr główny zawsze zgłasza poziom, więc byłby to przypadek specjalny. W ten sposób nie trzeba analizować pliku log4j.properties.

Jedyny problem polega na tym, że jeśli gdzieś w kodzie wywołujesz setLevel() w programie rejestrującym, to również zgłosi wartość inną niż null i pojawi się na liście. Wynika to z tego, że log4j nie znał poziomu, który został ustawiony, tylko jeśli był ustawiony w ogóle. Aby rozróżnić te dwa przypadki, nadal trzeba przeanalizować log4j.properties.

Należy również pamiętać, że działa to tylko w przypadku aktualnie ładowanych rejestratorów. Więc jeśli com.foo.Bar nigdy nie został załadowany, nie zobaczysz go na liście, nawet jeśli jest to wyraźnie wymienione w log4j.properties. Log4J nie wie o nieistniejących rejestratorach, które mogą być tworzone w przyszłości. Ponownie, do tego trzeba by parsować log4j.properties.

+4

W LogManager nie ma getCurrentLoggers(). Log4j 2.2. –

+1

@MagnoC Prawo, moja odpowiedź odnosi się do [Log4J v1] (https://logging.apache.org/log4j/1.2/apidocs/index.html?org/apache/log4j/LogManager.html). Log4J v2 w momencie odpowiedzi pozostał jeszcze dwa lata (w 2014 r.). –

+0

Ok. Po prostu narzekam ... Muszę zawinąć Log4J do mojej własnej klasy Logger (aby zachować nazwy potrzebne do usunięcia Logar JJ i utworzyć moje klasy o tych samych nazwach) i ponownie dodać JAR Log4J. Więc nazywam prawdziwego loggera z mojej klasy Logger (używając pełnej nazwy klasy). Teraz mogę włączyć i wyłączyć MOJ logger. Po wyłączeniu po prostu nie przekazuję ciągu log przez prawdziwy log. –