Log4j2 导致 PreferIP6 失败

Log4j2 causing PreferIP6 to fail

如果我运行下面的代码

public class NetworkTester {
public static void main( String[] args ) {
    System.setProperty( "java.net.preferIPv6Addresses", "true" );
    System.setProperty( "java.net.preferIPv4Stack", "false" );
    try {
        InetAddress addr = InetAddress.getByName( "www.google.com" );
        System.out.println( addr );
            if ( addr instanceof Inet4Address ) {
                System.out.println( 4 );
            }
            if ( addr instanceof Inet6Address ) {
                System.out.println( 6 );
            }
    } catch ( UnknownHostException e ) {
        e.printStackTrace();
    }
}}

我得到以下输出

www.google.com/2607:f8b0:4009:801:0:0:0:2004
6

但是如果我添加行

private static Logger log4j = LogManager.getLogger();

我导入以下内容

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

我明白了

www.google.com/4.59.40.94
4

我正在使用 log4j2 2.6.2 和 jdk1.8。0_51。如果我使用 -Djava.net.preferIPv6Addresses=true 作为 vm 参数,我会得到一个 IPv6 地址。但是我正在开发的应用程序是 运行 作为一个可执行 jar 文件,我无法找到一种方法将可执行 jar 获取到 运行 vm 参数而不编写一些 bat 文件或脚本种类。 我怎样才能让我的应用程序更喜欢 ipv6 和 运行 log4j?

您是否尝试过避免在包含您的 main() 的 class 中声明您的 Log4j 记录器?如果您将静态记录器声明为该主 class 的属性,Log4j 将在您的第一条 main() 指令之前初始化。

但是,我很想知道 Log4j 如何阻止您使用 IPv6。

注意:如果您想在命令行中使用java -jar启动您的应用程序时设置java.net.preferIPv6Addresses,您可以使用:[=17] =]

java -Djava.net.preferIPv6Addresses=true -jar myapp.jar

(你这边没用,可能是因为你把 -D 放在了 -jar 之后?)

您是否尝试过在初始化静态 Logger 字段之前将静态初始化程序块添加到设置 属性 的主要 class?

static {
    System.setProperty("java.net.preferIPv6Addresses", "true");
}