использование регистратора, лучше ли параметризация или использование + для добавления аргументов?

Что из следующего является лучшим использованием регистратора?

  1. Параметризовать (log4j 2)

    logger.info("User {} has logged in using id {}", map.get("Name"), user.getId());`
    
  2. Использование оператора + (log4j)

    logger.info("User"+ map.get("Name") +" has logged in using id " +user.getId());`
    

И почему?


person nandini    schedule 29.04.2016    source источник
comment
Почему это? Я хочу знать, что происходит, когда мы параметризуем. Кажется, я не могу найти код для параметризации. Кроме того, если для log4j logger.info разрешает только объект и бросок. не несколько аргументов.   -  person nandini    schedule 29.04.2016
comment
Ну, вместо того, чтобы использовать древнюю структуру ведения журнала, такую ​​​​как log4j, используйте лучшую (или, что предпочтительнее, фасад ведения журнала, такой как SLF4J).   -  person Kayaman    schedule 29.04.2016
comment
Ага.. Я редактировал чужой код. У них уже был log4j. Я изменю это. Спасибо. Я знал, что параметризация лучше, но не знал причины. Ваш ответ объясняет это. Спасибо @kayaman :)   -  person nandini    schedule 29.04.2016


Ответы (2)


Даже если бы не было ничего другого, дополнительные махинации с StringBuilder, которые происходят при использовании +, сделали бы используя параметры очевидный выбор.

Не говоря уже о том, что при объединении значений будет вызываться метод toString() всех параметров, даже если уровень ведения журнала не включен, а это означает, что вы тратите ЦП на создание строки, которая никогда не будет регистрироваться. Это будет иметь (хотя и незначительный) эффект, если будет много операторов debug(), когда уровень DEBUG обычно отключен в производственных средах.

Этот ответ основан на современных платформах ведения журналов, а не на устаревших, таких как Log4J.

person Kayaman    schedule 29.04.2016

параметризованные сообщения не форматируют текст до тех пор, пока Log4j не убедится, что сообщение будет зарегистрировано. Это позволяет вам не окружать вызов logger.debug(...) проверками, такими как if (logger.isDebugEnabled())..., что дает более чистый код.

Этот ответ основан на современных платформах ведения журналов, а не на устаревших, таких как Log4J.

Когда вы говорите «устаревший», вы, должно быть, имеете в виду Log4j 1.x. По состоянию на 2014 год Log4j 2 является передовой системой ведения журналов с открытым исходным кодом. Он использует некоторые идеи из SLF4J, такие как параметризованные сообщения журнала, но добавляет систему плагинов, чтобы вы могли легко добавлять пользовательские приложения, пользовательские макеты и пользовательский поиск. Кроме того, Log4j 2 поддерживает настраиваемые уровни журналов, лямбда-выражения и не блокирующий и очень производительный Асинхронные регистраторы. Чтобы оживить ситуацию, начиная с версии 2.6 Log4j 2 не содержит мусора.

Каяман, вероятно, имеет в виду Log4j 1, который с августа 2015 года был End of Life.

person Remko Popma    schedule 29.04.2016