Log4j Неявное форматирование строк

Я использую log4j v1.2.14 для входа в мой проект, и я также использую Java 7 String.format() для размещения переменных в моем выпуске. В настоящее время я пишу

LOGGER.info(String.format("Your var is [%s] and you are [%s]", myVar, myVar1));

Это действительно лучший способ вывода строк? Я чувствую, что log4j должен иметь это реализовано неявно, как log4j ниже:

LOGGER.info("Your var is [%s] and you are [%s]", myVar, myVar1);

Я что-то пропустил? Кроме того, существуют ли какие-либо фреймворки Java, поддерживающие это?

Ответ 1

slf4j api обеспечивает " параметризованное ведение журнала ", что позволяет делать именно это, хотя и с немного отличающимся синтаксисом. Пример:

logger.debug("Value {} was inserted between {} and {}.", newVal, below, above);

Для реализации вы можете использовать Logback, который реализует slf4j изначально, или связки slf4j для соединения с log4j или другими регистраторами. Руководство пользователя объясняет это, а также короткий пример.

Ответ 2

Использование String.format, + или форматера строк, отличного от того, который предоставляется вашей системой регистрации (например, log4j), считается плохой практикой. Обычно в коде есть много журналов низкого уровня (отладка, информация), которые вы не хотите видеть в работе. Если вы используете, например, String.format для форматирования строки для регистрации, вы String.format и отформатируете новую строку, которая может быть очень длинной и потреблять ресурсы, даже если в конце ничего не будет зарегистрировано (например, если уровень log4j min) установлен на предупреждение или ошибку). Используя систему форматирования регистратора (например, систему из log4j), вы позволяете вашему регистратору избегать генерации форматированной строки, если ее не нужно регистрировать.

Это может иметь большое значение в некоторых случаях.

Ответ 3

Btw. В этом сценарии нет большой разницы между использованием + для добавления переменных в строку и String.format - если вы действительно не хотите повторно использовать "Ваш var is..." во всех ваших журналах.

slf4j позволяет вам регистрироваться как

log.info("Your var is {} and you are {}", myVar, myVar1);

Обратите внимание на использование {} вместо печатающих форматировщиков. Также для этого требуется Java> = 1.5

Ответ 4

Log4j поддерживает внутреннее форматирование. Я не нашел его нигде, но я видел пример здесь:

https://logging.apache.org/log4j/2.x/manual/markers.html

Я попробовал это, и это работает! Я нахожусь на log4j 2.11.2.

int i = 42;
String str1 = "the answer";
String str2 = "life, the universe, and everything";
console.info("{} is {} to {}", i, str1, str2);

Глядя на javadoc для Logger, я бы сказал, что он был представлен в Lo4j 2 и поддерживает до 10 параметров.

https://logging.apache.org/log4j/2.x/log4j-api/apidocs/org/apache/logging/log4j/Logger.html