2010-04-09 5 views
7

Google guice имеет built-in logger binding. Но что, если я хочу использовать журнал регистрации или log4j?Как мне получить google guice для ввода пользовательского регистратора, скажем, для ведения журнала регистрации или log4j logger

Могу ли я получить Guice внедрить бревно, созданного

LogFactory.getLog(CLASS.class) 

Но имея такое же поведение, как в встроенной в связывании:

Связывание автоматически устанавливает имя Logger на имя класс, в который Logger впрыскивается ..


Это даже имеет смысл? Или крик, я просто использую встроенный Java-Logger? Или просто использовать общедоступную информацию без инъекций?

+0

Нет, это имеет смысл. Log4j поддерживает больше уровней ведения журналов и имеет больше доступных приложений, поэтому желание использовать его вместо встроенного логгера имеет для меня прекрасный смысл. –

ответ

11

Страница CustomInjections на странице Guice wiki описывает, как вводить регистратор, названный классом, в который он вводится.

+0

Хорошая ссылка. Вид болезненного процесса, но тем не менее функциональный. –

+0

Спасибо за ссылку. Это сработало для меня. Я использовал эту стратегию для реализации решения SLF4J. –

+3

Для всех, кто запутался в классе InjectLogger в примере: просто создайте в своем проекте пустой класс Annotation с именем «InjectLogger». Это не внешняя зависимость (именно это я и предполагал). –

1

Это ваш выбор. Я успешно использовал logback с помощью Guice, используя метод, подробно описанный в wiki.

Посмотрите на проект sli4j. Это может быть полезно.

0

Guice очень полезен для инъекций различных реализаций интерфейса. Здесь не так, поскольку различные реализации протоколирования там имеют разные API.

Если вы хотите, чтобы иметь возможность обменивать фактическую реализацию регистрации позже при разработке с использованием интерфейса commons logging или slf4j.

+0

Hibernate использует SLF4J и интегрирован как в приложение на основе Guice без каких-либо проблем, поэтому я могу порекомендовать его, хотя я не играл с ведением журнала. –

0

Хотя вы не можете изменить предоставленный java.util.logging.Logger регистратор, вы связываете новый регистратор так же, как и любой другой класс:

bind(Log.class).to(LogFactory.getLog(YourClass)); // or toInstance(...); 

Но, создавая именованный регистратор будет немного сложнее.

Если вы выкапываете код Google Guice (u til.BinderImpl.java:87), вы можете увидеть, как они назначают отдельное имя класса для каждого экземпляра введённого регистратора. Тем не менее, я не проверял его достаточно тщательно, чтобы узнать, легко ли это воспроизводится.

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

+0

Я этого не понимаю. Если вы явно определяете YourClass в связующем, вы получаете журналы одного и того же класса для всего приложения. –