Log4J - это дорогостоящая транзакция? - PullRequest
1 голос
/ 13 октября 2010

Logger

Привет

У меня есть веб-приложения Spring MVC, для которых требуется регистрация на стороне сервера, поэтому я настроил Log4J в Spring MVC

<listener>
 <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
</listener>

В моем контроллере я зарегистрировал все пользовательские транзакции.

@Controller
public class MyController {
 protected final Log logger = LogFactory.getLog(getClass());

 public String setup(){
  MyObject object = new MyObject();

  logger.info("User check in data...." + object.data);
 }
}

У меня есть несколько вопросов:

  1. Является ли регистрация в Spring MVC Webapps дорогостоящей транзакцией? Я имею в виду это замедлит мое приложение?
  2. В производственной среде будет ли нормально, если я пропущу этот logger.info? Мне нужно добавить это для отслеживания каждой транзакции и является требованием но меня беспокоит их влияние.

Спасибо

Ответы [ 2 ]

1 голос
/ 13 октября 2010

Log4j почти не имеет никаких накладных расходов. Он предназначен для компиляции в ваш код и включения или отключения по конфигурации.

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

 if (logger.isInfoEnabled()){  // in case object.data.toString() is costly
    logger.info("User check in data...." + object.data);
 }

Когда он включен, очевидно, что запись сообщения в файл журнала / daemon / database занимает некоторое время. Однако, поскольку вы включили его, вам нужно это сообщение журнала (вы говорите, что у вас есть требование прослеживаемости), поэтому справедливое сравнение будет с созданием сообщения журнала другим способом. И здесь издержки log4j (по сравнению с непосредственным вызовом серверной части журналирования) минимальны.

Таким образом, полная стоимость регистрации сообщения будет зависеть от того, какой бэкэнд вы используете (а не от самого log4j).

0 голосов
/ 13 октября 2010

Прежде чем продолжить, краткий отказ от ответственности: пока у меня нет опыта работы с Spring MVC, однако я использовал log4j с базовыми сервлетами Java, и я считаю, что применяются те же принципы.

На основе предоставленного вами кодаВы можете сделать две вещи, чтобы улучшить скорость регистрации:

  • Объявить logger как статическое:

protected static final Log logger = LogFactory.getLog(MyController.class);

Если несколько экземпляровваш объект создан, это гарантирует, что вы не создаете новый регистратор каждый раз (поскольку создание или получение регистратора - дорогостоящая операция).

  • Защитите оператор if, чтобы проверить, является ли указанный уровеньведение журнала включено, согласно ответу Тило.Вы не только избежите затрат на метод toString() (как он правильно указал), но и избежите ненужной конкатенации строк.

Если вы будете следовать этим рекомендациям, стоимость регистрации при регистрации будетотключенным будет начальная стоимость установки log4j + инициализация регистратора для каждого класса с использованием регистраторов + один оператор if для оценки (и если я правильно помню, в log4j это сводится к накладным расходам вызова функции плюс одно целое числосравнение).

Когда ведение журнала включено, вы должны учитывать любые затраты, внесенные выбранным вами приложением (например, регистрация в базе данных повлечет за собой некоторые накладные расходы), а также время, необходимое для форматированияинформация журнала.Например, при использовании PatternLayout использование шаблонов %F, %M или %L является дорогостоящей операцией, поскольку log4j генерирует эту информацию путем построения полной трассировки стека.

Источник: log4j введение и log4j исходный код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...