2012-03-29 19 views
5

Próbuję zmodyfikować niektóre funkcje logowania (niestandardowe dodatki i tym podobne). Aby go przetestować, chciałbym skonfigurować Logback i wywołać jego metody rejestrowania bezpośrednio, bez przechodzenia przez sl4j.Korzystanie z funkcji Logback bezpośrednio bez przechodzenia przez SLF4J

Powodem tego dziwnego wymogu jest możliwość przetestowania funkcji logowania w środowisku, w którym dostępne są również inne mosty SLF4J.

Więc chcę zrobić rzeczy opisany tutaj: http://logback.qos.ch/manual/configuration.html#joranDirectly bez odniesienia do slf4j

Odpowiedz

3

nie próbowałem, ale wygląda poprawnie, może to pomoże:

LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory(); 
ch.qos.logback.classic.Logger log = lc.getLogger(foo.Bar.class); 

ch.qos.logback.classic.Logger realizuje org.slf4j.Logger ale możesz go użyć bezpośrednio. Być może trzeba będzie inaczej uzyskać LoggerContext.

+1

LoggerFactory jest częścią slf4j i wykorzystuje klasę StaticLoggerBinder, która jest dostarczana z różnymi implementacjami mostów, więc wciąż używam mechanizmu powiązania slf4j z tym. –

+0

@JensSchauder: co powiesz na proste utworzenie 'nowego LoggerContext()' i całkowite uniknięcie API SLF4J? –

+1

Tworzę interfejs API, w którym nie mogę w ogóle korzystać z SLF4j, czy można używać autonomicznego trybu logowania? – Akhilesh

1

Niestety, nie sądzę, że jest to możliwe. Jeśli spojrzysz na Logback Logger source (lub inne klasy), zobaczysz, że zależy to od slf4j.

To nie jest miłe, imho, ponieważ logback powinien być nieświadomy slf4j.

2

Istnieje sposób, aby się dowiedzieć.

Oto przykład, jak można skonfigurować LOGBack

// Here we create context 
LoggerContext loggerContext = new LoggerContext(); 
// Initializer is used to enrich context with details 
ContextInitializer contextInitializer = new ContextInitializer(loggerContext); 
try { 
    // Get a configuration file from classpath 
    URL configurationUrl = Thread.currentThread().getContextClassLoader().getResource("custom-logback-configuration.xml"); 
    if (configurationUrl == null) { 
     throw new IllegalStateException("Unable to find custom logback configuration file"); 
    } 
    // Ask context initializer to load configuration into context 
    contextInitializer.configureByResource(configurationUrl); 
    // Here we get logger from context 
    logger = loggerContext.getLogger(LogReporter.class); 
} catch (JoranException e) { 
    throw new RuntimeException("Unable to configure logger", e); 
} 

W ogóle, jeśli chcesz wiedzieć, jak wszelkie prace SLF4J zaplecza, może po prostu patrzeć na org.slf4j.impl.StaticLoggerBinder źródła klasy z tego backend .

+0

To działało idealnie dla mnie w podobnym kontekście, w którym musiałem jawnie zdefiniować "środowisko" (kontekst) Logback bez polegania na powiązaniu SLF4J (ponieważ SLF4J był już powiązany z log4j i nie miałem dostępu do ścieżki klasy do móc to zmienić za pomocą różnych mostków SLF4J lub podobnych). –

Powiązane problemy