禁用awt / swing调试(精细)日志消息

时间:2011-05-17 10:24:58

标签: java swing logging awt

我正在使用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条消息)?

5 个答案:

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