以编程方式关闭Jersey记录

时间:2010-12-03 13:20:18

标签: java rest logging jersey java.util.logging

在我的输出中,我有来自泽西岛的JUL记录消息,如此

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

以编程方式我想把它们关掉,所以我尝试了

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

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

但这不起作用。

这个全局配置很有趣:

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

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

为什么?

4 个答案:

答案 0 :(得分:3)

我遇到了一些问题所以我认为我会将代码放入导入以避免混淆。我测试了它,它可以在我的迷你网络服务器配置中运行。同样,我将完整性包含在整个服务器实现中。

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();
    }
}

答案 1 :(得分:2)

Logger.getLogger()返回的记录器为WeakReference秒。因此,在您设置适当的级别后,它们可能会被垃圾收集,因为您不会保留任何引用,因此会删除您的设置。

将记录器存储在具有适当范围的变量中,以保留您的设置。

答案 2 :(得分:1)

以上对John Smith的信用,但这是使用正确的包名称的一行答案:

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

不需要导入,这些来自java.util。

Unix Philosophy的沉默规则中,让这一切成为你们所有人的教训:当你没有任何错误的说法时,关闭地狱。

答案 3 :(得分:0)

基本上每个记录器实例都有一个loglevel。但是,当您通过Logger.getLogger()检索记录器实例时,很可能会创建新记录器的新实例。由于您没有保留对Logger的引用,因此它会立即超出范围,并且您的更改将丢失。

Logger.getLogger(“”)和Logger.getLogger(“com”)为您工作的原因是已经为这两个级别创建了持久性记录器,这意味着您正在检索那些保持持久性的记录器。

一个简单的解决方法是在JUL中使用LogManager类:

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

O'reilly上有great article可以帮到你。