13

Is there a Logger that will easily log my stacktrace (what I get with ex.printStackTrace())? I've searched the log4j docs and found nothing about logging the stacktrace.

I can do this myself with

StringWriter sw = new StringWriter();
ex.printStackTrace(new PrintWriter(sw));
String stacktrace = sw.toString();
logger.error(stacktrace);

but I don't want to duplicate this code all over the place.

If log4j won't do this for me is there another logging package that will log the stacktrace for me?

Thanks.

Bozho
  • 572,413
  • 138
  • 1,043
  • 1,132
Amit
  • 32,630
  • 90
  • 219
  • 295

2 Answers2

32

Using log4j this is done with:

logger.error("An error occurred", exception);

The first argument is a message to be displayed, the second is the exception (throwable) whose stacktrace is logged.

Another option is commons-logging, where it's the same:

log.error("Message", exception);

With java.util.logging this can be done via:

logger.log(Level.SEVERE, "Message", exception);
Bozho
  • 572,413
  • 138
  • 1,043
  • 1,132
3

In java.util.logging you can initialize the logger with custom log formatter like here:

private Logger initTextLogger() throws SecurityException, IOException {
        Logger logger = Logger.getLogger(YourClass.class.getName());
        FileHandler fileHandler = new FileHandler(logFilePath, false);
        SimpleFormatter logFormatter = new SimpleFormatter() {
            @Override
            public String format(LogRecord record) {
            String stacktrace = "";
            Throwable t = record.getThrown();
            if(t!=null){
                StringWriter sw = new StringWriter();
                t.printStackTrace(new PrintWriter(sw));
                stacktrace = sw.toString();
            }               
            return record.getLevel() + ": " + record.getMessage() + "\r\n"
                    + stacktrace;
        }
        };
        fileHandler.setFormatter(logFormatter);
        logger.addHandler(fileHandler);

        return logger;
    }
Aram Paronikyan
  • 1,560
  • 17
  • 21