2015-06-11 5 views
1

Я выполняю ведение журнала в своем приложении Java, чтобы я мог отлаживать потенциальные проблемы, которые могут возникнуть после того, как приложение поступит в производство.Производительность Влияние имени класса журнала, имени метода и номера строки

Учитывая, что в таких случаях не было бы роскоши использовать IDE, средства разработки (чтобы запускать вещи в режиме отладки или тщательный код), было бы очень полезно записывать имя класса, имя метода и номер строки с каждым сообщением.

Я искал в Интернете для наилучшей практики для регистрации и я наткнулся на this article, который говорит:

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

log.info(""); 

, потому что программист предположил, что номер строки будет частью Узор каротаж, и он знал, что «Если появляется пустое сообщение каротаж в 67th строка в файле (в методе authenticate()), это означает, что пользователь аутентифицирован ». Кроме того, имя класса журнала, имя метода и/или номер строки имеет серьезное влияние на производительность.

Я пытаюсь понять, как имя класса журнала, имя метода и номер строки ухудшают производительность.

Является ли это выше для всех фреймворков регистрации или только некоторых из них? (Автор делает ссылку на Logback в той же теме). Мне интересно знать о воздействии на производительность, делая что-то подобное в Log4j.

+0

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

ответ

4

Здесь есть разные проблемы. Прежде всего, каково влияние регистрации простой строки. Это во многом зависит от используемой вами инфраструктуры. Недавно я выполнил некоторые тесты, и просто запись строки в файл с использованием стандартного API протоколов Java чрезвычайно дорого. Вы получите лучшие результаты, используя логарифмическую инфраструктуру log4j, которые показывают мои тесты в 15 или 20 раз быстрее.

Теперь рассмотрим проблему с именем файла и номером строки. В отличие от C, java не имеет констант __FILE__ и __LINE__, которые разрешаются компилятором (или препроцессором в случае C). Если вы хотите зарегистрировать имя файла и номер строки, у вас есть два варианта:

  1. Вы фактически записываете такое имя файла и номер строки самостоятельно в качестве констант. Это может быть приемлемо для имени файла, но номер строки изменится, если вы вводите какую-либо строку выше той, где вы регистрируетесь, поэтому вам придется идти и менять все номера строк там. Не совсем разумно
  2. Вы используете java API, чтобы получить трассировку стека, как упомянуто here. Эта операция, хотя и очень дорога во время выполнения, и, следовательно, замедлит вашу программу.