2010-04-09 11 views
7

Google guice ma built-in logger binding. Ale co jeśli chcę użyć rejestratora commons lub log4j?Jak uzyskać Google Guice, aby wstrzyknąć niestandardowy program rejestrujący, powiedzmy, logowanie commons lub log4j

mogę dostać Guice wstrzyknąć dziennika utworzone przez

LogFactory.getLog(CLASS.class) 

Ale mając takie samo zachowanie jak w wbudowany wiązania:

Wiązanie automatycznie ustawia nazwę rejestratora nazwy klasa, w którym rejestrator jest wtryskiwany ..


Czy ma to sens? Albo krzyczeć, po prostu używam wbudowanego programu java Logger? Lub po prostu użyć rejestrowania commons bez zastrzyków?

+0

Nie, to ma sens. Log4j obsługuje więcej poziomów rejestrowania i ma więcej dostępnych aplikacji, więc chęć użycia go zamiast wbudowanego programu rejestrującego ma dla mnie sens. –

Odpowiedz

11

Strona Guice wiki opisuje dokładnie, w jaki sposób wstrzyknąć rejestrator nazwany przez klasę, do której jest wstrzykiwany.

+0

Ładny link. Trochę bolesny proces, ale mimo to funkcjonalny. –

+0

Dzięki za link. To zadziałało dla mnie. Użyłem tej strategii do wdrożenia rozwiązania SLF4J. –

+3

Dla wszystkich, którzy są zdezorientowani w klasie InjectLogger w przykładzie: Po prostu utwórz pustą klasę Annotation o nazwie "InjectLogger" w swoim projekcie. To nie jest zewnętrzna zależność (to było to, co zakładałem jako pierwszy). –

1

To twój wybór. Z powodzeniem użyłem logback z Guice, używając metody opisanej na wiki.

Zobacz projekt sli4j. To może być przydatne.

0

Guice jest bardzo przydatny do wstrzykiwania różnych implementacji interfejsu. Nie dzieje się tak w tym przypadku, ponieważ różne implementacje rejestrowania mają różne interfejsy API.

Jeśli chcesz mieć możliwość wymiany rzeczywistej implementacji rejestrowania później podczas rozwijania interfejsu, użyj commons logging lub slf4j.

+0

Hibernate używa SLF4J, a ja połączyłem je bez żadnych problemów z aplikacją opartą na Guice, więc mogę ją polecić, chociaż nie grałem w trybie logowania commons. –

0

Chociaż nie można zastąpić dostarczonego java.util.logging.Logger rejestratora, powiązać nowy rejestrator podobnie jak każdy inny klasy:

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

Ale, tworząc nazwie rejestrator będzie nieco trudniejsze.

Po przejrzeniu kodu Google Guice (u til.BinderImpl.java:87) można zobaczyć, w jaki sposób przypisują one odrębną nazwę klasy dla każdego wystąpienia rejestratora, który jest wstrzykiwany. Jednak nie sprawdziłem go wystarczająco dokładnie, aby wiedzieć, czy jest łatwo powtarzalny.

Możliwe, że można utworzyć dostawcę lub wstrzyknąć fabrykę, która w jakiś sposób ma dostęp do kontekstu, aby można było podać nazwanego rejestratora.

+0

Nie rozumiem tego. Jeśli jawnie zdefiniujesz YourClass w segregatorze, otrzymasz logi tej samej klasy dla całej aplikacji. –