2016-10-10 3 views
0

Пытается использовать java.util.logging и не удается.Java - настройка пользовательских регистраторов для использования

В попытке сделать использование https://stackoverflow.com/a/8249319/3322533:

handlers = mypackage.logging.RequestFileHandler, mypackage.logging.MainFileHandler 
config = 

mainLogger.handlers  = mypackage.logging.MainFileHandler 

requestLogger.handlers = mypackage.logging.RequestFileHandler 

java.util.logging.ConsoleHandler.level  = INFO 
java.util.logging.ConsoleHandler.filter = 
java.util.logging.ConsoleHandler.formatter = mypackage.logging.VerySimpleFormatter 
java.util.logging.ConsoleHandler.encoding = 

mypackage.RequestFileHandler.level  = SEVERE 
mypackage.RequestFileHandler.filter = 
mypackage.RequestFileHandler.formatter = mypackage.logging.VerySimpleFormatter 
mypackage.RequestFileHandler.encoding = 
mypackage.RequestFileHandler.limit  = 
mypackage.RequestFileHandler.count  = 
mypackage.RequestFileHandler.append = false 
mypackage.RequestFileHandler.pattern = REQUESTS.%u.%g.log 

mypackage.MainFileHandler.level  = INFO 
mypackage.MainFileHandler.filter = 
mypackage.MainFileHandler.formatter = mypackage.logging.VerySimpleFormatter 
mypackage.MainFileHandler.encoding = 
mypackage.MainFileHandler.limit  = 
mypackage.MainFileHandler.count  = 
mypackage.MainFileHandler.append = false 
mypackage.MainFileHandler.pattern = MAIN.%u.%g.log 

где

public class MainFileHandler extends FileHandler { 
    public MainFileHandler() throws IOException, SecurityException { 
     super(); 
    } 
} 

и

public class RequestFileHandler extends FileHandler { 
    public RequestFileHandler() throws IOException, SecurityException { 
     super(); 
    } 
} 

Намерение: обеспечить два регистраторы, доступные через

Logger.getLogger("mainLogger"); 

или

Logger.getLogger("requestLogger"); 

соответственно, один, который будет писать (исключительно) к MAIN[...].log, а другой REQUESTS[...].log

(Нет ограничений на количество сообщений, которые могут быть зарегистрированы в любой файл и при необходимости использовать уровень протоколирования, чтобы отфильтровать нежелательные сбщ либо.)

Однако ни файл создается, когда я (к примеру)

public static final Logger log = Logger.getLogger("mainLogger"); 

, а затем

public void configureLogger(){ 
    try { 
     ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); 
     InputStream config = classLoader.getResourceAsStream("logging.properties"); 

     LogManager.getLogManager().readConfiguration(config); 

    }catch(Exception ex){ 
     throw new RuntimeException("logging properties failed"); 
    } 
} 

, прежде чем я

log.info("Hello World!") 

Я знаю, свойства загружаются, потому что, когда я включаю java.util.logging.ConsoleHandler в handlers = ... списке и использовать глобальный регистратор, вместо этого, форматировщик применяется для консольный выход.

Итак ... Я думаю, что моя попытка настроить регистраторы файлов является неисправной. Как мне это сделать?

EDIT

Так что я удалил [...].pattern = [...] линии и вместо того, чтобы жёстко имена файлов:

public class MainFileHandler extends FileHandler implements FileHandlerProperties { 
    public MainFileHandler() throws IOException, SecurityException { 
     super("MAIN_" + new SimpleDateFormat(TIME_PATTERN).format(new Date()) + ".log"); 
    } 
} 

и

public class RequestFileHandler extends FileHandler implements FileHandlerProperties { 
    public RequestFileHandler() throws IOException, SecurityException { 
     super("REQUESTS_" + new SimpleDateFormat(TIME_PATTERN).format(new Date()) + ".log"); 
    } 
} 

где

public interface FileHandlerProperties { 
    static final String TIME_PATTERN = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"; 
} 

Оба файла теперь получить создан, но они и содержат точно так же (несмотря на их различные настройки уровня и регистраторы) И то, что они содержат в XML:

<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
<!DOCTYPE log SYSTEM "logger.dtd"> 
<log> 
<record> 
    <date>2016-10-10T18:49:23</date> 
    <millis>1476118163654</millis> 
    <sequence>0</sequence> 
    <logger>mainLogger</logger> 
    <level>INFO</level> 
    <class>mypackage.main.Main</class> 
    <method>&lt;init&gt;</method> 
    <thread>1</thread> 
    <message>Hello World</message> 
</record> 
</log> 

Пожалуйста, помогите ...

+0

Удалить символы '' 'из вашего файла свойств. – VGR

+0

@VGR Убрано' '' '', похоже, не имеет никакого значения. – User1291

ответ

1

проблема в том, что первый вызов Logger.getLogger во время загрузки класса считывает конфигурацию журнала, и ваш метод configureLogger не работает из-за JDK-8033661: readConfiguration does not cleanly reinitialize the logging system.

Чтобы обойти это, вы должны убедиться, что configureLogger работает до первого звонка до Logger.getLogger.

public class BootMain { 

    static { 
     configureLogger(); 
     mainLogger = Logger.getLogger("mainLogger"); 
     requestLogger = Logger.getLogger("requestLogger"); 
    } 

    private static final Logger mainLogger; 

    private static final Logger requestLogger; 

    public static void main(String[] args) throws IOException { 
     mainLogger.log(Level.SEVERE, "Test from main."); 
     requestLogger.log(Level.SEVERE, "Test from request."); 
     System.out.println(new File(".").getCanonicalPath()); 
    } 

    private static void configureLogger() { 
     try { 
      InputStream config = config(); 
      LogManager.getLogManager().readConfiguration(config); 
     } catch (Exception ex) { 
      throw new RuntimeException("logging properties failed"); 
     } 
    } 

    private static String prefix() { 
     return "mypackage.logging"; 
    } 

    private static InputStream config() throws IOException { 
     String p = prefix(); 
     Properties props = new Properties(); 
     props.put("mainLogger.handlers", p + ".MainFileHandler"); 
     props.put("requestLogger.handlers", p + ".RequestFileHandler"); 
     props.put(p + ".RequestFileHandler.level", "SEVERE"); 
     props.put(p + ".MainFileHandler.level", "INFO"); 
     props.put(p + ".RequestFileHandler.pattern", "REQUESTS.%u.%g.log"); 
     props.put(p + ".MainFileHandler.pattern", "MAIN.%u.%g.log"); 
     ByteArrayOutputStream out = new ByteArrayOutputStream(); 
     props.store(out, ""); 
     return new ByteArrayInputStream(out.toByteArray()); 
    } 
} 

Кроме того, убедитесь что вы не используете действительно старую версию JDK или вы можете запустить в JDK-5089480: java.util.logging.FileHandler uses hardcoded classname when reading properties.

В противном случае вы можете использовать LogManager config option to manually setup your configuration.

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