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

9

我正在使用Java日志记录将应用程序的日志消息写入日志文件和其他目标位置。将日志级别设置为FINE后,我还会收到来自AWT/Swing的(不需要的)消息,例如:

{0}, when grabbed {1}, contains {2}

还有其他的。从JDK源代码(例如,这里)来看,对应的日志记录器名称为sun.awt.X11.grab.XWindowPeer

从Java日志框架中我所理解的是,该日志处理程序应该从其父级继承其日志级别,如sun.awt

我尝试了以下操作:

Logger.getLogger("sun.awt").setLevel(Level.OFF);

但AWT / Swing调试消息仍然出现在日志输出中。

有没有建议的方法可以在编程方式下禁用这些日志消息(同时仍允许来自其他来源的信息)?


请更新你的问题,展示你如何获取日志实例以及你如何调用它。 - Devon_C_Miller
@AndreHolzner 你找到你想要的了吗?能分享一下吗? - undefined
5个回答

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

2

我再 Logger 类中找不到 getRootLogger() 方法了。下面是我的解决方法:

logger = Logger.getLogger("my.package");
Logger l = logger;
while (l != null) {
    l.setLevel(Level.OFF);
    l = l.getParent();
}            
logger.setLevel(Level.FINER);

1
今天我也遇到了同样的问题。在谷歌上搜索,这是顶级网址,但我没有找到一个好的答案来源,所以我将发布我的答案:)
假设Andre使用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 "";
        }
    }

}

1
    Logger.getLogger("java.awt").setLevel(Level.OFF);
    Logger.getLogger("sun.awt").setLevel(Level.OFF);
    Logger.getLogger("javax.swing").setLevel(Level.OFF);

0

尝试使用Logger.getRootLogger().setLevel(Level.OFF);


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接