我正在使用java日志记录将我的应用程序的日志消息写入日志文件和其他目标。将日志级别设置为FINE
后,我还会收到来自AWT / Swing的(不需要的)消息,例如:
{0}, when grabbed {1}, contains {2}
和其他人。查看JDK源代码(参见例如here),可以看到相应记录器的名称为sun.awt.X11.grab.XWindowPeer
。
我从Java日志记录框架中理解的是,此日志记录处理程序应该从其父项sun.awt
继承其日志级别。
我尝试了以下内容:
Logger.getLogger("sun.awt").setLevel(Level.OFF);
但是AWT / Swing调试消息仍然出现在日志输出中。
以编程方式禁用这些日志消息的推荐方法是什么(同时仍允许来自其他来源的FINE
条消息)?
答案 0 :(得分:5)
如果您只想记录自己应用程序的消息,则可以禁用所有消息,然后为您的应用程序显式启用消息:
Logger.getRootLogger().setLevel(Level.OFF);
Logger.getLogger("package.of.your.application").setLevel(Level.ALL);
在用于记录的属性文件(例如logging.properties)中,这将是:
.level = OFF
package.of.your.application.level = ALL
答案 1 :(得分:1)
我今天遇到了同样的问题。在谷歌搜索这是最高的网址,我找不到一个好的答案来源,所以我会发布我的:)
假设安德烈使用java.util.logging
API,可以使用Handler
添加一个setFormatter(Formatter newFormatter)
来控制日志格式。
所以我扩展了Formatter
并检查了日志的类是否包含java.awt,javax.swing或sun.awt。
class MyFormatLog extends Formatter {
@Override
public String format(LogRecord record) {
if( !record.getSourceClassName().contains("java.awt") &&
!record.getSourceClassName().contains("javax.swing.") &&
!record.getSourceClassName().contains("sun.awt.") ) {
//format my output...
} else {
return "";
}
}
}
答案 2 :(得分:1)
我再也找不到Logger类中的getRootLogger()方法了。这对我有用:
logger = Logger.getLogger("my.package");
Logger l = logger;
while (l != null) {
l.setLevel(Level.OFF);
l = l.getParent();
}
logger.setLevel(Level.FINER);
答案 3 :(得分:1)
Logger.getLogger("java.awt").setLevel(Level.OFF);
Logger.getLogger("sun.awt").setLevel(Level.OFF);
Logger.getLogger("javax.swing").setLevel(Level.OFF);
答案 4 :(得分:0)
尝试 。Logger.getRootLogger()setLevel(Level.OFF);