2012-07-11 12 views
21

Czy mimo to musisz zmusić slf4j do korzystania z określonego dostawcy rejestrowania (logback w moim przypadku)? Ponieważ w ich docs: znalezionoWymuś użycie slf4j, aby użyć logback'u

Wiele Wiązania na ścieżce klasy

SLF4J API desinged związać z jednego i tylko jednego bazowego ramach rejestrowania w czasie. Jeśli na ścieżce klasy występuje więcej niż jedno powiązanie, SLF4J wyśle ​​ostrzeżenie, wyświetlając lokalizację tych powiązań. Gdy na ścieżce klasy dostępnych jest wiele powiązań, wybierz jedno i tylko jedno wiązanie, którego chcesz użyć, i usuń pozostałe powiązania. Na przykład, jeśli posiadasz zarówno slf4j-> simple-1.6.6.jar i slf4j-nop-1.6.6.jar na ścieżce klasy i chcesz użyć wiązania nop (> no-operation), usuń slf4j- simple-1.6.6.jar ze ścieżki klasy. Jeśli nie jest możliwe usunięcie superflamowych powiązań, SLF4J nadal będzie wiązał się z jednym ramieniem/implementacją rejestrowania. Począwszy od wersji 1.6.6, SLF4J nazwie nazwę klasy/klasy implementacji, do której faktycznie jest związany.

UWAGA Ostrzeżenie wysyłane przez SLF4J jest właśnie tym, ostrzeżeniem.

W moim przypadku mam log4j.jar, slf4j-log4j12.jar, log4j-over-slf4j.jar i wszystkie słoiki logback w ścieżce klasy. Wiem, że błędem jest mieć razem slf4j-log4j12.jar i log4j-over-slf4j.jar, ale mój projekt jest bardzo duży i nie zawsze łatwo jest znaleźć i wykluczyć zależność od mavenów. W tym przypadku slf4j nawet nie wydrukował żadnego ostrzeżenia, ponieważ używamy tylko konfiguracji logback. Zajęło mi dzień, aby zrozumieć piekło.

Wszystko, czego chcę, to zmuszanie slf4j do użycia funkcji logback za pomocą argumentu JVM, na przykład, aby drukować ostrzeżenia i mogę wykluczyć słoiki w przyszłości.

Odpowiedz

14

Oprócz czyszczenia ścieżki klasowej nie ma możliwości zmuszenia SLF4J do powiązania z daną implementacją.

+0

Szkoda mi – madhead

17

Ogólnie twój własny kod znajduje się na początku ścieżki klasy. Z tego powodu, jednym ze sposobów, aby to zrobić jest stworzenie własnej klasy org.slf4j.impl.StaticLoggerBinder:

package org.slf4j.impl; 

import org.slf4j.ILoggerFactory; 
import org.slf4j.spi.LoggerFactoryBinder; 

/** 
* Force tests to use JDK14 for logging. 
*/ 
@SuppressWarnings("UnusedDeclaration") 
public class StaticLoggerBinder implements LoggerFactoryBinder { 
    private static final StaticLoggerBinder SINGLETON = new StaticLoggerBinder(); 

    public static String REQUESTED_API_VERSION = "1.6"; 

    public static final StaticLoggerBinder getSingleton() { 
     return SINGLETON; 
    } 

    private StaticLoggerBinder() { 
    } 

    @Override 
    public ILoggerFactory getLoggerFactory() { 
     return new JDK14LoggerFactory(); 
    } 

    @Override 
    public String getLoggerFactoryClassStr() { 
     return "org.slf4j.impl.JDK14LoggerFactory"; 
    } 
} 
+0

Dziękuję za odpowiedź, ale ja już oczyścić moje ścieżki klasy . – madhead

+2

Mimo to jest to świetna odpowiedź: – StormeHawke

+0

w jaki sposób użyć tego kodu do logback, co powinien powrócić ILoggerFactory getLoggerFactory() zamiast nowego JDK14LoggerFactory() – nagSumanth