2016-08-23 5 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

Вы пытались добавить статический блок инициализатора к основному классу, который устанавливает свойство до того, как инициализируется статическое поле Logger?

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

Хорошая идея, я должен был подумать об этом! – xav

+0

Это сработало! Энди подумает, почему свойство System необходимо установить перед инициализацией log4j? – rickmaster

+0

Я предполагаю, что log4j ищет имя локального хоста во время инициализации, и это, в свою очередь, использует ip v4, если не указано иное. –

0

Вы пытались избежать объявления вашего Log4j Logger в классе, который содержит ваш main()? Если вы объявляете статический регистратор как атрибут этого основного класса, Log4j будет инициализирован до вашей первой команды main().

Тем не менее, мне было бы интересно узнать, как Log4j предотвращает использование IPv6.

Примечание: если вы хотите установить java.net.preferIPv6Addresses при запуске приложения в командной строке с помощью java -jar, вы можете сделать это с помощью:

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

(он не работает на вашей стороне, может быть, потому что у вас есть положить -D после -jar?)

+0

Благодарим за ответ. Использование -D в командной строке arg работает, но, как я сказал, приложение предназначено для запуска JAR-файла, поэтому я не могу использовать аргументы командной строки, если я не создаю файл .bat. Кроме того, мы хотим регистрировать параметры и ошибки как до, так и после того, как мы создадим сетевое соединение. Это сетевое соединение должно быть соединением IPv6, и в тот момент, когда я объявляю log4j logger, приложение использует только IPv4. – rickmaster

Смежные вопросы