2010-02-04 15 views
5

Który logger mam wyświetlić w pliku log4j.xml, aby przechwycić nieobsługiwane wyjątki struts 2?Log4j Logger for Struts 2 Exceptor Interceptor

Mam następujący kod zadeklarowane w moim struts.xml:

<package name="default" extends="struts-default"> 
    <interceptor-stack name="defaultStack"> 
     <interceptor-ref name="timer"/> 
    <interceptor-ref name="logger"/> 
     <interceptor-ref name="exception"> 
      <param name="logEnabled">true</param> 
      <param name="logCategory">error.unhandled</param> 
      <param name="logLevel">WARN</param> 
     </interceptor-ref> 
    </interceptor-stack> 
</package> 

W moim pliku log4j.xml, mam następujący rejestrator oświadczył:

<appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender"> 
    <layout class="org.apache.log4j.PatternLayout"> 
     <param name="ConversionPattern" value="%p [%c] - %C{1}.%M(%L) | %m%n"/> 
    </layout> 
</appender> 
<logger name="error.unhandled"> 
    <level value="DEBUG"/> 
    <appender-ref ref="CONSOLE" /> 
</logger> 

Jednak gdy Struts Zgłasza wyjątek, nie jest poprawnie rejestrowany przez log4j. Wiem, że mój plik log4j.xml jest poprawnie przetwarzany, ponieważ mogę ręcznie utworzyć klasę języka Java za pomocą programu rejestrującego o nazwie "error.unhandled" i bezpośrednio do niego pisać komunikaty poziomu ERROR. Kolega zasugerował również, że powinienem spróbować przechwycić log4j.logger.error.unhandled logger, ale to też nie działa.

Który program rejestrujący używa Struts 2 do przechwytywania wyjątków?

+0

Czy możesz ręcznie zarejestrować coś na poziomie WARN i czy jest ono widoczne w dzienniku? – skaffman

+0

Do jakiego rodzaju konteneru chcesz wdrożyć? (Tomcat, JBoss, WebSphere) –

Odpowiedz

0

Używasz WARN poziomu logowania w definicji przechwytywacza. Zmień to na ERROR, a zobaczysz komunikaty dziennika lub, alternatywnie, zmniejsz poziom rejestratora do WARN, INFO lub DEBUG w pliku log4j.xml.

Innymi słowy, przechwytywacz wysyła komunikat na poziomie WARN, moduł dołączający konsolę odbiera ten komunikat, ale wybiera, aby nie drukować, ponieważ jest skonfigurowany do drukowania tylko komunikatów na poziomie ERROR.

+0

Obniżyłem poziom błędu aż do DEBUG, ale to nie pomogło. Jakieś inne pomysły? – David

+0

Struts używa wspólnego logowania, więc być może twój problem leży gdzie indziej. Czy logowanie dzienników i log4j są odpowiednio skonfigurowane? – Yoni

+0

Gdzie mogę skonfigurować rejestrowanie commons? Skonfigurowałem tylko log4j.xml – David

0

Twój logger w log4.xml ma ustawiony próg na ERROR, więc wszystko zalogowane poniżej tego poziomu nie zostanie zarejestrowane. Twoja konfiguracja podpórek jest ustawiona na logowanie na poziomie WARN, poniżej ERROR.

Prawdopodobnie powinieneś zmniejszyć próg w log4j.xmllogger do WARN, aby uzyskać cokolwiek.

+0

Obniżyłem poziom błędu aż do DEBUGA, ale to nie pomogło. Jakieś inne pomysły? – David

4

Co należy zrobić, to podać parametry przechwytywacza wyjątków w domyślnym stosie przechwytującym. W przedstawionym przykładzie zmienisz definicję domyślnego stosu.

Rozwiązanie pochodzi z oficjalnej wiki: https://cwiki.apache.org/WW/exception-handling.html

Aby włączyć rejestrowanie wyjątków obsługiwane przez rozporek 2 ram należy określić pewne wartości parametrów w struts.xml.

<interceptors> 
    <interceptor-stack name="appDefaultStack"> 
    <interceptor-ref name="defaultStack"> 
    <param name="exception.logEnabled">true</param> 
    <param name="exception.logLevel">ERROR</param> 
    </interceptor-ref> 
</interceptor-stack> 
</interceptors> 

<default-interceptor-ref name="appDefaultStack" /> 
Powiązane problemy