2016-08-23 27 views
2

如果我運行下面的代碼Log4j2造成PreferIP6失敗

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?

回答

1

您是否曾嘗試將靜態初始化程序塊添加到主靜態記錄器字段初始化之前設置屬性的主類?

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

好主意,我應該考慮一下吧! – xav

+0

這工作! Andy想法爲什麼在初始化log4j之前需要設置System屬性? – rickmaster

+0

我的猜測是,log4j在初始化過程中查找本地主機名,並且除非另外指定,否則將使用ip v4。 –

0

您是否試圖避免在包含您的main()的類中聲明Log4j記錄器?如果你聲明一個靜態記錄器作爲這個主類的屬性,Log4j將在你的第一個main()指令之前被初始化。

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

注意:如果你想設置java.net.preferIPv6Addresses使用java -jar在命令行啓動您的應用程序時,你可以這樣做使用:

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

(它沒有在你的身邊,也許是因爲你有工作在-jar之後放-D?)

+0

感謝您的回覆。在命令行中使用-D arg的作品,但正如我所說的應用程序是一個可運行的JAR文件,因此我不能使用命令行參數,除非我做一個.bat文件。此外,我們希望在建立網絡連接之前和之後記錄參數和錯誤。該網絡連接必須是IPv6連接,當我聲明Log4j記錄器時,該應用程序僅使用IPv4。 – rickmaster