2012-12-24 10 views
13

Czy w czasie wykonywania można pobrać listę wszystkich dostawców skonfigurowanych w log4j?Pobieranie listy załączników Log4J w czasie wykonywania

Jeszcze trochę rozwiążę scenariusz. Biorąc pod uwagę następującą konfigurację, w jaki sposób odzyskać wszystkie appendery (stdout i altstdout)?

log4j.rootLogger=error, stdout 

log4j.appender.stdout=org.apache.log4j.ConsoleAppender 
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout 

log4j.appender.altstdout=org.apache.log4j.ConsoleAppender 
log4j.appender.altstdout.layout=org.apache.log4j.PatternLayout 

# Pattern to output the caller's file name and line number. 
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n 
log4j.appender.altstdout.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n 
+0

czy używasz lo4j 1.2 lub log4j2? Oznaczanie ich jest dezorientujące, ponieważ mają różne interfejsy API. – Simulant

Odpowiedz

11

Jeśli chcesz otrzymać dostęp do wszystkich appenders skonfigurowanych dla wszystkich rejestratorów trzeba zrobić coś takiego

for (Enumeration loggers=LogManager.getCurrentLoggers(); loggers.hasMoreElements();) { 
    Logger logger = (Logger) loggers.nextElement(); 
    for (Enumeration appenders=logger.getAllAppenders(); appenders.hasMoreElements();) { 
     Appender appender = (Appender) appenders.nextElement(); 
     ... 

ja nie wiedzieć, dlaczego log4j nie ma żadnej metody, takiej jak LogManager.getAllAppenders(), ale wygląda na wady:
.

+0

To by działało, ale nie było tak istotne dla naszej potrzeby. Tworzyłem konfigurację rejestrowania, dzięki czemu mogliśmy dynamicznie tworzyć/modyfikować rejestratory. Zasadniczo wymagało to aplikacji, które nie były aktualnie używane. W końcu właśnie stworzyłem program rejestrujący, który został skonfigurowany ze wszystkimi aplikatorami i zawsze był ustawiony na WYŁ. – binarymelon

+3

Może to działać dla log4j, ale definitywnie nie dla log4j2, ponieważ w log4j2 nie ma LogManager.getCurrentLoggers() ani Logger.getAllAppenders(). – Joe

+1

, więc jak to zrobić w log4j2 –

0

Chcę dodać coś, co zajęło mi trochę czasu, aby zrozumieć. Jeśli spojrzy się na poniższy rysunek (który skopiowałem z here), widać, że nawet jeśli program rejestrujący com.foo.bar będzie drukował do rejestratora głównego FileAppender, lista jego nadawców będzie nadal pusta. Tak więc nie można uzyskać wszystkich aplikacji, do których rejestrator napisze przy pomocy metody logger.getAllAppenders().

enter image description here

Do tego trzeba wykonać iterację wszystkich rodziców, także i rejestratora głównego oddzielnie. Ponieważ nie można iterować logger.getParent() do programu rejestrującego root (program rejestrujący root zwraca wartość null - zobacz dokumentację metody getParent()). O ile wiem, musisz uzyskać dostęp do aplikacji rootLoggers "osobno przez Logger.getRootLogger().getAllAppenders().