# log4j - Behandlung nicht explizit abgefangener Exceptions



## globolus (2. Aug 2010)

Hallo zusammen,

ich habe mal eine Frage bzgl. log4j und nicht abgefangenen Exceptions.

Besteht die Möglichkeit log4j so zu konfigurieren, dass nicht explizit abgefangene Exceptions ebenfalls von log4j an einen Appender weitergereicht werden?

Fallbeispiel:
In einem catch-Block wurde die explizite Behandlung vergessen und lediglich ein e.printStackTrace() eingetragen. Wird nun die Applikation nicht von einer Konsole aus gestartet, bekommt man ja unter Umständen gar nicht mit, dass Fehler aufgetreten sind?


----------



## maki (2. Aug 2010)

Log4J kümmert sich nicht um Exceptions, sondern nur darum, was explizit geloggt wird.

Ein Mittel gegen "vergessen sauberen Code zu schreiben" suchen viele Leute


----------



## Gast2 (2. Aug 2010)

Du könntest alles was auf dem System.out landet mitloggen. Dazu müsstest du einfach nur dem Stream umlenken auf einen eigenen appender.


----------



## globolus (2. Aug 2010)

Vielen Dank für Eure Hinweise!



> Ein Mittel gegen "vergessen sauberen Code zu schreiben" suchen viele Leute



Und richtig kompliziert wird es dann, wenn man selber nicht der "Urheber" ist ;-)

Werde das mit der Umlenkung von System.out auf jeden Fall mal ausprobieren.


----------



## hemeroc (2. Aug 2010)

Du kannst sowohl den 
	
	
	
	





```
System.out
```
 als auch den 
	
	
	
	





```
System.err
```
 umleiten.
Am einfachen geht das wohl mit:

```
System.setOut(PrintStream out);
System.setErr(PrintStream err);
```
Außerdem kannst du alle nicht gefangenen Exceptions mittels eines globalen Exception Handlers fangen und loggen:

```
Thread.setDefaultUncaughtExceptionHandler(Thread.UncaughtExceptionHandler eh);
```
Den kompletten Stack Trace kannst du dann direkt über einen 
	
	
	
	





```
PrintWriter
```
 auf den Stream schreiben oder in einen String umwandeln mittels:

```
StringWriter stringWriter = new StringWriter();
exception.printStackTrace(new PrintWriter(stringWriter));
stringWriter.toString();
```
LG Hemeroc


----------



## globolus (5. Aug 2010)

Danke,

die Hinweise mit dem System.out und dem System.err waren sehr hilfreich.

Durch folgende Methode:


```
public static PrintStream errorToLog4J (final PrintStream realPrintStream) {
        return new PrintStream(realPrintStream) {
            public void print(final String string) {
                realPrintStream.print(string);
                logger.info(string);
            }
        };
    }
```

und das setzen von System.out bzw. System.err in meiner main:


```
// set console output to log4j
System.setOut(errorToLog4J(System.out));
System.setErr(errorToLog4J(System.err));
```

konnte ich nun genau das realisieren, was ich brauchte.
(siehe auch: log4j redirect stdout to DailyRollingFileAppender - Stack Overflow)


----------

