Selenium 许多日志(如何删除)

4
我尝试使用Firefox 48和Selenium 3.0.1进行测试,并已经尝试了以下代码:
java.util.logging.Logger.getLogger("com.gargoylesoftware.htmlunit").setLevel(Level.OFF); java.util.logging.Logger.getLogger("org.apache.commons.httpclient").setLevel(Level.OFF); java.util.logging.Logger.getLogger(ProtocolHandshake.class.getName()).setLevel(Level.OFF);
但是当我在Netbeans下运行常规测试时,日志仍然会输出。
Dec 02, 2016 9:17:53 AM org.openqa.selenium.remote.ProtocolHandshake createSession
INFO: Attempting bi-dialect session, assuming Postel's Law holds true on the remote end
Dec 02, 2016 9:17:57 AM org.openqa.selenium.remote.ProtocolHandshake createSession
INFO: Detected dialect: OSS

有什么线索可以解决这个问题吗?

这是一个问题,为什么? - JeffC
当日志不断出现,而另一个实例正在调用相同的代码时...肯定会占用内存...长期来看,这将导致内存泄漏,不是吗,@JeffC? - gumuruh
1个回答

6
你必须将日志记录器固定在内存中或设置一个logging.properties配置文件。根据java.util.logging.Logger文档,可以通过调用getLogger工厂方法之一来获得Logger对象。这些方法将创建一个新的Logger或返回一个合适的现有Logger。值得注意的是,如果没有对Logger保持强引用,则由getLogger工厂方法返回的Logger可能随时被垃圾回收。
当返回新的logger时,日志级别由LogManager确定,该级别默认使用logging.properties文件中的设置。在你的示例中,你可以看到以下内容:
1. getLogger调用创建一个新的logger并从LogManager设置日志级别。 2. 你的代码将logger级别设置为OFF。 3. 垃圾回收运行并销毁刚刚应用的logger以及其设置。 4. Selenium调用getLogger并创建一个新的logger并从LogManager设置日志级别。
下面是一个示例测试用例来证明这一点:
    public static void main(String[] args) {
        String name = "com.gargoylesoftware.htmlunit";
        for (int i = 0; i < 5; i++) {
            System.out.println(Logger.getLogger(name).getLevel());
            Logger.getLogger(name).setLevel(Level.OFF);
            System.runFinalization();
            System.gc();
            System.runFinalization();
            Thread.yield();
        }
    }

这将输出null而不是OFF

如果通过保持强引用来固定日志记录器,则步骤#3将永远不会发生,Selenium应该找到您创建的具有设置为OFF级别的日志记录器。

private static final Logger[] pin;
static {
    pin = new Logger[]{
        Logger.getLogger("com.gargoylesoftware.htmlunit"),
        Logger.getLogger("org.apache.commons.httpclient"),
        Logger.getLogger("org.openqa.selenium.remote.ProtocolHandshake")
    };

    for (Logger l : pin) {
        l.setLevel(Level.OFF);
    }
}

有什么区别吗?我的意思是,我在上面的代码中也将记录器设置为其“关闭”级别....?@jmehreris,我刚看到静态变量不同了。 - gumuruh
@gumuruh 静态引用是一种硬引用,可以防止记录器被垃圾回收(https://docs.oracle.com/javase/8/docs/api/java/lang/ref/WeakReference.html)。如果允许发生第3点,则就好像您从未将级别设置为OFF。 - jmehrens

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