Standardowy sposób logowanie w ramach serwera JBoss 5 sprowadza się do zapisywania informacji o zdarzeniach do pliku server.log
. Trafiają tam wszystkie zdarzenia, jakie mają zostać zalogowane.
Niekiedy jednak istnieje potrzeba separacji logowania danych z rożnych aplikacji do oddzielnych plików. W przypadku serwera JBoss do logowania używana jest biblioteka log4j
a jej konfiguracja znajduje się w pliku jboss-log4j.xml
. Bibliotekę tę można skonfigurować do logowania danych z danej aplikacji w jeden z dwóch sposobów:
- logować informacje pochodzące z odpowiednich pakietów (rozwiązanie uniwersalne, wymaga tylko odpowiedniej konfiguracji biblioteki
log4j
) - logować informacje pochodzące z danej aplikacji – rozwiązanie korzystające z bibliotek JBossa, będzie działać tylko w ramach serwera aplikacji
Przedstawię obie metody na przykładzie logowania informacji pochodzących z aplikacji Admin Console
.
Podział logowania ze względu na pakiety
Konfiguracja logowanie informacji o wybranych pakietach sprowadza się do kilku kroków:
- konfiguracja pliku, do którego będą zapisywane logi oraz konfiguracja odpowiedniego formatu ich zapisu:
361
362
363
364
365
366<appender name="AdminConsoleLog" class="org.apache.log4j.FileAppender">
<param name="File" value="${jboss.server.home.dir}/log/admin_console.log"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d %-5r %-5p [%c] (%t:%x) %m%n"/>
</layout>
</appender> - identyfikacja pakietów, z których informacje powinny być logowane – czyli najlepiej przejrzeć plik JAR z aplikacją i wypisać odpowiednie pakiety, w przypadku aplikacji
Admin Console
będzie to pakietorg.jboss.on.embedded
- konfigurację logowania wybranych pakietów do odpowiednio wcześniej zdefiniowanego pliku:
368
369
370
371
372
373
374
375
376<category name="org.jboss.on.embedded">
<priority value="DEBUG" />
<appender-ref ref="AdminConsoleLog">
</category>
<category name="org.rhq.core">
<priority value="DEBUG" />
<appender-ref ref="AdminConsoleLog">
</category>
Co zrobić jednak z takimi sytuacjami:
- aplikacja składa się z różnych bibliotek i chcemy także uzyskać z nich uzyskać logi – najprościej, dodać kolejny wpis w pliku
jboss-log4j.xml
z odpowiednią kategorią (w przykładzie powyżej logowanie z pakietuorg.rhq.core
) - ta sama biblioteka jest wykorzystywana w wielu aplikacjach, ale logować informacje chcemy tylko z jednej aplikacji – i tutaj jest kłopot, powyższy sposób spowoduje logowanie danych z każdej instancji biblioteki, nawet jeżeli nie jest ona związana z daną aplikacją. Być może dałoby się skonfigurować logowanie w ramach danej aplikacji, ale nie widzę możliwości konfiguracji tego na poziomie serwera JBoss (w ramach takiej konfiguracji logowania)
Podział logowania ze względu na aplikację
W ramach serwera JBoss istnieje jednak możliwość konfiguracji logowania na podstawie samej aplikacji, ale wymaga do kilku dodatkowych kroków:
- Aktualizacja bibliotek odpowiedzialnych w JBossie za logowanie to nowsze wersji.
Do konfiguracji logowania na poziomie aplikacji w przypadku JBossa 5.1 będzie trzeba użyć klasy filtrującej logi o nazwie
org.jboss.logging.filter.TCLMCFilter
, która jest dostępna w wersji 2.2.1 bibliotekijboss-logging
(w ramach serwera dostępna jest wersja 2.2.0). Aktualizacja sprowadza się do:- pobranie nowej wersji bibliotek:
- zastąpić odpowiednie biblioteki z katalogu
lib
serwera JBoss, czyli po prostu nadpisać odpowiednie pliki JAR ich nowszymi wersjami
- Konfiguracja logowania na poziomie aplikacji.
- Najpierw należy zdefiniować w pliku
jboss-log4j.xml
nową pozycję, w której podamy do z jakiej aplikacji logi nas interesują oraz gdzie mają zostać zapisane:378
379
380
381
382
383
384
385
386
387
388
389
390
391<appender name="AdminConsole2Log" class="org.apache.log4j.FileAppender">
<param name="File" value="${jboss.server.home.dir}/log/admin_console2.log"/>
<param name="Threshold" value="DEBUG"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d %-5r %-5p [%c] (%t:%x) %m%n"/>
</layout>
<filter class="org.jboss.logging.filter.TCLMCFilter">
<param name="AcceptOnMatch" value="true"/>
<param name="DeployURL" value="admin-console.war"/>
</filter>
<!-- end the filter chain here -->
<filter class="org.apache.log4j.varia.DenyAllFilter"></filter>
</appender>Definicja odpowiedniego filtru, który ma za zadanie wybranie tylko logów pochodzących z wybranej aplikacji znajduje się w linii
384
, sama nazwa aplikacji znajduje się w linii386
. - Teraz należy dodać zdefiniowany obiekt appender do kategorii root:
402<appender -ref ref="AdminConsole2Log"/>
- Najpierw należy zdefiniować w pliku
Teraz pozostaje jeszcze start (lub restart) serwera JBoss i w plikach powinny znaleźć się odpowiednie logi z poszczególnych aplikacji.