Регистратор для библиотеки Java

Я пишу библиотеку, которая собирает различные функции, которые я буду использовать в разных приложениях. Я хочу, чтобы он генерировал операторы журнала, видимые для пользователя библиотеки, т. Е. Если я создаю приложение и использую библиотеку, я хочу, чтобы библиотека генерировала операторы журнала, видимые для меня. Как я могу это сделать? Поскольку файл журнала будет настроен разработчиком приложения, как моя библиотека узнает, как вести журнал?


person João Daniel    schedule 16.03.2012    source источник
comment
Взгляните на фреймворк Spring. В частности, наиболее полезной для вас является возможность внедрения зависимостей.   -  person cdeszaq    schedule 16.03.2012


Ответы (3)


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

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

Logging Facades решают эту проблему (из Apache Commons Logging):

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

Пакет Logging — это сверхтонкий мост между различными реализациями ведения журналов. Библиотека, использующая API-интерфейс Commons-Logging, может использоваться с любой реализацией ведения журнала во время выполнения. Commons-logging поставляется с поддержкой ряда популярных реализаций ведения журнала, а написание адаптеров для других — довольно простая задача.

Или рассуждения от SLF4J:

Простой фасад ведения журнала для Java или (SLF4J) служит простым фасадом или абстракцией для различных сред ведения журнала, например. java.util.logging, log4j и logback, что позволяет конечному пользователю подключить нужную структуру ведения журнала во время развертывания.

Кандидатами на бревенчатые фасады являются:

Лично я бы рекомендовал SLF4JЖурнал).

person Joe23    schedule 16.03.2012
comment
Ваш пример вводит в заблуждение. Разработчик может одновременно использовать SLF4J API для своего кода и адаптер log4j для сторонних разработчиков. Затем он просто выбирает какой-нибудь бэкэнд SLF4J, например logback. На самом деле это причина для SLF4J, это так просто. Конфигурация log4j не требуется. - person Rostislav Matl; 20.03.2012
comment
@RostislavMatl Вы говорите о связующих модулях SLF4J (slf4j.org/legacy.html)? Это позволяет вам использовать библиотеку, которая использует log4j,... внутри, и перенаправлять ее сообщения журнала в SLF4J (что может поддерживаться логбэком). Это, безусловно, отличная функция, если вы являетесь ПОЛЬЗОВАТЕЛЕМ библиотеки. Однако, если вы являетесь РАЗРАБОТЧИКОМ библиотеки, почему вы должны заставлять своих пользователей прыгать через такие обручи? Почему бы не использовать фасад напрямую? Как указано на странице SLF4J, эти решения подходят для программного обеспечения, не зависящего от вас. Пожалуйста, поправьте меня, если я вас неправильно понял. - person Joe23; 20.03.2012
comment
Видимо, мы говорим о разных вещах. Вы написали: если вы используете log4j, но разработчик, использующий вашу библиотеку, использует logback, ему придется включить конфигурацию log4j - это неправда. И в то же время это плохое решение. Я не говорил, что вы не можете использовать SLF4J при разработке нового кода. Я выбрал точку зрения пользователя библиотеки, потому что вы чаще будете пользователем, чем создателем. - person Rostislav Matl; 21.03.2012
comment
@RostislavMatl А, теперь я понял. Я написал он должен будет включить, а вы говорите, что есть другие решения, т.е. модуль моста. Что касается точки зрения, я думаю, что ОП писал с точки зрения создателя библиотеки, поэтому мой ответ написан таким же образом. - person Joe23; 21.03.2012
comment
@RostislavMatl Я обновил свой ответ и добавил ссылку на модули соединения. Тем не менее, я не хочу слишком подчеркивать этот момент, так как лучший подход при разработке новой библиотеки по-прежнему состоит в том, чтобы напрямую использовать фасад. Вы согласны? - person Joe23; 21.03.2012
comment
Да, я определенно рекомендую использовать SLF4J с логбэком в качестве бэкэнда и унифицировать логирование логов сторонних компонентов в вашей среде с помощью адаптеров/модулей моста. - person Rostislav Matl; 22.03.2012

Стандартные решения для этого:

Все они позволят вам настроить расположение файла журнала с помощью конфигурации.

person nwinkler    schedule 16.03.2012

Расположение вашего файла журнала задается вне пакета в конфигурации среды ведения журнала. Файл конфигурации обычно находится в пути к классам. То, как это выглядит, зависит от того, какую структуру ведения журналов вы используете. Я рекомендую использовать SLF4J и Журнал.

person Rostislav Matl    schedule 16.03.2012