# stackTrace mit log4j loggen



## jollyroger (12. Okt 2006)

Hi zusammen, 

wie kann ich denn den stacktrace imt log4j mitloggen?

Ich hab beispielsweise folgenden Code:


```
try {

} catch (IOException e) {
					processConvLogger.debug("IOException in TrcsProcessConv:");
					processConvLogger.debug(e.getMessage());
					e.printStackTrace();
				}
```

Wie krieg ich den Stacktrace nun mitgeloggt?

Da printStackTrace() void zurückgibt und direkt auf stdout schreibt kann ich den Stacktrace dem Logger nicht übergeben. 

In der Api-Doc zu printStackTrace steht nur das ich der Funktion einen printstream übergeben kann, das hilft mir auch nicht wirklich weiter.....

Danke für alle Tips!


----------



## AlArenal (12. Okt 2006)

logger.error("bla", e)

Error macht hier mehr Sinn, weil es eine Exception ist und damit ein Fehler und nicht bloß irgendeine Ausgabe die du als Debug.Info loggen willst.


----------



## jollyroger (12. Okt 2006)

Argh, 

ich Depp, ich hab in der log4j docu übersehen das ich error(), bzw. debug() ja auch ein throwable übergeben kann.

Danke für den Hinweis!


----------



## Gast (12. Okt 2006)

naja das wär aber nicht die perfekte lösung, da du so nur das event übergibst.

hier ne kleine methode:


```
/**
	 * This Methods prints the StackTrace of an Exception 
	 * @param Exception e
	 * @return StackTrace String
	 */
		static public String stack2string(Exception e) {
			try {
				StringWriter sw = new StringWriter();
				PrintWriter pw = new PrintWriter(sw);
				e.printStackTrace(pw);
				return "StackTrace: \r\n" + sw.toString() + "\r\n";
			} catch (Exception e2) {
				return "bad stack2string";
			}
		}
```

benutzen kannste die ganz einfach

logger.error(stack2string(e));


----------



## AlArenal (12. Okt 2006)

Ist das aus der Kategorie "Warum einfach, wenns auch kompliziert geht?"?


----------



## jollyroger (12. Okt 2006)

Ähm, 

wie würde es denn einfacher gehen?


----------



## SamHotte (12. Okt 2006)

```
StackTraceElement[] traceElements = exception.getStackTrace();
for (int i = 0, n = traceElements.length; i < n; i++) {
    StackTraceElement element = traceElements[i];
    logger.error(element.toString());
}
```


----------



## AlArenal (12. Okt 2006)

Wenn du das Throwable loggst, hast du doch deinen Stacktrace im Log.


----------



## byte (12. Okt 2006)

Ich würde das noch folgendermaßen erweitern:


```
logger.error(String.indexOf(0, element.toString().length() - 1));
```

Ne mal im Ernst...  Warum so kompliziert und nicht einfach so wie AlArenal schon sagte? *g*


----------



## SamHotte (12. Okt 2006)

@byto: hast ja recht, kannte diesen Teil der Log4j-API nicht


----------

