Why is the exception stack trace not logged in?

I tried a simple example from the SLF4J FAQ :

package com.aed.tests.logging; import org.slf4j.LoggerFactory; public class TestLogging { public TestLogging() { // TODO Auto-generated constructor stub } /** * @param args */ public static void main(String[] args) { String s = "Hello world"; try { Integer i = Integer.valueOf(s); } catch(NumberFormatException e) { LoggerFactory.getLogger("simplelogger").error("Failed to format {}", s, e); LoggerFactory.getLogger("simplelogger").error("Without parametrized string", e); } } } 

Here is the result:

 15:33:51,248000000 [SEVERE]simplelogger: Failed to format Hello world 15:33:51,275000000 [SEVERE]simplelogger: Without parametrized string 

I use java.util.logging as a log implementation, with the following logging.properties

 # Properties file which configures the operation of the JDK # logging facility. # The system will look for this config file, first using # a System property specified at startup: # # >java -Djava.util.logging.config.file=myLoggingConfigFilePath # # If this property is not specified, then the config file is # retrieved from its default location at: # # JDK_HOME/jre/lib/logging.properties # Global logging properties. # ------------------------------------------ # The set of handlers to be loaded upon startup. # Comma-separated list of class names. # (? LogManager docs say no comma here, but JDK example has comma.) handlers=java.util.logging.ConsoleHandler # Default global logging level. # Loggers and Handlers may override this level .level=ALL # Loggers # ------------------------------------------ # Loggers are usually attached to packages. # Here, the level for each package is specified. # The global level is used by default, so levels # specified here simply act as an override. # myapp.ui.level=ALL # myapp.business.level=CONFIG # myapp.data.level=SEVERE # Handlers # ----------------------------------------- # --- ConsoleHandler --- # Override of global logging level java.util.logging.ConsoleHandler.level=ALL java.util.logging.ConsoleHandler.formatter=java.util.logging.SimpleFormatter # HH:MM:ss,nanosec java.util.logging.SimpleFormatter.format=%1$tT,%1$tN [%4$s]%3$s: %5$s %n 

I was expecting to see stacktrace exceptions. Am I missing something in the configuration? Should I somehow enable straw restriction tracing with the SLF4J or jdk protocol?

EDIT After "Marked as duplicate." My question was not β€œhow to print the stack trace”, but how does it turn out, using the very example SLF4J, which itself performs the task to print the stack trace, I still did not print the stack trace. As I said, I had a stack trace using log4j as an implementation, but not java.util.logging. So it really was the wrong java.util.logging configuration, and I gave the answer when I found out.

+6
source share
2 answers

It really is a matter of properly formatting the log entries.

As the manual says, throwable is the 6th parameter of the method format. So I added %6$s to my format in logging.properties:

 java.util.logging.SimpleFormatter.format=%1$tT,%1$tN [%4$s]%3$s: %5$s %6$s %n 

And here is the result showing the stack trace:

 17:29:33,314000000 [SEVERE]simplelogger: Failed to format Hello world java.lang.NumberFormatException: For input string: "Hello world" at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65) at java.lang.Integer.parseInt(Integer.java:492) at java.lang.Integer.valueOf(Integer.java:582) at com.aed.tests.logging.TestLogging.main(TestLogging.java:15) 17:29:33,344000000 [SEVERE]simplelogger: Without parametrized string java.lang.NumberFormatException: For input string: "Hello world" at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65) at java.lang.Integer.parseInt(Integer.java:492) at java.lang.Integer.valueOf(Integer.java:582) at com.aed.tests.logging.TestLogging.main(TestLogging.java:15) 
+7
source

java.lang.Exception.toString() does not return stack trace information. From the documentation :

Returns a brief description of this throw.

see How to convert stack trace to string? and register String , which you will return.

+1
source

All Articles