NFsec Logo

Logowanie przez log4j w tomcat7 na przykładzie systemu Ubuntu 12.04.2 LTS

02/05/2013 w Administracja Brak komentarzy.  (artykuł nr 407, ilość słów: 497)

S

tandardowo w systemie Ubuntu 12.04.2 LTS jest zainstalowany Tomcat7 w wersji 7.0.26. Niestety jednym z ogólnych problemów serwera Tomcat jest rotowanie pliku catalina.out, który czasami (w zależności od poziomu logowania) potrafi zajmować po kilka gigabajtów – a użycie narzędzia logrotate z opcją copytruncate na tak dużym pliku potrafi spowodować, że zanim logrotate dokona skopiowania i wyczyszczenia pliku – inny proces trzymający otwarty plik dokona zapisu, a miejsce nie zostanie wcale zwolnione.

Dzieje się tak, ponieważ plik zostaje “obcinany” do zerowej długości, ale deskryptor pliku w zapisującym procesie nadal wskazuje bezpośrednio w miejsce ostatniego zapisu (użyta funkcja O_APPEND – dopisuje, ale nie kasuje poprzedniej zawartości pliku i ustawia znacznik zapisu na jego końcu). Kiedy proces zaczyna zapis w zerowany plik – system plików zaczyna traktować początek pliku – nie jako pusty, ale złożony z zerowych bajtów (podświetlając taki plik widzimy pełno znaków “.”), które miały zostać zapisane na dysku w celu zwolnienia miejsca. Jedną z metod rozwiązania tego problemu jest po prostu rotowanie pliku, który posiada dość małą zajętość na dysku – ale wiąże się to z dodaniem (w zależności od szybkości przybywania danych) odpowiednich wpisów do daemona cron i nie daje pewności, że proces zerowania pliku zdąży przed kolejnym zapisem. Bardziej rozsądnym i dającym większą kontrolę nad wielkością i ilością logów generowanych przez serwer Tomcat jest użycie serwisu logowania Log4j. W celu jego integracji z serwerem Tomcat należy:

1. Z oficjalnej strony serwisu ściągnąć najnowszy pakiet log4j, a rozpakowany plik .jar wgrać do ścieżki: /usr/share/tomcat7/lib.
2. W tej samej ścieżce należy stworzyć plik konfiguracyjny: log4j.properties o przykładowej zawartości:

# Define all the appenders

log4j.appender.CATALINA=org.apache.log4j.RollingFileAppender
log4j.appender.CATALINA.File=${catalina.home}/logs/catalina.out
log4j.appender.CATALINA.MaxFileSize=10MB
log4j.appender.CATALINA.MaxBackupIndex=5
log4j.appender.CATALINA.layout=org.apache.log4j.PatternLayout
log4j.appender.CATALINA.layout.ConversionPattern=%d{dd.MM.yyyy HH:mm:ss} %p-%c{1}: [%m]%n
log4j.appender.CATALINA.Append=true
log4j.appender.CATALINA.Encoding=UTF-8

log4j.appender.LOCALHOST=org.apache.log4j.RollingFileAppender
# Also log LOCALHOST to catalina.out
log4j.appender.LOCALHOST.File=${catalina.home}/logs/localhost.log
log4j.appender.LOCALHOST.MaxFileSize=10MB
log4j.appender.LOCALHOST.MaxBackupIndex=5
log4j.appender.LOCALHOST.layout=org.apache.log4j.PatternLayout
log4j.appender.LOCALHOST.layout.ConversionPattern=%d{dd.MM.yyyy HH:mm:ss} %p-%c{1}: [%m]%n
log4j.appender.LOCALHOST.Append=true
log4j.appender.LOCALHOST.Encoding=UTF-8

log4j.appender.MANAGER=org.apache.log4j.RollingFileAppender
log4j.appender.MANAGER.File=${catalina.home}/logs/manager.log
log4j.appender.MANAGER.MaxFileSize=10MB
log4j.appender.MANAGER.MaxBackupIndex=5
log4j.appender.MANAGER.layout=org.apache.log4j.PatternLayout
log4j.appender.MANAGER.layout.ConversionPattern=%d{dd.MM.yyyy HH:mm:ss} %p-%c{1}: [%m]%n
log4j.appender.MANAGER.Append=true
log4j.appender.MANAGER.Encoding=UTF-8

log4j.appender.HOST-MANAGER=org.apache.log4j.RollingFileAppender
log4j.appender.HOST-MANAGER.File=${catalina.home}/logs/host-manager.log
log4j.appender.HOST-MANAGER.MaxFileSize=10MB
log4j.appender.HOST-MANAGER.MaxBackupIndex=5
log4j.appender.HOST-MANAGER.layout=org.apache.log4j.PatternLayout
log4j.appender.HOST-MANAGER.layout.ConversionPattern=%d{dd.MM.yyyy HH:mm:ss} %p-%c{1}: [%m]%n
log4j.appender.HOST-MANAGER.Append=true
log4j.appender.HOST-MANAGER.Encoding=UTF-8

log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.Encoding=UTF-8
log4j.appender.CONSOLE.layout = org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern = %d [%t] %-5p %c- %m%n

# Configure which loggers log to which appenders
log4j.logger.org.apache.catalina.core.ContainerBase.[Catalina].[localhost]=INFO, LOCALHOST
log4j.logger.org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/manager]=INFO, MANAGER
log4j.logger.org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/host-manager]=INFO, HOST-MANAGER

Ze względu na fakt, że w standardowo w systemie Ubuntu zmienna ${catalina.home} wskazuje na /usr/share/tomcat7 – w celu zachowania kompatybilności – w ścieżce tej należy stworzyć link symboliczny logs, którego celem będzie katalog /var/logs/tomcat7:

cd /usr/share/tomcat7
ln -s /var/log/tomcat7 logs

3. Ściągnąć z katalogu “extras” pliki: tomcat-juli.jar oraz tomcat-juli-adapters.jar i umieścić je kolejno w ścieżkach: /usr/share/tomcat7/bin oraz /usr/share/tomcat7/lib. Niezbędne jest zastąpienie standardowego pliku tomcat-juli.jar – ściągniętym, ponieważ plik pochodzący z katalogu extras posiada pełną implementację Apache Commons Logging, która jest w stanie wykryć obecność serwisu log4j i dostosować do niego swoją konfigurację. Ostatnim krokiem jest restart serwera Tomcat. Standardowa konfiguracja zadba o to, aby plik catalina.out był rotowany do 5’ciu kopii jeśli jego rozmiar przekroczy 10MB, a wiadomości będą logowane na poziomie INFO. W celu bardziej dokładnej konfiguracji zalecane jest zapoznanie się z dokumentacją log4j.

Więcej informacji: Logging in Tomcat

Kategorie K a t e g o r i e : Administracja

Tagi T a g i : , , , , , , ,

Komentowanie tego wpisu jest zablokowane.