2010-07-01 16 views
11

Jestem nowy w kontenerach serwletów i utworzyłem aplikację internetową przy użyciu Tomcat 6.0.26. Mam "TODO: log" rozproszone w moim kodzie. Widzę istnieje.Rejestrowanie serwletów Tomcat

myServlet.getServletContext() log()

który wydaje się zapisać do pliku z prefiksem 'localhost' w Tomcat katalogu '/ logs. Nie potrzebuję żadnej zaawansowanej funkcji rejestrowania, ale chciałbym, aby data, godzina, komunikat i ślad stosu były minimalne. Dodatkowo stworzyłem kilka klas używanych przez moje różne serwlety, które również potrzebują funkcji rejestrowania. Czy muszę wstrzykiwać SevletContext do tych klas, aby mogli się zalogować?

Wygląda na to, że log4j z Apache jest popularnym pakietem logowania, ale nie jestem pewien, czy warto go skonfigurować.

Jaki byłby zalecany sposób logowania do moich potrzeb?

Odpowiedz

8

Poza wszystkimi BalusC rzeczy nie wymienione powyżej, w kodzie Java (serwlety/fasola/cokolwiek) tylko import i zainicjować Logger

package my.app; 

import org.apache.log4j.Logger; 

private static Logger logger = Logger.getLogger("classname"); 
// use any string you want 

Następnie w dowolnym momencie rejestrowania można zalogować się na różnych poziomach jak

if (logger.isDebugEnabled()) { 
      logger.debug("Some log at this point"); 
     } 

... 

logger.info("Some info message here"); 

nich pojawi się w logach w zależności od tego, czy zestaw DEBUG lub INFO w log4j.propeties

Spójrz na przykładach na http://www.java2s.com/Code/Java/Language-Basics/Examplelog4jConfigurationFile.htm i wszystkie podobne przykłady w tym samym artykule:

+1

Dzięki za pomoc. Nie mogłem znaleźć tego łączącego elementu układanki. Czy na marginesie, czy istnieje przyczyna, dla której mechanizm logowania wbudowany w JDK nie jest częściej używany? – Wilson

+0

@Wilson - więcej o tej debacie http://stackoverflow.com/questions/31840/java-logging-vs-log4j i http://stackoverflow.com/questions/582428/java-util-logging-logger-and- log4j – JoseK

+0

@JoseK - Czy istnieje prosty sposób rejestrowania działania serwletu w pliku bez log4j lub konsoli? Zadałem na to pytanie. Proszę mi pomóc w - https://stackoverflow.com/questions/23858552/simple-way-to-log-servlet-in-tomcat –

10

Nie chcesz wiązać wszystkich firm i kodu dostępu do danych z ServletContext (oczywiście zakładam, że twoja firma i kod DB nie są ściśle powiązane w klasie serwletów, ale po prostu żyj we własnej warstwie klasy, bez żadnych odniesień javax.servlet). Dlatego nie polecam używania ServletContext#log(). Jest również bardzo rzadko używany w prawdziwym świecie.

Masz rację, że log4j jest popularny, mimo że został zastąpiony przez logback. Konfiguracja log4j nie musi być tak kłopotliwa. Proponuję zacząć od pliku właściwości, który jest trudniejszy do zrozumienia niż plik XML. Zawsze możesz uaktualnić do pliku XML, gdy zrozumiesz, co się dzieje w konfiguracji log4j.

Utwórz plik o nazwie log4j.properties, umieść go gdzieś w katalogu głównym ścieżki klas, np. /WEB-INF/classes (lub jeśli korzystasz z IDE, z katalogu głównego src, trafi on ostatecznie we właściwe miejsce). Możesz także zachować go poza aplikacją webową i dodać ścieżkę do ścieżki klas środowiska wykonawczego serwera, określając jego ścieżkę w shared.loader właściwości Tomcat/conf/catalina.properties. Wreszcie wypełnić go w następujący sposób: Przykład

# Set root logger level and appender name. 
log4j.rootLogger = TRACE, console 

# Specify appenders. 
log4j.appender.console = org.apache.log4j.ConsoleAppender 
log4j.appender.file = org.apache.log4j.DailyRollingFileAppender 

# Configure console appender. 
log4j.appender.console.layout = org.apache.log4j.PatternLayout 
log4j.appender.console.layout.ConversionPattern = %d{ABSOLUTE} [%t] %-5p %m%n 

# Configure file appender. 
log4j.appender.file.File = /webapp/logs/web.log 
log4j.appender.file.DatePattern = '.'yyyy-MM-dd 
log4j.appender.file.layout = org.apache.log4j.PatternLayout 
log4j.appender.file.layout.ConversionPattern = %d{ABSOLUTE} [%t] %-5p %m%n 

Ten KickOff domyślnie dzienników na poziomie TRACE. Można go zmienić na DEBUG lub INFO tak:

# Set root logger level and appender name. 
log4j.rootLogger = INFO, console 

Ten przykład również domyślnie używa appender konsoli. Loguje się do standardowego wyjścia, ponieważ jest skonfigurowane przez Tomcat, który domyślnie ląduje w pliku /logs/localhost.yyyy-MM-dd.log.

Można jednak zmienić go używać appender pliku tak:

# Set root logger level and appender name. 
log4j.rootLogger = INFO, file 

Ustawienia ConversionPattern można znaleźć szczegółowo w PatternLayout javadoc.

Mam nadzieję, że to pomoże Ci zacząć.

+0

Dzięki za informacje. Głównym powodem, dla którego rozumiem, jak używać Log4j, jest używanie go z kodu. Jak używać go w Servlet, w fasoli, w POJOs? Czy muszę utworzyć instancję Log4j, a następnie znaleźć i przeanalizować właściwości lub plik XML? – Wilson

+0

Wystarczy użyć metody 'Logger # getLogger()', a następnie 'debug()', 'info()', itp. Nie musisz go szukać i analizować za każdym razem. Jeśli jest w ścieżce klas, log4j zrobi to sam. To naprawdę powszechny problem wśród początkujących, ponieważ nie rozumieją "ścieżki klasy". – BalusC

+1

Sprawdzając, co powiedział BalusC, [SLF4J] (http://www.slf4j.org/) + [Logback] (http://logback.qos.ch/) to bardziej nowoczesny sposób rejestrowania. Stworzony przez wynalazcę log4j i mający być następcą log4j. Zobacz [moja odpowiedź] (http://stackoverflow.com/a/19947417/642706) na [podobne pytanie] (http://stackoverflow.com/questions/19933036/simplest-way-to-log-to-tomcat -catalina-out/19947417 # 19947417), aby uzyskać więcej informacji. –

Powiązane problemy