我直接从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!这是我的证明(请查看底部):
我已尽力在我的计算机上搜索日志文件,看看Level.FINE和Level.FINER是否最终在文件系统的某处。但是,我无法在任何地方找到日志消息。
为什么Level.FINE
和Level.FINER
的日志记录在提供的示例中不起作用?
我在静态初始化块中设置了日志记录级别,但我确定要将此设置外部化为某种配置文件,可能与我在GlassFish上部署的EAR文件一起打包。或者为什么不手动写入我们从服务器下载的JNLP文件中的某些属性。这有可能吗?
答案 0 :(得分:0)
在对该主题进行了一些阅读之后,我得出结论,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);
}
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文件捆绑在一起或类似的东西。你有更多的信息吗?请分享!