2015-12-08 2 views
0

Мое приложение использует System.setErr(), чтобы изменить stderr на поток, который в конечном итоге будет закрыт. Сразу после его закрытия я снова снова использую System.setErr(), чтобы изменить stderr на рабочий поток, который отлично подходит, когда мой код делает что-то вроде System.err.println(), но регистрация с java.util.logging на консоль (то есть до stderr) больше не работает.System.setErr() не восстанавливает ведение журнала консоли после закрытия stderr

ответ

0

Чтобы решить эту проблему, я должен был re-read the logging configuration file, а затем положить обратно в console logging handler себе:

import java.util.logging.ConsoleHandler; 
import java.util.logging.Loggger; 
import java.util.logging.LogManager; 

... 

System.setErr(otherStream); 

try { 
    LogManager.getLogManager().readConfiguration(); 
} 
catch(java.io.IOException e) { 
    // ... 
} 

Logger.getGlobal().addHandler(new ConsoleHandler()); 
0

ConsoleHandler фиксирует ссылку на System.err во время строительства. Другое решение - заменить все ConsoleHandler в дереве журналов.

LogManager m = LogManager.getLogManager(); 
    synchronized (m) { 
     Enumeration<String> names = m.getLoggerNames(); 
     while (names.hasMoreElements()) { 
      Logger logger = m.getLogger(names.nextElement()); 
      if (logger != null) { 
       for (Handler h : logger.getHandlers()) { 
        if (h.getClass() == ConsoleHandler.class) { 
         logger.removeHandler(h); 
         h.close(); 
         logger.addHandler(new ConsoleHandler()); 
        } 
       } 
      } 
     } 
    } 
Смежные вопросы