使用LogManager.getLogger和getContext()

时间:2017-09-15 09:31:53

标签: java logging log4j

我遇到了一个奇怪的情况,类似地在LogManager.getLogger stalls Application for ~10-30 Seconds when using JDK8:中描述过,但没有提出解决方案。

事情是通过

初始化记录器
final Logger logger = LogManager.getLogger(MyClass.class.getSimpleName());

将我的应用程序拖延了近7秒(在最新的MacBook Pro 15“2017上)如果要么禁用WiFi,要么我通过我的iPhone进行连接。 但是,如果我通过WiFi(没有网络共享)有一个可用的Internet连接,则log4j初始化可在1.5秒内完成。 这是一种非常奇怪的行为。首先,我认为log4j尝试访问Internet上的资源并在几秒钟后超时,但是又一次:为什么当我进行网络共享并因此可以访问Internet时出现相同的行为?

进一步调试时,我发现这种方法花了这么长时间:

public static LoggerContext getContext(final boolean currentContext) {
    // TODO: would it be a terrible idea to try and find the caller ClassLoader here?
    try {
        return factory.getContext(FQCN, null, null, currentContext, null, null);
    } catch (final IllegalStateException ex) {
        LOGGER.warn(ex.getMessage() + " Using SimpleLogger");
        return new SimpleLoggerContextFactory().getContext(FQCN, null, null, currentContext, null, null);
    }
}

特别是:

factory.getContext(FQCN, null, null, currentContext, null, null);

有没有人知道为什么会发生这种情况以及如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

当我将程序从PC转移到带有JDK版本1.8.0_144或1.8.0_102的MBP时,我遇到了同样的问题。 我认为这是JDK for Mac的一个错误。

U可以解决它,使用JDK版本1.8.0_31。