2009-04-09 19 views
8

Piszę aplikację Flex na aplikacji internetowej Java, używając BlazeDS. BlazeDS ma w nim logowanie, ale chcę ustawić to tak, aby korzystał z tej samej struktury rejestrowania, którą mam w mojej aplikacji.Jak mogę skonfigurować moją implementację BlazeDS za pomocą Log4J?

Czy istnieje sposób na skonfigurowanie BlazeDS do używania Log4J? Czy utknąłem z materiałem rejestracyjnym Flex, który został już upieczony w BlazeDS?

Odpowiedz

13

No, z BlazeDS box nie obsługuje bezpośrednio log4j lub innych ram.

Jednak bardzo proste jest dodanie obsługi ulubionej struktury logowania; Użyłem następujących czynności, aby uzyskać dane wyjściowe do SLF4J:

package example; 

import org.slf4j.Logger; 
import org.slf4j.LoggerFactory; 

import flex.messaging.log.AbstractTarget; 
import flex.messaging.log.LogEvent; 

public class Slf4jTarget extends AbstractTarget { 
    // log4j levels: OFF - FATAL - ERROR - WARN - INFO - DEBUG - TRACE - ALL 
    // blazeds levels: NONE - FATAL - ERROR - WARN - INFO - DEBUG - ALL 

    @Override 
    public void logEvent(LogEvent event) { 
     Logger log = LoggerFactory.getLogger(event.logger.getCategory()); 

     if (event.level >= LogEvent.ERROR) 
      log.error(event.message, event.throwable); 
     else if (event.level >= LogEvent.WARN) 
      log.warn(event.message, event.throwable); 
     else if (event.level >= LogEvent.INFO) 
      log.info(event.message, event.throwable); 
     else if (event.level >= LogEvent.DEBUG) 
      log.debug(event.message, event.throwable); 
     else 
      log.trace(event.message, event.throwable); 
    } 
} 

.. i go używać, należy ją włączyć w services-config.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<services-config> 
    <logging> 
     <target class="example.Slf4jTarget" level="Info"> 
    </logging> 
</services-config> 
+0

Ta odpowiedź jest wspaniała. Moje komentarze: 1) Musiałem nadpisać equals() w moim Slf4jTarget, aby zwrócić wartość true dla każdej innej instancji tego samego typu, aby zapobiec dwukrotnemu zarejestrowaniu tego celu przez BlazeDS. 2) Przedimekowałem ciąg znaków event.logger.getCategory() z "BlazeDS." mieć lepszą obsługę przestrzeni nazw podczas konfigurowania slf4j 3) Obcinam komunikaty DEBUG do 1000 znaków, ponieważ BlazeDS zrzuca wszystkie dane wejściowe i wyjściowe. – Tom

+0

Wygodne jest również wywoływanie super() z konstruktora – fglez

1

Nie wierzę, że istnieje coś wbudowaną który pozwala przekierować wyjście rejestrowanie Blaze DS Log4J, commons-logging, itd. Jednak ten problem JIRA może być użyteczne dla Ciebie:

http://jira.springframework.org/browse/FLEX-18

Zawiera klasy Java, aby przekierować konfiguracji wyjściowej i próbki dla usług-config.xml

4

Używaj CommonsLoggingTarget.

Zobacz http://static.springsource.org/spring-flex/docs/1.0.x/javadoc-api/org/springframework/flex/core/CommonsLoggingTarget.html.

Po prostu zachowaj ostrożność przy ustawianiu poziomu rejestru w pliku service-config.xml. Jeśli ustawisz go na "All" i zdefiniujesz logger "blazeds" w log4j.xml, pojawi się wiele redundantnych komunikatów dziennika wygenerowanych przez BlazeDS/LCDS, które mogą mieć znaczący wpływ na wydajność.

+0

Posiada również użyteczną dokumentację we wszystkich kategoriach BlazeDS. – Tom

Powiązane problemy