2009-08-11 10 views
13

Jestem w trakcie migracji rejestrowania średniej wielkości aplikacji z niestandardowego rozwiązania do czegoś bardziej standardowego. Zdecydowałem się na użycie Logback i SLF4J, i pomyślnie zmigrowałem większość kodu Java. Jednak mam sporo stron JSP, które po prostu używają System.out do rejestrowania. Nigdy nie pracowałem dużo z JSP i zacząłem się zastanawiać: w jaki sposób mam użyć właściwego logowania na JSP?Jak używać rejestratorów SLF4J w JSP

<%@page import="org.slf4j.Logger"%> 
<%@page import="org.slf4j.LoggerFactory"%> 
<% 
    Logger log = LoggerFactory.getLogger(getClass()); 
%> 
<!-- ... --> 
<% 
    log.info("Hello Logging!"); 
%> 

To, co przyszło mi do głowy pierwszy, ale wydaje się nie tak w kilku punktach:

  • sposób zbyt gadatliwy i wymaga dużo pracy, aby przekształcić istniejące JSP
  • połączenie jest wykonane do LoggerFactory.getLogger() za każdym razem, gdy strona jest renderowana (w przeciwieństwie do statycznego pola logger w standardowej klasie Java)
  • Myślę, że nazwa rejestratora będzie również czymś mało realistycznym w ten sposób

Czy istnieje jakiś rodzaj standardu, najlepsza praktyka lub cokolwiek dla logowania się do stron JSP?

Ponadto, IIRC, był pewien rodzaj taglib dla Log4J. Czy jest coś podobnego dla SLF4J (a może Logback)?

Odpowiedz

9

Spójrz na slf4j-taglib.

+2

Z tego, co widzę, slf4j-taglib nie przekształcił się w maven central. Po prostu fyi dla każdego, dla kogo to może się zawiesić. –

+0

To jeszcze nie jest! –

0
public enum MyLoggerFactory { 

    INSTANCE; 

    @SuppressWarnings("unchecked") 
    private final Map<Class, Logger> loggers = new HashMap<Class, Logger>(); 

    @SuppressWarnings("unchecked") 
    public Logger getLogger(Class clazz) { 
     if (loggers.get(clazz) == null) { 
      loggers.put(clazz, LoggerFactory.getLogger(clazz)); 
     } 
     return loggers.get(clazz); 
    } 
} 

Następnie strona JSP może wyglądać tak:

<% 
    MyLoggerFactory.INSTANCE.getLogger(getClass()).info("Hello Logging!"); 
%> 
+0

Nie sądzę, jest to każda lepszy. W ten sposób musiałbym wywoływać getLogger() za każdym razem, gdy chciałbym coś logować, są problemy z bezpieczeństwem wątków, a to jest jeszcze bardziej szczegółowe niż oryginalne rozwiązanie. –

+1

Można stosować techniki programowania zorientowanego na aspekt, aby owijać wywołania metod Java, które robią biblioteki znaczników, i rejestrować je przed i po każdym wykonaniu. W każdym razie JSP nie jest miejscem na logikę biznesową.Powinien być w kontrolerze JAVA i częściach modelu. –

5

Można spróbować (Uwaga "!")

<%! org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger("JSPname"); %> 

Następnie wymień swoją System.out jest z

<% log.info("Hello Logging!"); %> 

Komentarze Borisa powinny być naprawdę do rozważenia, JSP nie powinny jednak wymagać logowania. Używałbym tylko tej techniki (lub czegoś podobnego), aby zastąpić istniejące rejestrowanie, które należy zachować.

-1

Myślę, że złym zwyczajem jest wywoływanie logowania z warstwą reprezentacyjną aplikacji. Ogólnie rzecz biorąc, spodziewałbym się, że loguję się tylko w logice biznesowej - JSP zagracony z inwokacją logowania z pewnością złamie zasadę separacji obaw.

Jako tymczasowe, ale eleganckie obejście, można spróbować utworzyć niestandardową bibliotekę znaczników.

0

Aby korzystać z rejestratora w pliku JSP zainicjować obiektu rejestratora w następujący sposób:

<% Logger logger = LoggerFactory.getLogger(this.getClass()); %> 

A potem można iść do przodu za pomocą

logger.info(); or logger.error();, etc. 
Powiązane problemy