#java #logging
#java #ведение журнала
Вопрос:
Вот что я ищу:
- Java
- Библиотека журналов, которая может заменить ведение журнала commons или slf4j
- Расширение параметров только тогда, когда этого требует уровень журнала (т. Е. Без
if (log.isDebugEnabled())
блоков) - Форматирование строки такое же, как
java.lang.String.format
- Обнаружение java.lang.Выбрасывается в качестве конечного параметра и трассировки стека журналов
Цель состоит в том, чтобы написать такой код
private static final Log log = new Log.getLog(MyClass.class);
// ...
String value = "test";
log.debug("The value is [%s]", value); // [1]
// ...
} catch (Exception e) {
log.error("Caught Exception: %s", e.getMessage(), e); // [2]
}
[1] напечатал бы оператор журнала, например
The value is [test]
Если бы уровень журнала был INFO
, операция форматирования строки не выполнялась бы.
[2] будет печатать
Caught Exception: [value of e.getMessage()]
java.lang.Exception
at com.my.org.MyClass.myMethod(MyClass.[line number])
at [...]
Мне это кажется довольно разумным поведением. Я удивлен, что не могу легко найти библиотеку, которая делает это.
РЕДАКТИРОВАТЬ: я должен был указать, но slf4j не соответствует всем этим требованиям.
Комментарии:
1. AFAIK, расширение или оценка параметров при использовании в Java невозможны. Любой аргумент выражения (например
obj.toString()
), переданный методу, должен быть предварительно оценен заранее. Многие фреймворки (в частности, sl4j) обеспечивают аккуратный трюк, принимаяObject
вместоString
soobj.toString()
, выполняется только тогда, когда это требуется. В остальном, не повезло. 🙂
Ответ №1:
Java
SLF4J с привязкой обратного входа.
Библиотека журналов, которая может заменить ведение журнала commons или slf4j
Единственными хорошо зарекомендовавшими себя альтернативами являются Log4J и java.util.logging
…
Расширение параметров только тогда, когда этого требует уровень журнала (т. Е. Нет блоков if (log.isDebugEnabled()))
В SLF4J, если вы введете:
log.debug("Names are: {}", namesCollection);
Тогда дорогостоящий toString()
будет выполняться только в том случае, если isDebugEnabled()
возвращает true (нет необходимости указывать его явно).
Форматирование строки такое же, как java.lang.String.format
Вам действительно нужно необычное форматирование (десятичные дроби, валюты, локали) в файлах журналов? Или достаточно {}
ленивого расширения (см. Выше)?
Обнаружение java.lang.Выбрасывается в качестве конечного параметра и трассировки стека журналов
SLF4J работает таким образом с версии 1.6.
Комментарии:
1. Спасибо за ответ, но в настоящее время я использую slf4j. Он не соответствует всем моим требованиям (а именно форматированию String.format).
2. @three_cups_of_java, что
%d
%f
дает вам,%s
что{}
не дает? Единственное, что я могу придумать, это если вы хотите сделать что-то вроде%2.2f . Но, честно говоря, ваши журналы должны быть отформатированы как бизнес-отчет, вам понадобится необработанный вывод.3. @TimBender, действительно ли имеет значение, что он покупает для меня? Вопрос задавал библиотеку ведения журнала, которая расширяла параметры так же, как
String.format
.4. @three_cups_of_java, если у вас нет рациональной причины для вашего требования, возможно, вы захотите пересмотреть это требование. В любом случае, Mac дал ответ, который соответствует вашим требованиям.
5. @TimBender, я только хотел сказать, что вы, похоже, говорили, что ответа, который не соответствует моим требованиям, должно быть достаточно, потому что вы не могли придумать причину, по которой мои требования / вопрос действительны. В целом я согласен с тем, что предложения slf4j действительно близки и соответствуют требованиям большинства проектов к ведению журнала. К сожалению, я не всегда контролирую все свои условия / требования, поэтому я не могу действительно защитить свою потребность в этом, кроме как сказать, что это требование.
Ответ №2:
В JBoss есть реализация ведения журнала, которая выполняет форматирование в стиле printf и MessageFormat. Предположительно, его можно использовать самостоятельно, но я не могу найти для него проект, кроме его интеграции с Seam Solder. Однако существуют отдельные артефакты: https://repository.jboss.org/nexus/content/groups/public/org/jboss/logging/jboss-logging /