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"
Вот проблемы, которые у меня возникают:
java.util.logging.SimpleFormatter.format
РАБОТАЕТ. Когда я меняю формат здесь, я сразу вижу изменение в моем проекте. Итак, я знаю, что, по крайней мере, я правильно импортирую файл..level
не работает. Я пытался изменить его наinfo
,finest
,warning
и т. д., но после изменения я все еще вижу все сообщения INFO, даже если я сказал, что не показывать INFO.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".