Logowanie przez log4j w tomcat7 na przykładzie systemu Ubuntu 12.04.2 LTS
Napisał: Patryk Krawaczyński
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