Skip to content

Commit

Permalink
✨ Adds feature that allows to prefer a provider
Browse files Browse the repository at this point in the history
Signed-off-by: Marco Carletti <mcarlett@redhat.com>
  • Loading branch information
mcarlett committed Jul 6, 2023
1 parent 6fd9db9 commit bf93c0d
Showing 1 changed file with 25 additions and 2 deletions.
27 changes: 25 additions & 2 deletions slf4j-api/src/main/java/org/slf4j/LoggerFactory.java
Expand Up @@ -178,7 +178,7 @@ private final static void bind() {
List<SLF4JServiceProvider> 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;
Expand All @@ -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<SLF4JServiceProvider> providers
* @return SLF4JServiceProvider the found provider, matching class name provided in the system property
* if found, default one otherwise
*/
private static SLF4JServiceProvider preferProvider(List<SLF4JServiceProvider> 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<URL> staticLoggerBinderPathSet) {
if (staticLoggerBinderPathSet.isEmpty()) {
return;
Expand Down Expand Up @@ -374,7 +397,7 @@ private static void reportMultipleBindingAmbiguity(List<SLF4JServiceProvider> pr
private static void reportActualBinding(List<SLF4JServiceProvider> 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 + "]");
}
}

Expand Down

0 comments on commit bf93c0d

Please sign in to comment.