无法在Java Web Start应用程序中设置日志级别?

时间:2013-04-20 10:16:30

标签: java java-ee logging java-web-start java.util.logging

某些日志记录级别似乎已损坏?

我直接从GlassFish 3.1.2.2实例运行Java Web start(我将从现在开始调用 JWS )应用程序。客户端有一个静态记录器,如下所示:

private final static Logger LOGGER;
static {
    LOGGER = Logger.getLogger(App.class.getName());
    // Not sure how one externalize this setting or even if we want to:
    LOGGER.setLevel(Level.FINER);
}

在main方法中,我通过一些简单的日志记录功能测试开始我的逻辑:

alert("isLoggable() INFO? " + LOGGER.isLoggable(Level.INFO));     // Prints TRUE!
alert("isLoggable() FINE? " + LOGGER.isLoggable(Level.FINE));     // ..TRUE
alert("isLoggable() FINER? " + LOGGER.isLoggable(Level.FINER));   // ..TRUE
alert("isLoggable() FINEST? " + LOGGER.isLoggable(Level.FINEST)); // ..FALSE

我的警报方法将显示“{GUI 1日志记录”的JOptionPane对话框。无论如何,你在我的评论中看到了我在代码片段中添加的打印输出。正如预期的那样,记录器的级别为 INFO FINE FINER ,但不是 FINEST

在我的提醒方法之后,我输入:

// Info
LOGGER.info("Level.INFO");
LOGGER.log(Level.INFO, "Level.INFO");

// Fine
LOGGER.fine("Level.FINE");
LOGGER.log(Level.FINE, "Level.FINE");

// Finer
LOGGER.finer("Level.FINER");
LOGGER.log(Level.FINER, "Level.FINER");
LOGGER.entering("", "Level.FINER", args); // <-- Uses Level.FINER!

// Finest
LOGGER.finest("Level.FINEST");
LOGGER.log(Level.FINEST, "Level.FINEST");

我转到我的Java控制台并单击“高级”选项卡,然后勾选“启用日志记录”。好的,让我们开始申请。猜猜会发生什么? 只打印Level.INFO!这是我的证明(请查看底部):

enter image description here

我已尽力在我的计算机上搜索日志文件,看看Level.FINE和Level.FINER是否最终在文件系统的某处。但是,我无法在任何地方找到日志消息。

问题摘要

  1. 为什么Level.FINELevel.FINER的日志记录在提供的示例中不起作用?

  2. 我在静态初始化块中设置了日志记录级别,但我确定要将此设置外部化为某种配置文件,可能与我在GlassFish上部署的EAR文件一起打包。或者为什么不手动写入我们从服务器下载的JNLP文件中的某些属性。这有可能吗?

1 个答案:

答案 0 :(得分:0)

问题1的解决方案。

在对该主题进行了一些阅读之后,我得出结论,Java中的记录器使用处理程序来发布他的日志。而这个处理程序又有他自己的“墙”,用于他处理的等级。但是这个处理程序不需要直接附加到我们的记录器!您会看到记录器是organized in a hierarchical namespace,并且他的父母处理程序是子记录器may inherit。如果是,请By default a Logger will log any output messages to its parent's handlers, and so on recursively up the tree(参见Java Logging Overview - Oracle)。

我并不是说我已经全面了解了,而且我确实没有找到任何关于所有这些与Java Web Start应用程序相关的引用。当然必须有一些差异。无论如何,我确实设法将这个静态初始化块写在一起,解决了我的直接问题:

static {
    LOGGER = Logger.getLogger(App.class.getName());
    /*
     * This logic can be externalized. See the next solution!
     */
    // DEPRECATED: LOGGER.setLevel(Level.FINER);
    if (LOGGER.getUseParentHandlers())
        LOGGER.getParent().getHandlers()[0].setLevel(Level.FINER);
    else
        LOGGER.setLevel(Level.FINER);
}

问题2的解决方案。

LogManager API docs为以下解决方案提供了非常需要的信息。在JRE安装的子目录中,有一个名为“lib”的子目录,在那里你会找到一个“logging.properties”文件。这是我的Windows机器上文件的完整路径:

C:\Program Files (x86)\Java\jre7\lib\logging.properties

在这里你可以改变很多口味。您可以做的一件很酷的事情是更改全局日志记录级别。在我的文件中,这是在第29行上完成的(为什么我们只看到“level”前面的一个点?所有记录器的root-parent称为“”!)。这将产生大量的输出;在我的机器上,我每秒收到大约一千条日志消息。因此,改变全球水平甚至不足以被视为一种选择。而是添加一个新行,您可以在其中指定记录器的级别。就我而言,我添加了这一行:

martinandersson.com.malivechat.app.App.level = FINER

但是,您可能仍然看不到任何结果。在解决方案1中,我谈到了记录器如何连接到处理程序。默认处理程序在 logging.properties 中指定,很可能在第18行上。这是我的行如何读取:

handlers= java.util.logging.ConsoleHandler

此前,我还谈到了这些处理程序如何使用级别来解决他们的想法。那么,找到这样的行(现在应该在第44行?):

java.util.logging.ConsoleHandler.level = INFO

..在我的情况下,我将“INFO”换成“FINER”。问题解决了。

但是!

我对这个问题的原始调查仍未提供答案,如何设置这些属性与应用程序部署相近。更具体地说,我想将这些属性附加到一个单独的文件中,与我在GlassFish上部署的应用程序EAR文件捆绑在一起或类似的东西。你有更多的信息吗?请分享!