【问题标题】:Selenium many Logs (How to remove)Selenium 许多日志(如何删除)
【发布时间】:2017-04-16 20:45:53
【问题描述】:

我在 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 吗?

标签: java unit-testing selenium firefox logging


【解决方案1】:

您必须将记录器固定在内存中或设置logging.properties 配置文件。来自java.util.logging.Logger 文档:

Logger 对象可以通过调用 getLogger 工厂方法之一获得。这些将创建一个新的 Logger 或返回一个合适的现有 Logger。请务必注意,如果不保留对 Logger 的强引用,则由 getLogger 工厂方法之一返回的 Logger 可能随时被垃圾回收。

当返回一个新的记录器时,日志级别由 LogManager 确定,默认情况下使用来自logging.properties 文件的设置。在您的示例中,可能会看到以下内容:

  1. 调用 getLogger 创建一个新的记录器并从 LogManager 设置级别。
  2. 您的代码将记录器级别设置为关闭。
  3. G.C.运行并销毁您的记录器以及您刚刚应用的设置。
  4. Selenium 调用 getLogger 并创建一个新的记录器并从 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 应该找到您创建的记录器,该记录器的级别设置为关闭。

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 静态引用是硬引用prevents garbage collection of the logger。如果允许第 3 点发生,就好像您从未将级别设置为 OFF。
猜你喜欢
  • 1970-01-01
  • 2014-01-05
  • 1970-01-01
  • 1970-01-01
  • 2016-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-03
相关资源
最近更新 更多