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 pakiet org.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 pakietu org.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:

  1. 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 biblioteki jboss-logging (w ramach serwera dostępna jest wersja 2.2.0). Aktualizacja sprowadza się do:

  2. 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 linii 386.

    • Teraz należy dodać zdefiniowany obiekt appender do kategorii root:
      402
           <appender -ref ref="AdminConsole2Log"/>

Teraz pozostaje jeszcze start (lub restart) serwera JBoss i w plikach powinny znaleźć się odpowiednie logi z poszczególnych aplikacji.

Źródła