util.logging.SimpleFormatter.format не работает (Java 8) - PullRequest
0 голосов
/ 03 сентября 2018

Я пытаюсь настроить регистратор для своего приложения. Я хочу сделать это через файл logger.properties, указанный для этого проекта. Я использую следующий код для его настройки:

InputStream loggerProps = getClass().getResourceAsStream("/logger.properties");
LogManager.getLogManager().readConfiguration(loggerProps);

Этот файл содержит следующий текст:

handlers = java.util.logging.FileHandler, java.util.logging.ConsoleHandler
.level = ALL
java.util.logging.SimpleFormatter.format=[%1$tF %1$tT] [%4$-7s] %5$s %n
java.util.logging.ConsoleHandler.level = INFO
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter
#part about FileHandler omitted

И проблема в том, что данный формат вообще не применяется к зарегистрированным сообщениям. Однако, это не только в Java 8 (возможно, более ранние версии также не проверяли это). Когда я пробую вышеупомянутое в Java 9 или 10, это работает просто отлично.

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

Если я вызову следующий метод после установки свойств:

LogManager.getLogManager().getProperty("java.util.logging.SimpleFormatter.format")

возвращает правильную строку формата.

Я пытался поместить строку формата в двойные и одинарные кавычки, но ни одна из них не работает.

Что я делаю не так? В чем проблема? Разве формат не поддерживается в версии Java ниже 9?

Ответы [ 2 ]

0 голосов
/ 04 сентября 2018

Мне удалось решить проблему. Кажется, что проблема была в создании нового ConsoleHandler (что я сделал в другом классе, который был инициализирован перед установкой свойств регистратора). Вот что я имею в виду:

public final class Test {
    public static void main(String[] args) {
        Logger LOGGER = Logger.getLogger(Test.class.getName());
        try {
//            ConsoleHandler handler = new ConsoleHandler();
            InputStream loggerProps = new FileInputStream(new File("logger.properties"));
            LogManager.getLogManager().readConfiguration(loggerProps);
            LOGGER.info("hey");
        } catch (SecurityException | IOException e) {
            e.printStackTrace();
        }
    }
}

Если вы раскомментируете эту закомментированную строку, форматирование регистратора не будет работать. В Java 9 или 10 это работает просто отлично.

0 голосов
/ 03 сентября 2018

Так что я не смог воспроизвести вашу проблему ..

Test.java:

import java.io.IOException;
import java.io.InputStream;
import java.util.logging.LogManager;
import java.util.logging.Logger;

public class Test {
    private static Logger LOGGER;

    public static void main(String[] args) {
        InputStream loggerProps = Test.class.getResourceAsStream("/logger.properties");
        try {
            LogManager.getLogManager().readConfiguration(loggerProps);
            LOGGER= Logger.getLogger(Test.class.getName());
            LOGGER.info("hey");
        } catch (SecurityException | IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

logger.properties:

handlers= java.util.logging.ConsoleHandler.level= INFO
java.util.logging.ConsoleHandler.level = INFO
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter
java.util.logging.SimpleFormatter.format=[%1$tF %1$tT] [%4$7s] %5$s %n

Консоль

[2018-09-03 18:52:26] [   INFO] hey 

Я также проверил, что изменение формата изменяет формат сообщения консоли.

Вы должны убедиться, что: 1. ваш импорт правильный 2. ваш logger.properties находится в исходной папке

Удачи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...