Улучшение печати деталей в log4j - PullRequest
0 голосов
/ 23 сентября 2019

У меня есть следующий код.Уровень журнала INFO .Как мы можем написать лучший код, что toString не будет выполнен?

Set<Integer> resultUserIdsSet = new HashSet<>();
log.trace("userIdsSet={}", resultUserIdsSet.toString());

Примечание: resultUserIdsSet содержит миллионы целых чисел.

Мы используем ch.qos.logback: logback-classic: jar: 1.2.3

Ответы [ 3 ]

2 голосов
/ 23 сентября 2019

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

log.trace("userIdsSet={}", resultUserIdsSet);

Удаляя .toString(), вы просто передаете ссылку на Set.Если уровень трассировки не активирован, вызов регистратора немедленно возвращается;стоимость по существу незначительна.

Если и только если включен уровень трассировки, то регистратор вызовет toString() в наборе.

1 голос
/ 23 сентября 2019

Что такое "бревно"?Теперь все реализации позволяют передавать поставщика, как это было упомянуто в других ответах.Для этого в SLF4J есть Fixed RFE , но, пожалуйста, укажите, о какой именно библиотеке вы говорите, какая версия и т. Д.

Для более старых версий все ещеможно использовать старую конструкцию, например:

if(log.isTraceEnabled()) {
    log.trace("userIdsSet={}", resultUserIdsSet.toString());
}

Теперь, несмотря на поддержку Supplier, которая действительно может решить проблему, я бы хотел обратить ваше внимание на примечание:

Примечание: resultUserIdsSet содержит миллионы целых чисел.

Это довольно проблематично: если вы поместите такой лог-оператор, вы действительно захотите, чтобы он печатался на уровне трассировки.Когда трассировка отключена (читайте почти всегда) - тогда вы можете избежать дорогостоящего вычисления toString, как было упомянуто в ответах.Однако затем мы включаем трассировку, и она создаст миллион целых чисел в множестве, может произойти много «интересных» вещей:

  • Миллионы целых чисел очень дороги, чтобы напечатать их как на консоли, так и на консоли.файл, его слишком много данных и операции ввода-вывода стоят дорого.
  • Даже если вы напечатаете миллионы целых чисел, будет очень сложно понять что-то из этого журнала.
  • Все будетусугубьте ситуацию, если вы напечатаете это в каком-то внешнем цикле for

Итог, подумайте дважды, действительно ли вы хотите напечатать все эти идентификаторы.Возможно, имеет смысл усечь вывод + предоставить некоторые общие характеристики, такие как количество идентификаторов в наборе и т. Д.

0 голосов
/ 23 сентября 2019

Ленивая загрузка поставщиком:

Set<Integer> resultUserIdsSet = new HashSet<>();
log.trace(() -> "userIdsSet=" + resultUserIdsSet);
...