Существует ли библиотека Java, поддерживающая интеллектуальное расширение параметров, String.format и многое другое

#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 so obj.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 /