以编程方式关闭Jersey日志记录

10

我的输出中有来自Jersey的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:

我想用编程的方式关闭它们,所以我尝试了以下代码:

Programmatically I wanted to swich them off so I tried

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

为什么?


1
这也让我很烦。如果某个东西正常工作,它就应该保持安静。 - Sridhar Sarnobat
如果您正在使用 slf4,请前往该问题以查看如何正确配置 jul-to-slf4j 桥接器:https://dev59.com/G2ox5IYBdhLWcg3wk1Ig - koppor
4个回答

3

我在这方面遇到了一些问题,所以我想把导入的代码放进去以避免混淆。我测试了一下,在我的迷你web服务器配置中可以正常运行。为了完整起见,我也包括了整个服务器实现。

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

这似乎不适用于Jersey 2.7。我在基于Jersey的应用程序中使用了sl4j和logback。需要将Jersey日志级别设置为WARN。 - lochi
这对我也没有任何影响,直到我意识到我的记录是在“org.glassfish.jersey”中进行的。 - Sridhar Sarnobat

2
Logger.getLogger()返回的日志记录器是 WeakReference。因此,在设置适当的级别后,它们可能被垃圾回收,因为您没有保留对其的任何引用,从而会删除您的设置。
将您的日志记录器存储在具有适当作用域的变量中,以保持您的设置。

那么你建议像这样做: private final static Logger COM_SUN_JERSEY_LOGGER = Logger.getLogger( "com.sun.jersey" ); { System.out.println(COM_SUN_JERSEY_LOGGER); COM_SUN_JERSEY_LOGGER.setLevel( Level.SEVERE ); }但我得到了null,所以是一个NPE错误。 - Niel Niergard
是的,就像这样。我无法重现你的示例,并且空值没有任何意义,肯定存在其他问题。你在这里做的是定义常规的静态记录器,因此如果Logger.getLogger("...")返回null,则无法在该命名空间中进行日志记录。 - Heri
3
啊哈,它使用静态初始化器而不是对象初始化块。所以这样写: private final static Logger COM_SUN_JERSEY_LOGGER = Logger.getLogger( "com.sun.jersey" ); static { COM_SUN_JERSEY_LOGGER.setLevel( Level.SEVERE ); } 就可以了。 - Niel Niergard

1

感谢以上的John Smith,但以下是正确的包名称的一行答案:

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

不需要导入任何内容,这些来自java.util。
并且让这成为Unix Philosophy的教训:当你没有错误的话要说时,闭嘴。

嗯,仔细重新阅读问题后,也许这对于楼主不起作用。但是它对我有用。 - Sridhar Sarnobat

0

基本上,每个记录器实例都具有一个日志级别。但是,当您通过Logger.getLogger()检索记录器实例时,很可能正在创建新记录器的新实例。由于您没有保留对Logger的引用,它立即超出作用域,您的更改就会丢失。

Logger.getLogger("")和Logger.getLogger("com")适用于您的原因是已经为这两个级别创建了持久记录器,这意味着您检索到的是仍然持久的那些记录器。

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

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

在 O'Reilly 上有一篇很棒的文章,应该能帮到你。


4
LogManager.getLogManager().setLevel("com.sun.jersey", Level.SEVERE)会产生编译错误。你可能想要使用LogManager.getLogManager().getLogger("com.sun.jersey").setLevel(Level.SEVERE)。如果是这样,LogManager.getLogManager().getLogger("com.sun.jersey")将返回null,因此你会得到一个NPE异常。 - Niel Niergard
2
我在其他地方看到过这种方法的参考。它绝对不存在于LogManager中--http://docs.oracle.com/javase/1.4.2/docs/api/java/util/logging/LogManager.html。 - David Blevins

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接