How to log exceptions in Java?
exception, java, logging, methods, stack-trace
Solution
The `java.util.logging` package is standard in Java SE. Its `Logger` includes an overloaded log method that accepts `Throwable` objects. It will log stacktraces of exceptions and their cause for you.
For example:
import java.util.logging.Level;
import java.util.logging.Logger;
[...]
Logger logger = Logger.getAnonymousLogger();
Exception e1 = new Exception();
Exception e2 = new Exception(e1);
logger.log(Level.SEVERE, "an exception was thrown", e2);
Will log:
SEVERE: an exception was thrown
java.lang.Exception: java.lang.Exception
at LogStacktrace.main(LogStacktrace.java:21)
Caused by: java.lang.Exception
at LogStacktrace.main(LogStacktrace.java:20)
Internally, this does exactly what @philipp-wendler suggests, by the way. See the source code for `SimpleFormatter.java`. This is just a higher level interface.
Problem
There's a common problem I've come across a few times when logging exceptions in Java. There seem to be various different types to deal with. E.g. some wrap other exceptions and some don't have a message at all - only a type. Most code I've seen logs an exception by using either `getMessage()` or `toString()`. But these methods don't always capture all the information needed to pinpoint the problem - other methods such as `getCause()` and `getStackTrace()` sometimes provide additional info. For example, the exception I'm looking at right now in my Eclipse Inspect window is an `InvocationTargetException`. The exception itself has no cause, no message, no stacktrace ... but the target from getCause() is `InvalidUseOfMatchersException`, with these details populated. So my question is: Given an exception of any type as an input, please provide a single method that will output a nicely formatted string containing all relevant information about the Exception (e.g. possibly recursively calling `getCause()` amongst other things?) Before posting, I was nearly going to have a stab at it myself but really don't want to reinvent the wheel - surely such a thing must have been done many times before...?