diff --git a/slf4j-api/src/main/java/org/slf4j/LoggerFactory.java b/slf4j-api/src/main/java/org/slf4j/LoggerFactory.java index 06828e5e3..8ba8447e8 100755 --- a/slf4j-api/src/main/java/org/slf4j/LoggerFactory.java +++ b/slf4j-api/src/main/java/org/slf4j/LoggerFactory.java @@ -178,7 +178,7 @@ private final static void bind() { List providersList = findServiceProviders(); reportMultipleBindingAmbiguity(providersList); if (providersList != null && !providersList.isEmpty()) { - PROVIDER = providersList.get(0); + PROVIDER = preferProvider(providersList); // SLF4JServiceProvider.initialize() is intended to be called here and nowhere else. PROVIDER.initialize(); INITIALIZATION_STATE = SUCCESSFUL_INITIALIZATION; @@ -199,6 +199,29 @@ private final static void bind() { } } + /** + * In case of multiple providers, it picks the one from "slf4j.preferred.provider" system property, + * or leave the default one. + * @param providersList List providers + * @return SLF4JServiceProvider the found provider, matching class name provided in the system property + * if found, default one otherwise + */ + private static SLF4JServiceProvider preferProvider(List providersList) { + final String preferred = System.getProperty("slf4j.preferred.provider", ""); + SLF4JServiceProvider found = providersList.get(0); + if (preferred == null || preferred.isEmpty()) { + return found; + } else { + Util.report("Preferred provider : " + preferred); + } + return providersList.stream() + .filter(provider -> preferred.equalsIgnoreCase(provider.getClass().getName())) + .findFirst().orElseGet(() -> { + Util.report("Preferred provider not found in the providers, use " + found); + return found; + }); + } + private static void reportIgnoredStaticLoggerBinders(Set staticLoggerBinderPathSet) { if (staticLoggerBinderPathSet.isEmpty()) { return; @@ -374,7 +397,7 @@ private static void reportMultipleBindingAmbiguity(List pr private static void reportActualBinding(List providerList) { // binderPathSet can be null under Android if (!providerList.isEmpty() && isAmbiguousProviderList(providerList)) { - Util.report("Actual provider is of type [" + providerList.get(0) + "]"); + Util.report("Actual provider is of type [" + PROVIDER + "]"); } }