9

在我的输出中,我有来自泽西岛的 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

4 回答 4

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();
    }
}
于 2015-11-25T04:07:09.533 回答
2

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

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

于 2010-12-06T19:20:38.633 回答
1

归功于上面的 John Smith,但这是带有正确包名称的单行答案:

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

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

让这成为Unix 哲学的沉默规则给你们所有人的一课:当你没有什么错误要说的时候,闭嘴。

于 2016-09-08T03:09:42.037 回答
0

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

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

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

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

有一篇关于 O'reilly的好文章应该对您有所帮助。

于 2010-12-07T22:14:32.720 回答