2012-08-30 13 views
5

Jestem bardzo nowy w log4j. Nie chcę, aby pokazać ślad stosu wyjątku w moim pliku dziennika, takich jakKonwertuj plik e.printStackTrace(), aby używał log4j zamiast:

java.lang.IllegalArgumentException: nodeRef is a mandatory parameter 
at org.alfresco.util.ParameterCheck.mandatory(ParameterCheck.java:42) 

Wyjątki te są zapisywane bezpośrednio do konsoli za pomocą e.printStackTrace() jak ten

try { 
    // something 
} catch(Exception e) { 
    StringWriter stack = new StringWriter(); 
    e.printStackTrace(new PrintWriter(stack)); 
    logger.debug("Caught exception; decorating with appropriate status template : " + stack.toString()); 
} 

Jestem teraz dostosowywania Open Source projekt, nie pisząc wszystkich moich programów samodzielnie. Tak więc niemożliwe jest usunięcie e.printStackTrace(); we wszystkich plikach Java.

O ile mi wiadomo, dziennik drukowany przez log4j z rejestratorem może być skonfigurowany przy użyciu poziomu błędu log4j, takiego jak info, debug, warn. Ale jak pisać bezpośrednio do konsoli lub pliku?

Jak mogę skonfigurować log4j tak, aby nie wyświetlał tylko stosu stacków wyjątków, ale pokazywał inne informacje? Czy istnieje sposób, aby to rozwiązać?

+1

Najpierw trzeba ** użyć ** log4j. Oświadczenie połowowe, które pokazujesz a) nie używa log4j; b) nawet niczego nie drukuje. Po prostu wypełnia StringWriter plikiem stacktrace. –

+0

Zmieniłem kod. Moja próbka używa zarówno e.printStackTrace() i logger.debug(). To nie jest napisane przeze mnie. Mój projekt używa tego pliku jar, którego dołączone źródło jest pokazane w ten sposób. – swemon

+1

Co mogę zrobić, to stworzyć PrintStream, aby zastąpić System.err, który zapisuje wszystko, co robi log4j. W ten sposób możesz użyć System.out lub System.err w dowolny sposób i faktycznie używa log4j. ;) –

Odpowiedz

8

Kod

StringWriter stack = new StringWriter(); 
e.printStackTrace(new PrintWriter(stack)); 
logger.debug("Caught exception; decorating with appropriate status template : " + stack.toString()); 

jest tylko przykładem zwykłego niewłaściwym wykorzystaniem API Log4j. Ale jeśli utkniesz, nie będziesz miał nic do roboty poza podniesieniem poziomu logu powyżej debug i pominięcie całej wiadomości.

Może ewentualnie być sposobem na skróconej wszystkie komunikaty dziennika, który będzie nieco złagodzić problem.

+0

Tak. Ponieważ już używaliśmy logger.debug(). Myślę, że nie musimy używać e.printStackTrace (nowy PrintWriter (stos)); Ale źródło już tak zostało użyte. – swemon

+1

Nie sądzę, żebyś wykopał ten kod. Nic tu nie jest zbędne; 'printStackTrace' w twoim przykładzie tak naprawdę nie drukuje ** niczego. Programiści chcieli tylko, aby komunikat stacktrace był dołączony do logu 'debug', gdzie Log4J nie obsługuje' log.debug (msg, exc) '--- i nie bez powodu. –

4

Zastosowanie Rejestrator # błąd

import org.apache.log4j.Logger; 

... 

Logger log = Logger.getLogger(Locomotive.class); 
log.error("your message", exc); 

... 
0
logger.info("Inside add() of Abc class"); 
logger.error("Error occurred while calculation::::"+errorMessage); 
Powiązane problemy