2010-12-03 15 views
8

In meiner Ausgabe habe ich Juli Log-Meldungen aus Jersey wie diesesAusschalten Jersey Protokollierung programmatisch

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

Programmatically ich sie ab, so habe ich versucht,

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

oder

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

aber das funktioniert nicht.

Lustig genug diese globale Konfiguration funktioniert:

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

oder

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

WARUM?

+0

Das ärgert mich auch. Wenn etwas richtig funktioniert, sollte es den Mund halten. –

Antwort

2

Die von Logger.getLogger() sind WeakReference s zurückLogger. Direkt nachdem Sie die entsprechende Stufe festgelegt haben, werden sie möglicherweise nicht mehr berücksichtigt, da Sie keinen Verweis darauf speichern und Ihre Einstellung löschen.

Speichern Sie Ihre Logger in einer Variablen immer mit einem geeigneten Rahmen, um die Einstellungen zu halten.

+0

Also schlagen Sie etwas wie private endgültige statische Logger COM_SUN_JERSEY_LOGGER = Logger.getLogger ("com.sun.jersey"); { System.out.println (COM_SUN_JERSEY_LOGGER); COM_SUN_JERSEY_LOGGER.setLevel (Level.SEVERE); } Ich bekomme null, also eine NPE. –

+0

Ja, so etwas. Ich kann dein Beispiel nicht reproduzieren, und Null macht keinen Sinn, da muss etwas anderes falsch sein. Was Sie hier tun, ist das Definieren des üblichen statischen Loggers, so dass Sie überhaupt nicht in diesem Namespace loggen können, wenn Logger.getLogger ("...") jemals null zurückgeben würde. – Heri

+2

Ahhh. Es arbeitet mit einem statischen Initialisierer und nicht mit einem Objektinitialisiererblock. Also: private endgültige statische Logger COM_SUN_JERSEY_LOGGER = Logger.getLogger ("com.sun.jersey"); statisch {COM_SUN_JERSEY_LOGGER.setLevel (Level.SEVERE); } macht es. –

0

Jede Logger-Instanz hat im Wesentlichen eine loglevel. Wenn Sie jedoch eine Loggerinstanz über Logger.getLogger() abrufen, erstellen Sie mehr als wahrscheinlich eine neue Instanz eines neuen Loggers. Da Sie keinen Bezug auf den Logger haben, geht er sofort außer Reichweite und Ihre Änderung ist verloren.

Der Grund, warum Logger.getLogger ("") und Logger.getLogger ("com") für Sie arbeiten, ist, dass persistente Logger bereits für diese zwei Ebenen erstellt werden, was bedeutet, dass Sie diejenigen Logger abrufen, die persistent bleiben.

Eine einfache Lösung ist es, die LogManager Klasse jul zu verwenden:

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

Es gibt eine great article auf O'reilly, die Ihnen helfen sollen.

+4

LogManager.getLogManager(). SetLevel ("com.sun.jersey", Level.SEVERE); gibt einen Compilerfehler. Sie haben LogManager.getLogManager() gemeint. GetLogger ("com.sun.jersey"). SetLevel (Level.SEVERE) ;? Wenn dann LogManager.getLogManager(). GetLogger ("com.sun.jersey") null zurückgibt, erhalten Sie eine NPE. –

+2

Ich habe ein paar Hinweise auf diese Methode an anderer Stelle gesehen. Es ist definitiv nicht in LogManager vorhanden - http://docs.oracle.com/javase/1.4.2/docs/api/java/util/logging/LogManager.html –

3

Ich hatte einige Probleme damit, also dachte ich, ich würde Code mit importierten, um Verwirrung zu vermeiden. Ich habe das getestet und es funktioniert in meiner Mini Webserver Konfiguration. Auch hier habe ich die gesamte Serverimplementierung der Vollständigkeit halber aufgeführt.

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

Dies scheint nicht mit Jersey 2.7 zu arbeiten. Ich habe SL4J mit Logback in meiner Jersey-basierten Anwendung. Brauchen Sie, um Jersey-Loglevel auf WARN einzustellen. – lochi

+0

Das machte auch für mich keinen Unterschied, bis ich merkte, dass mein Logging auf 'org.glassfish.jersey' ging. –

1

Credits zu John Smith oben, aber hier ist die eine Zeile Antwort mit der richtigen Paketname:

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

keine Importe notwendig, diese von java.util kommen.

Und dies eine Lektion für euch alle in Unix Philosophy 's Regel des Schweigens: Wenn Sie nichts zu sagen haben, sagen Sie verdammt nochmal.

+0

Hmmmm, nach nochmaligem Lesen der Frage wird das vielleicht nicht für das OP funktionieren. Aber es hat für mich funktioniert. –

Verwandte Themen