Podczas pracy przy projekcie w środowisku developerskim na lokalnym serwerze z reguły nie ma problemu, aby uruchomić aplikację w trybie debugowania i w łatwy sposób zidentyfikować błąd lub nadzorować działanie procesów. Problem pojawia się jednak wtedy, gdy istnieją pewne ograniczenia i jedyna możliwość przeprowadzenia testu istnieje na środowisku przed produkcyjnym tzw. staging. Dobrym przykładem takiej sytuacji może być chęć przetestowania płatności online, która do pełnego działania potrzebuje podania działających linków w celu wysłania potwierdzenia zapłaty wraz z jego weryfikacją.

Można oczywiście wypisywać logi za pomocą standardowego wyjścia System.out.println(), jednak ta metoda jest ograniczona pod względem przekazywanych informacji, oraz co jest bardzo denerwujące wszystko zapisywane jest w obszernym pliku server.log. Poniżej przykład jak wygląda taki log w aplikacji:

System.out.println("Example log from System.out.println");

oraz w pliku server.log JBoss’a:

22:45:31,539 INFO  [stdout] (http-localhost-127.0.0.1-8080-1) Example log from System.out.println

Z pomocą przychodzi nam biblioteka log4j, która jest wspierana przez JBoss’a. Poniżej zaprezentuje, w jaki sposób można dodać i skonfigurować logi w oddzielnym pliku na serwerze JBoss 7.

Posłużę się utworzonym w poprzednim wpisie przykładem MyApplication.
W pierwszej kolejności należy dodać bibliotekę do naszego projektu. Zależnie od modułu, w którym będziemy go używali można dodać do:

  • EAR => katalog lib,
  • EJB => META-INF,
  • WAR => WEB-INF->LIB.

Ja dodałem do głównego projektu ear, aby mieć możliwość używania biblioteki, w każdym z modułów. Robi się to następująco:

  1. Klikając na projekcie ear MyApplication prawym przyciskiem myszy i wybraniu New -> Folder. Jako nazwę folderu wpisujemy lib.
  2. Z katalogu jboss’a JBOSS_HOME\modules\org\apache\log4j\main\ kopiujemy bibliotekę log4j-1.2.16.jar do wcześniej utworzonego katalogu lib.
    log4j_1
  3. Wchodzimy do Propertities projektu ear i wyberamy Deployment Assembly.
  4. Za pomocą przycisku Add wybieramy poprzednio utworzony folder.
  5. w kolumnie Deploy Path edytujemy „/” na „lib/”.
    log4j_2

Przed umieszczeniem logów w kodzie, trzeba jeszcze skonfigurować plik standalone.xml znajdujący się w katalogu JBOSS_HOME\standalone\configuration. Należy w bloku <subsystem xmlns=”urn:jboss:domain:logging:1.1″> dodać:

<periodic-rotating-file-handler name="MY_FILE">
   <formatter>
      <pattern-formatter pattern="%d{HH:mm:ss,SSS} %-5p [%c] (%t) %s%E%n"/>
   </formatter>
   <file relative-to="jboss.server.log.dir" path="my_log_file.log"/>
   <suffix value=".yyyy-MM-dd"/>
   <append value="true"/>
</periodic-rotating-file-handler>

,oraz:

<logger category="com.myapplication">
   <handlers>
      <handler name="MY_FILE"/>
   </handlers>
</logger>

Powyższa konfiguracja spowoduje, że podczas uruchomienia serwera utworzony zostanie plik my_log_file.log w katalogu JBOSS_HOME\standalone\log.

Pora teraz na dodanie loga do naszej aplikacji.

Np. w klasie UserManagerBean znajdującej się w pakiecie com.myapplication.manager tworzymy obiekt logger

Logger logger = Logger.getLogger(UserManagerBean.class);

, który w dalszej części wykorzystujemy do podania informacji na wyjście do wcześniej utworzonego pliku

@Override
public void storeUser(User user) {
    logger.info("test logger in storeUser " + user.toString());
    logger.error("test logger in storeUser " + user.toString());
    logger.fatal("test logger in storeUser " + user.toString());
    logger.warn("test logger in storeUser " + user.toString());        

    System.out.println("Example log from System.out.println");
    em.merge(user);
}

Dodatkowo dodałem tekst na standardowe wyjście, aby pokazać, iż zostanie on wyświetlony tylko w pliku logów JBoss’a – server.log.

Aby zapewnić większą kontrolę nad „wyrzucanymi” do pliku logami, można stosować różne poziomy (ang. levels) tj:

  • debug,
  • error,
  • fatal,
  • info,
  • trace,
  • warn.

Do przetestowania działania naszego kodu, wystarczy „odpalenie” aplikacji i należy dokonać aktualizacji jakiegoś rekordu. Poniżej wiersze z pliku my_log_file.log:

23:21:27,016 INFO  [com.myapplication.manager.UserManagerBean](http-localhost-127.0.0.1-8080-1) test logger in storeUser com.myapplication.model.User@1276be
23:21:27,026 ERROR [com.myapplication.manager.UserManagerBean](http-localhost-127.0.0.1-8080-1) test logger in storeUser com.myapplication.model.User@1276be
23:21:27,026 FATAL [com.myapplication.manager.UserManagerBean](http-localhost-127.0.0.1-8080-1) test logger in storeUser com.myapplication.model.User@1276be
23:21:27,026 WARN  [com.myapplication.manager.UserManagerBean](http-localhost-127.0.0.1-8080-1) test logger in storeUser com.myapplication.model.User@1276be

W razie problemów z konfiguracją, inne źródła podają, iż powinno utworzyć się plik jboss-deployment-structure.xml. Więcej o tym można przeczytać na oficjalnej stronie JBoss’a.

Poniżej strony, które mogą się również przydać przy konfiguracji logów: