2013-02-26 17 views
13

Aktualnie rozpoczynam nową aplikację Webapp (działającą na tomcat 6) Mam komponenty wykorzystujące slf4j i komponenty wykorzystujące wspólne logowanie Mam zamiar użyć log4j 2.0 jako implementacji logu z powodu kilka powodów (głównie dla aplikantów: SocketAppender i SyslogAppender, ale także z powodu promowanego przeładowania config bez utraty zdarzeń dziennika)Jak używać log4j 2.0 i slf4j i Commons Logując się razem

Teraz moje pytania to: - Do jakiego interfejsu mam programować moje nowe zajęcia? loag4j lub slf4j? czy nawet wspólne logowanie?

  • Jaki jest preferowany sposób rozmieszczania słoików? umieścić je w mojej wojnie aplikacji lub umieścić je w tomcat libs?

  • jakie słoiki muszę zainstalować? log4j (w tym slf4j i commons wiązań), świetlicy rejestracji (slf4j-api-1.7.2.jar) i slf4j API (slf4j-api-1.7.2.jar)

Odpowiedz

20

Do jakiego interfejsu mam programować moje nowe zajęcia? loag4j lub slf4j?

Jeśli zamierzasz używać SLF4J, zaprogramuj ten interfejs. Zapewnia największą elastyczność w zakresie implementacji rejestrowania danych. Punkt slf4j ma być interfejsem, który można zaprogramować, więc w przyszłości, jeśli zdecydujesz się przełączyć na, powiedzmy, logback, nie będziesz musiał przepisywać swojego kodu.

Jaki jest preferowany sposób rozmieszczania słoików? umieścić je w mojej wojnie aplikacji lub umieścić je w tomcat libs?

Umieść je w swojej wojnie.

Jedynym powodem (imo) do umieszczenia plików JAR w katalogu libs Tomcat jest sytuacja, w której trzeba załadować bibliotekę macierzystą. Ponieważ Java nie pozwala na załadowanie tej samej natywnej biblioteki z dwóch różnych programów ładujących klasy, musisz umieścić ją we wspólnej lokalizacji. Ale to nie dotyczy tutaj.

Niektórzy uważają katalog lib za sposób na zaoszczędzenie miejsca.To mogło być ważne, gdy maszyny "klasy serwerowej" miały 1 GB pamięci RAM, ale już jej nie ma. Unikanie numeru lib oznacza, że ​​unikasz większości trudnych do debugowania problemów z klasą.

jakie słoiki muszę zainstalować?

  • slf4j-api jest podstawowym API
  • trasy slf4j-log4j12 rzeczywista logowania do LOG4J
  • JCL-over-slf4j przechwytuje Commons Logging i trasy to poprzez slf4j (do log4j)
  • log4j będzie twoim fizycznym szkieletem logowania

Zakładam, że masz już konfigurację Log4J i/lub wygodnie piszesz tę konfigurację. Jeśli nie, i wszystko, co obchodzi ma do czynienia z kodem, który używa Log4J wewnętrznie, nie log4j-over-slf4j, który przechwyci Log4J nazywa. Następnie musisz wybrać framework, taki jak Logback.

