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);
    }
}

person Katie    schedule 14.09.2016    source источник
comment
Вы установили -Djava.util.logging.config.file=logging.properties?   -  person Apurva Singh    schedule 15.09.2016


Ответы (1)


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

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

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

Также:

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

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

person markspace    schedule 15.09.2016
comment
Ух ты попал! Мне просто нужно было переместить строку .level вверх! Работает сейчас ты ^-^ - person Katie; 15.09.2016