Java Logger: невозможно установить уровень журнала в файле logger.properties

У меня есть проект Java, который я использую Maven для сборки. я использую java.util.logging.Logger в моем проекте и хотел бы настроить его с помощью logger.properties файл (не командная строка).

Я создал logger.properties файл как это:

handlers=java.util.logging.FileHandler, java.util.logging.ConsoleHandler
.level=WARNING

java.util.logging.SimpleFormatter.format=[%4$s] %5$s %n

java.util.logging.config.file="../../results/api.log"

Вот проблемы, которые у меня возникают:

  1. java.util.logging.SimpleFormatter.format РАБОТАЕТ. Когда я меняю формат здесь, я сразу вижу изменение в моем проекте. Итак, я знаю, что, по крайней мере, я правильно импортирую файл.
  2. .level не работает. Я пытался изменить его на info, finest, warning и т. д., но после изменения я все еще вижу все сообщения INFO, даже если я сказал, что не показывать INFO.
  3. java.util.logging.config.file не работает. Я вроде ожидал, что этот не сработает, потому что это относительный путь. Кто-нибудь знает, как я могу разрешить относительный путь в файле свойств?

Решение

Мне нужно было переместить .level наверх, вот так:

logger.properties

.level=WARNING

handlers=java.util.logging.FileHandler, java.util.logging.ConsoleHandler

java.util.logging.SimpleFormatter.format=[%4$s] %5$s %n

Затем, чтобы сохранить результаты в "api.log", я сделал это в своем коде:

RequestHelper.java

import org.apache.commons.io.FilenameUtils;

public class RequestHelper {

    private static final Logger LOGGER = Logger.getLogger( RequestHelper.class.getName() );

    protected RequestHelper() {
        //SET LOGGER TO OUTPUT TO "../../results/api.log"
        //Logs will ALSO output to console.
        String result_file = getNormalizedAbsolutePath("../../results/api.log");
        Handler fh = new FileHandler(result_file);
        Logger.getLogger("").addHandler(fh);
    }

    public static String getNormalizedAbsolutePath(String fileName) {
        String path;
        File file = new File(fileName);
        try {
            path = file.getCanonicalPath();
        } catch (IOException e) {
            LOGGER.warning("Error while computing the canonical path of file: " + fileName);
            path = file.getAbsolutePath();
        }
        return FilenameUtils.normalize(path);
    }
}

1 ответ

Решение

Просто предположение. Из документации:

Предполагается, что все свойства, имена которых заканчиваются на ".level", определяют уровни журналов для регистраторов. Таким образом, "foo.level" определяет уровень журнала для регистратора, называемого "foo" и (рекурсивно) для любого из его дочерних элементов в иерархии имен. Уровни журнала применяются в том порядке, в котором они определены в файле свойств. Таким образом, настройки уровня для дочерних узлов в дереве должны следовать после настроек для их родителей.

Попробуйте установить .level Прежде чем определить какой-либо из обработчиков. Если вы сначала зададите уровень корневого логгера, то определенные впоследствии логгеры унаследуют уровень корневого логгера.

Также:

Свойство "конфиг". Это свойство предназначено для запуска произвольного кода конфигурации.

java.util.logging.config.file является системным свойством, и не будет работать в файле конфигурации. Попробуйте просто использовать "config".

Другие вопросы по тегам