. (Uwaga: I pierwotnie dodane linki do wszystkich tych pakietów, ale nie mają wystarczająco dużo rep do ich zamieszczania Więc here's pojedynczy link do repozytorium Maven ze wszystkimi pakietami slf4j podświetlone)

+0

1. OK, rozumiem, że jeśli umieszczę wszystkie słoiki w mojej wojnie, mam tę wadę, że nie mogę mieć konfiguracji logowania poza wojną i (z automatyczną aktualizacją) manipulować konfiguracją w czasie wykonywania. (To może być raczej pytanie tomcat/log4j_2.0 i powinienem go zapytać w osobnym poście) 3. jak mam zamiar użyć log4j * 2.0 * Zakładam, że potrzebuję log4j-slf4j-impl.jar zamiast slf4j-log4j12 .jar, czy to prawda? – raudi

+0

Nie użyłem log4j 2.0, więc nie wiesz, który JAR implementacji będziesz potrzebować. Ale powinno to być dostępne na stronie SLF4J. – parsifal

+1

Jeśli chodzi o utrzymywanie konfiguracji na zewnątrz, aby można było ją modyfikować w locie: nadal można to zrobić, umieszczając * tylko * plik konfiguracyjny w katalogu lib (i nic w WAR). Zostanie znaleziony przez skanowanie prędkości klasy z WAR. Jednak wolę używać JMX do dostosowywania poziomów rejestrowania. W Log4J 1.2 istnieje komponent bean JMX, a także w wersji 2.0; jeśli go utworzysz, zarejestruje się on za pomocą dostawcy JMX platformy, więc możesz użyć narzędzia takiego jak JConsole, aby uzyskać do niego dostęp. – parsifal

1

Należy pamiętać, że nie zostały wykorzystane Log4J 2.0, mimo że użyłem SLF4J z Log4J 1.2. Mając to na uwadze, odpowiedziałbym na następujące pytania:

  1. Program do SLF4J. Ma ładny, prosty interfejs API, który jest wszystkim, czego prawdopodobnie będziesz potrzebował ze struktury logowania. Plus, jeśli zdecydujesz się z jakiegoś powodu, że chcesz przełączyć na logback lub Log4J 1.2 lub cokolwiek zamiast Log4J 2.0, możesz po prostu wyłączyć słoiki z backendu.
  2. Zdecydowanie umieścić słoiki w wojnie aplikacji. Prawie nigdy nie należy umieszczać słoików w katalogu serwera aplikacji o numerze lib. W przeciwnym razie wpłyną one na wszystkie aplikacje internetowe na tym serwerze aplikacji, a nie tylko na twoje. Ponadto, słoiki w katalogu serwera aplikacji lib nie mogą być kontrolowane przez wdrażanie aplikacji internetowych, ale muszą być zarządzane ręcznie.
  3. Wygląda na to, że będziesz potrzebował slf4j-api-1.7.2.jar, log4j-to-slf4j-2.0-beta4.jar, log4j-2.0-beta4.jar i log4j-core-2.0-beta4.jar wraz z dowolnymi zależnościami. Jestem pewien, że Maven wprowadzi wymagane zależności, jeśli używasz tego.
+0

1. OK 2. Patrz mój komentarz powyżej: czy można zmienić zalecenie, jeśli chcę mieć zewnętrzny (= nie w wojnie) konfiguracja dziennika? 3. Zakładam, że potrzebuję mostu/wiązania (log4j-slf4j-impl.jar), a nie adaptera (log4j-to-slf4j.jar), a jak wspomniany @parsifal również potrzebuję jcl-over-slf4j.jar (w celu umożliwienia moim logiom bibliotecznym logowania również logowania się do slf4j w log4j), czy to jest poprawne? – raudi

6

I używam slf4j z log4j2 i korzystania

slf4j-api-1.7.12.jar 
log4j-api-2.2.jar 
log4j-core-2.2.jar 
log4j-slf4j-impl-2.2.jar 
jcl-over-slf4j-1.7.12.jar(get rid of commons logging jars) 

jeśli serwer aplikacja sprzeczne wersje, być może trzeba będzie zastąpić używając jakiegoś sprzedawca specyficzne ustawienia ClassLoader

np w WebLogic 12 c mam to w moim weblogic.xml wewnątrz src/main/webapp/WEB-INF

<?xml version="1.0" encoding="UTF-8"?> 
<weblogic-web-app 
xmlns="http://xmlns.oracle.com/weblogic/weblogic-web-app" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd 
http://xmlns.oracle.com/weblogic/weblogic-web-app http://xmlns.oracle.com/weblogic/weblogic-web-app/1.5/weblogic-web-app.xsd"> 
<container-descriptor> 
    <prefer-application-packages> 
     <package-name>org.apache.log4j.*</package-name> 
     <package-name>org.apache.commons.logging.*</package-name> 
     <package-name>org.apache.commons.lang.*</package-name> 
     <package-name>org.apache.commons.io.*</package-name> 
     <package-name>org.apache.commons.collections4.*</package-name> 
     <package-name>org.slf4j.*</package-name> 
    </prefer-application-packages> 
</container-descriptor> 
<jsp-descriptor> 
    <keepgenerated>true</keepgenerated> 
    <debug>true</debug> 
</jsp-descriptor> 
<context-root>/cnfg</context-root> 
</weblogic-web-app> 
Powiązane problemy