toString в logback - PullRequest
       11

toString в logback

0 голосов
/ 03 мая 2018

Я использую logback в нашем проекте. Я прошел через ссылки для входа в фигурные скобки.

logger.debug(" My class output value - {}, object toString() {}", object.value(), object.toString());

Отладка не включена в моем проекте. Мы увидели, что toString () вызывается в нашем проекте, что влияет на нашу производительность. Будет ли вызываться toString () во время выполнения кода с отключенной отладкой?

Могу ли я использовать toString () с этим подходом? Потому что согласно фигурным скобкам определение строки concat не произойдет. Это будет только для строки concat или это применимо и для вызовов методов?

Ответы [ 2 ]

0 голосов
/ 03 мая 2018

Logback не меняет правила Java: когда вы вызываете метод, аргументы метода должны быть оценены для передачи в метод. Все, что вы сохраняете, используя фигурные скобки, когда уровень журнала не включен, это стоимость конкатенации String , то есть стоимость создания полной String, которую нужно зарегистрировать из отдельного человека. компоненты.

Если стоимость оценки аргументов заметно снижает вашу производительность до такой степени, что она больше не отвечает потребностям ваших клиентов, то вы, вероятно, захотите избежать затрат на ее запуск, если уровень журнала не включен. Из Руководства по возврату, Глава 2: Архитектура, « Параметрированное ведение журнала »:

Один из возможных способов избежать затрат на создание параметров - это окружить оператор log тестом. Вот пример.

if(logger.isDebugEnabled()) { 
   logger.debug("Entry number: " + i + " is " + String.valueOf(entry[i]));
}

Таким образом, вы не будете нести расходы на создание параметров, если отладка отключена для logger. С другой стороны, если регистратор включен для уровня DEBUG, вы понесете затраты на оценку того, включен регистратор или нет, дважды: один раз в debugEnabled и один раз в debug. На практике эти издержки незначительны, потому что оценка логгера занимает менее 1% времени, необходимого для регистрации запроса.

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

0 голосов
/ 03 мая 2018

Из документации LogBack:

Better alternative

There exists a convenient alternative based on message formats. Assuming entry is an object, you can write:

Object entry = new SomeObject(); 
logger.debug("The entry is {}.", entry);

Only after evaluating whether to log or not, and only if the decision is positive, will the logger implementation format the message and replace the '{}' pair with the string value of entry. In other words, this form does not incur the cost of parameter construction when the log statement is disabled.

Таким образом, передавая только объект, не вызывая toString (), вы сохраните накладные расходы toString ().

...