2013-03-15 16 views
26

Czy można programistycznie dodać programistów Log4J2 przy użyciu specyfikacji z konfiguracji XML?Jak programowo dodawać aplikacje log4J2 w środowisku wykonawczym?

planuję określić to wszystko w log4j2.xml a następnie odebrać appenders sytuacyjnie tak (nie będzie skompilować):

if (arg[0].equals("log")) { 
    Logger.getLogger("loggerNameFromXMLConfig").addAppender("appenderNameFromXMLConfig"); 
} else { 
    //... 
} 
+3

To jest zaledwie duplikat, ponieważ ma być log4j2 pytanie. Połączone pytanie odnosi się do log4j1 (który nie ujawnia nawet tych samych metod co log4j2) i slf4j. –

+1

Nie jestem pewien, czy ci, którzy zamknęli to pytanie, wiedzą, o co właściwie chodzi. –

+0

Obecnie, jako obejście problemu, porzuciłem log4j2 i przeszedłem do Log4J ("Log4J1"), który umożliwia dynamiczną konstrukcję z konfiguracji XML. –

Odpowiedz

15

Edit: dla najnowszych wersji log4j2 patrz https://stackoverflow.com/a/33472893/1899566 zamiast.

mam wrażenie, że nie ma to robisz, ale to działa na mnie:

if (arg[0].equals("log")) { 
    org.apache.logging.log4j.Logger logger 
    = org.apache.logging.log4j.LogManager.getLogger("loggerNameFromXMLConfig"); 
    org.apache.logging.log4j.core.Logger coreLogger 
    = (org.apache.logging.log4j.core.Logger)logger; 
    org.apache.logging.log4j.core.LoggerContext context 
    = (org.apache.logging.log4j.core.LoggerContext)coreLogger.getContext(); 
    org.apache.logging.log4j.core.config.BaseConfiguration configuration 
    = (org.apache.logging.log4j.core.config.BaseConfiguration)context.getConfiguration(); 

    coreLogger.addAppender(configuration.getAppender("appenderNameFromXMLConfig")); 
} else { 
    //... 
} 
+0

to jest piękne! :) –

+0

Dzięki - użyłem tego do tego - https://codingcraftsman.wordpress.com/2015/04/28/log4j2-mocking-with-mockito-and-junit/ –

18

Było kilka próśb o wsparcie dla lepszej konfiguracji programistycznej dla Log4j 2. Niestety, trwało to tak długo. Od wersji Log4j 2.4 interfejs API został dodany do log4j-core, aby ułatwić programmatic configuration.

Nowa funkcja API ConfigurationBuilder umożliwia użytkownikom tworzenie komponentów definicji. Dzięki temu API nie trzeba pracować bezpośrednio z rzeczywistymi obiektami konfiguracyjnymi (takimi jak LoggerConfig i FileAppender), które wymagają dużej wiedzy na temat działania Log4j pod maską. Definicje komponentów dodawane są do ConfigurationBuilder, a po zebraniu wszystkich definicji tworzone są wszystkie rzeczywiste obiekty konfiguracyjne (takie jak Loggers i Appenders). Czuje się trochę jak składnia konfiguracji XML, z wyjątkiem tego, że piszesz kod Java.

Należy pamiętać, że nowy interfejs API ConfigurationBuilder pozwala kodowi użytkownika utworzyć nową konfigurację lub całkowicie zastąpić istniejącą konfigurację. Jeśli twój przypadek użycia jest inny i chcesz programowo zmodyfikować (zamiast wymienić) istniejącą konfigurację po uruchomieniu Log4j, będziesz musiał pracować z rzeczywistymi obiektami konfiguracyjnymi. W takim przypadku zapoznaj się z rozdziałem Programmatically Modifying the Current Configuration after Initialization instrukcji.

Powiązane problemy