Вы должны войти из кода библиотеки?

38

Если я разрабатываю библиотеку Java, будет ли хорошей практикой выдавать операторы журнала из кода библиотеки?

Регистрация в библиотеке сделает отладку и устранение неполадок более прозрачной. Однако, с другой стороны, мне не нравится засорять мой библиотечный код инструкциями журналирования. Есть ли какие-либо последствия для производительности, которые следует учитывать?

датский
источник

Ответы:

33

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

Авторы широко распространенных компонентов и библиотек могут кодировать интерфейс SLF4J, чтобы не навязывать структуру ведения журнала конечному пользователю компонента или библиотеки. Таким образом, конечный пользователь может выбрать желаемую структуру ведения журналов во время развертывания, вставив соответствующую привязку slf4j в путь к классу, которая может быть изменена позже путем замены существующей привязки другой на пути к классам и перезапуска приложения. Этот подход оказался простым и очень надежным.

Кроме того, если ваши пользователи не включают банку SLF4J (из руководства пользователя ):

Начиная с SLF4J версии 1.6.0, если на пути к классам привязка не найдена, то по умолчанию slf4j-api будет использовать реализацию без операций, отбрасывая все запросы журнала.

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

Следующие две строки приведут к одинаковому результату. Тем не менее, вторая форма будет превосходить первую форму по крайней мере в 30 раз, в случае отключенного оператора ведения журнала.

logger.debug("The new entry is "+entry+".");
logger.debug("The new entry is {}.", entry);

SLF4J - это еще один лесозаготовительный фасад?

SLF4J концептуально очень похож на JCL. Таким образом, его можно рассматривать как еще один фасад для рубки леса. Тем не менее, SLF4J намного проще по конструкции и, возможно, более надежен. В двух словах, SLF4J позволяет избежать проблем с загрузчиком классов, которые мешают [Jakarta Commons Logging].

Майк Партридж
источник
Есть ли хорошая библиотека с открытым исходным кодом, которая регистрирует код библиотеки, на который вы можете указать? чтобы мы могли видеть как это делается?
user1870400
Spring Framework - это довольно известная библиотека Java, которая делает это; в их случае они выбрали JCL.
Майк Партридж
17

Да , вы должны войти из кода вашей библиотеки. Это не только помогает вам развиваться, но и люди, которые используют библиотеку, сочтут ее полезной. Помните, что вы всегда можете установить уровни ведения журнала, чтобы показывать только те записи журнала, которые вам нужны - и они могут делать то же самое.

Недавно я использовал Mybatis , инструмент ORM с открытым исходным кодом. Я отлаживал проблему, когда запрос, который я считал правильным, не дал результатов. Это был параметризованный запрос, и, поскольку Mybatis ведет логирование в коде своей библиотеки, я смог включить его и увидеть фактический запрос, который выполняется. Легко было сказать, что я поменял два параметра. Без входа в библиотеку я не смог бы найти проблему почти так же быстро.

Майкл К
источник