Custom ConfigurationFactory kombineret med konfigurationsfil i log4j2
Jeg løste dette problem ved at ringe til
System.setProperty("log4j.configurationFactory", CustomConfigurationFactory.class.getName());
Som et alternativ kan du bruge denne JVM-startparameter:
-Dlog4j.configurationFactory=factory.CustomConfigurationFactory
i stedet for
ConfigurationFactory.setConfigurationFactory(new CustomConfigurationFactory());
før du får adgang til LogManager
for første gang.
-
EDIT: Du kan også konfigurere denne indstilling i filen log4j2.component.properties
.
Indhold:
log4j.configurationFactory=factory.CustomConfigurationFactory
Ved at gøre det kan du være sikker på, at denne indstilling anvendes, før nogen loggerklasser indlæses, og undgå de potentielle problemer med klasseinitialiseringsrækkefølgen.
Hvis du leder efter brug af org.apache.logging.log4j.util.PropertiesUtil
i Log4j2-kilderne kan du finde alle indstillinger, der kan konfigureres på den måde.
-
Under analyse/fejlretning af problemet bemærkede jeg, at min ConfigurationFactory
blev oprettet, men ikke brugt til at hente konfigurationen.
Endelig fandt jeg denne passage i dokumenterne, som forklarer det hele (vi kaldte nok ikke setConfigurationFactory
tidligt nok):
Under initialisering vil Log4j 2 søge efter tilgængelige ConfigurationFactories og derefter vælge den, der skal bruges. Den valgte ConfigurationFactory opretter den konfiguration, som Log4j vil bruge. Her er hvordan Log4j finder de tilgængelige ConfigurationFactories:
- En systemegenskab med navnet "log4j.configurationFactory" kan indstilles med navnet på den ConfigurationFactory, der skal bruges.
- ConfigurationFactory.setConfigurationFactory(ConfigurationFactory) kan kaldes med den forekomst af ConfigurationFactory, der skal bruges. Dette skal kaldes før andre opkald til Log4j.
- En ConfigurationFactory-implementering kan tilføjes til klassestien og konfigureres som et plugin i kategorien "ConfigurationFactory". Ordrekommentaren kan bruges til at angive den relative prioritet, når der findes flere relevante konfigurationsfabrikker.