Почему трассировка стека исключений не зарегистрирована?

Я попробовал простой пример из 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);

        }
    }
}

Вот вывод:

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

Я использую java.util.logging в качестве реализации регистрации, со следующими 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

Я ожидал увидеть трассировку стека исключения. Я что-то упустил в конфигурации? Должен ли я как-нибудь включить трассировку исключений, используя SLF4J или jdk?

РЕДАКТИРОВАТЬ После "Помечено как дубликат". Мой вопрос был не "как напечатать трассировку стека", а как получилось, используя сам пример SLF4J, который сам выполняет работу по распечатке трассировки стека, у меня все еще не было распечатано трассировки стека. Как я уже сказал, у меня была распечатана трассировка стека с использованием log4j в качестве реализации, но не java.util.logging. Так что это действительно была проблема неправильной конфигурации java.util.logging, и я дал ответ, когда узнал.

2 ответа

Решение

Это был действительно вопрос правильной настройки форматера для записей журнала.

Как говорится в руководстве, метод throwable является шестым параметром формата метода. Итак, я добавил %6$s в мой формат в logging.properties:

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

И вот вывод, показывающий трассировку стека:

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)

java.lang.Exception.toString() не возвращает информацию трассировки стека. Из документации:

Возвращает краткое описание этого броска

см. Как я могу преобразовать трассировку стека в строку? и войдите String ты вернешься.

Другие вопросы по тегам