2010-12-03 13 views
8

W moim wyjściu mam logu lip z Jersey jak tenWyłączanie Jersey rejestrowanie programowo

03.12.2010 14:14:55 com.sun.jersey.api.core.PackagesResourceConfig init 
INFO: Scanning for root resource and provider classes in the packages: 

Programowo Chciałem swich je więc próbowałem

Logger.getLogger("com.sun.jersey.api.core.PackagesResourceConfig").setLevel(Level.SEVERE); 

lub

Logger.getLogger("com.sun.jersey").setLevel(Level.SEVERE); 

ale to nie działa.

Funny wystarczająco globalna konfiguracja działa:

Logger.getLogger("com").setLevel(Level.SEVERE); 

lub

Logger.getLogger("").setLevel(Level.SEVERE); 

DLACZEGO?

+0

To mnie denerwuje. Jeśli coś działa poprawnie, powinno się zamknąć. –

Odpowiedz

2

Loggers zwrócone przez Logger.getLogger()WeakReference s. Tak więc bezpośrednio po ustawieniu odpowiedniego poziomu, mogą one uzyskać śmieci zebrane, ponieważ nie zachowujesz żadnego odniesienia do nich, usuwając w ten sposób twoje ustawienia.

Przechowuj rejestrator w zmiennej o odpowiednim zakresie, aby zachować ustawienia.

+0

Sugerujesz coś takiego, jak prywatny końcowy rejestrator statyczny COM_SUN_JERSEY_LOGGER = Logger.getLogger ("com.sun.jersey"); { System.out.println (COM_SUN_JERSEY_LOGGER); COM_SUN_JERSEY_LOGGER.setLevel (Level.SEVERE); } Otrzymuję wartość null, więc NPE. –

+0

Tak, coś takiego. Nie mogę odtworzyć twojego przykładu, a null nie ma sensu, musi być coś jeszcze nie tak z tym. To, co tu robisz, definiuje zwykły statyczny program rejestrujący, więc nie można logować się w ogóle w tym obszarze nazw, jeśli Logger.getLogger ("...") kiedykolwiek zwróci wartość null. – Heri

+2

Ahhh. Działa ze statycznym inicjatorem, a nie blokiem inicjalizującym obiekt. A więc: prywatny końcowy rejestrator statyczny COM_SUN_JERSEY_LOGGER = Logger.getLogger ("com.sun.jersey"); static {COM_SUN_JERSEY_LOGGER.setLevel (Level.SEVERE); } to robi. –

0

Zasadniczo każda instancja programu rejestrującego ma warstwę logiczną. Jednak po pobraniu instancji programu rejestrującego za pomocą narzędzia Logger.getLogger() najprawdopodobniej zostanie utworzone nowe wystąpienie nowego programu rejestrującego. Ponieważ nie zachowujesz odniesienia do rejestratora, natychmiast wychodzi poza zasięg i twoja zmiana zostanie utracona.

Powód, dla którego Logger.getLogger ("") i Logger.getLogger ("com") działają dla Ciebie, jest to, że trwałe rejestratory są już tworzone dla tych dwóch poziomów, co oznacza, że ​​pobierasz te rejestratory, które pozostają trwałe.

Prostym rozwiązaniem jest użycie klasy LogManager w lipcu:

LogManager.getLogManager().setLevel("com.sun.jersey", Level.SEVERE); 

Jest great article na O'Reilly, które powinny pomóc.

+4

LogManager.getLogManager(). SetLevel ("com.sun.jersey", Level.SEVERE); daje błąd kompilatora. Miałeś na myśli LogManager.getLogManager(). GetLogger ("com.sun.jersey"). SetLevel (Level.SEVERE) ;? Jeśli, następnie LogManager.getLogManager(). GetLogger ("com.sun.jersey") zwróci wartość null, więc otrzymasz NPE. –

+2

Widziałem kilka odwołań do tej metody w innym miejscu. Z pewnością nie ma go w LogManager - http://docs.oracle.com/javase/1.4.2/docs/api/java/util/logging/LogManager.html –

3

Miałem problemy z tym, więc pomyślałem, że wprowadzę kod z importem, aby uniknąć nieporozumień. Przetestowałem to i działa w mojej konfiguracji miniserwera. Ponownie uwzględniłem implementację całego serwera dla kompletności.

import java.io.IOException; 
import java.net.URI; 
import java.util.logging.Level; 
import java.util.logging.Logger; 

import javax.ws.rs.core.UriBuilder; 

import com.sun.jersey.api.container.httpserver.HttpServerFactory; 
import com.sun.jersey.api.core.PackagesResourceConfig; 
import com.sun.jersey.api.core.ResourceConfig; 
import com.sun.net.httpserver.HttpServer; 

public class WebServer { 

    private HttpServer webServer; 

    private final static Logger COM_SUN_JERSEY_LOGGER = Logger.getLogger("com.sun.jersey"); 

    static { 
     COM_SUN_JERSEY_LOGGER.setLevel(Level.SEVERE); 
    } 

    public void start() throws IOException { 
     System.out.println("Starting WebServer\n"); 
     webServer = createHttpServer(); 
     webServer.start(); 
     System.out.println(String.format("\nWeb Server started:" + "%sapplication.wadl\n", getURI())); 
    } 

    public void stop() { 
     webServer.stop(0); 
    } 

    public static HttpServer createHttpServer() throws IOException { 
     ResourceConfig rc = new PackagesResourceConfig("com.daford"); 
     return HttpServerFactory.create(getURI(), rc); 
    } 

    private static URI getURI() { 
     return UriBuilder.fromUri("http://localhost/").port(4444).build(); 
    } 
} 
+0

Nie działa to z wersją Jersey 2.7. Mam sl4j z logbackem w mojej aplikacji opartej na dżerseju. Musisz ustawić poziom dziennika jersey na WARN. – lochi

+0

Nie zrobiło to dla mnie żadnego znaczenia, NIe zdałem sobie sprawę, że moje logowanie się do 'org.glassfish.jersey'. –

1

kuponów do Johna Smitha powyżej, ale tutaj jest odpowiedź jedna linia z prawej nazwy pakietu:

Logger.getLogger("org.glassfish.jersey").setLevel(Level.SEVERE); 

Brak import potrzeby te pochodzą z java.util.

I niech to będzie dla was wszystkich lekcją z zasady milczenia Unix Philosophy: kiedy nie masz nic złego do powiedzenia, zamknij się piekło.

+0

Hmmmm, po ponownym lekturze tego pytania uważniej może to nie zadziała w OP. Ale zadziałało to dla mnie. –