Log4j2导致PreferIP6失败

时间:2016-08-23 19:01:49

标签: java logging java-8 log4j2 system-properties

如果我运行以下代码

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?

2 个答案:

答案 0 :(得分:1)

您是否尝试将静态初始化程序块添加到主类中,该类在初始化静态Logger字段之前设置属性?

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

答案 1 :(得分:0)

您是否曾尝试避免在包含main()的班级中声明Log4j Logger?如果您将静态Logger声明为此主类的属性,则Log4j将在您的第一个main()指令之前初始化。

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

注意:如果您想在使用java.net.preferIPv6Addresses的命令行启动应用时设置java -jar,可以使用以下命令设置{<1}}

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

(它没有在你身边工作,可能是因为你在-D之后放了-jar?)