SLF4J:SimpleLogger 不记录跟踪和调试,也不记录异常

SLF4J: SimpleLogger is not logging trace and debug and also not logging exceptions

我正在尝试将记录器添加到我的一个程序中,主要是为了替换 System.out.println(),它似乎给我带来了一些问题。 这是我第一次使用记录器,所以我是菜鸟。

过去几天我查看了很多链接,但仍然没有设法让我的记录器捕捉到异常;这是我查看的一些链接(其中一些已有 5 年历史,可能需要更新):

我正在使用:

simpleLogger.properties 直接放在 resources 包中,此文件在创建记录器之前加载,文件已正确加载,因为我可以根据需要修改日期时间是(其他设置也有效)。

部分 Main class:

...
private Logger LOG; //field
...

public static void main(String[] args) {
    launch(args);
}

...

@Override
public void start(Stage primaryStage) {
    /*Create logger*/
    createLogger();
    LOG.info("Stage start.");
    ...
}

...

private void createLogger() {
    try {
        Properties properties = new Properties();
        properties.load(LOGGER_PROPERTIES); //path to prop file
    } catch (IOException e) {
        e.printStackTrace();
    }

    LOG = LoggerFactory.getLogger(Main.class);
    LOG.info("Logger initialised.");

    LOG.trace("test trace"); //not working
    LOG.debug("test debug"); //not working
    LOG.info("test info");
    LOG.warn("test warning");
    LOG.error("test error");
}

simpleLogger.properties 文件:

org.slf4j.simpleLogger.logFile=System.out
# org.slf4j.simpleLogger.defaultLogLevel=
# org.slf4j.simpleLogger.log.a.b.c=
org.slf4j.simpleLogger.showDateTime=true
org.slf4j.simpleLogger.dateTimeFormat=HH:mm:ss:SSS
org.slf4j.simpleLogger.showThreadName=false
org.slf4j.simpleLogger.showLogName=false
org.slf4j.simpleLogger.showShortLogName=true
org.slf4j.simpleLogger.levelInBrackets=true
# org.slf4j.simpleLogger.warnLevelString=

# THE FORMAT TRIED
#org.slf4j.simpleLogger.SimpleFormatter.format = [%1$tc] %4$s: %2$s - %5$s %6$s%n
#java.util.logging.SimpleFormatter.format = [%1$tc] %4$s: %2$s - %5$s %6$s%n
#java.util.logging.SimpleFormatter.format="%1$tc %2$s%n%4$s: %5$s%6$s%n"
#org.slf4j.simpleLogger.format=[%1$tc] %4$s: %2$s - %5$s %6$s%n %7$s
#org.slf4j.helpers.MessageFormatter.format = [%1$tc] %4$s: %2$s - %5$s %6$s%n %7$s
#java.util.logging.SimpleFormatter.format="%1$tc %2$s%n%4$s: %5$s%6$s%n"

我试图创建异常的 class 的一部分:

LOG.info("Creating window - More info: loading.. .fxml");
try {
    BP_INFO = FXMLLoader.load(getClass().getResource("/fxml/ImageInf_.fxml")); //HERE change back to ImageInfo.fxml
    LOG.info("Creating window - More info: loaded .fxml successfully.");
} catch (IOException e) {
    //  HERE not showing anything below
    System.out.println("CATCH - From Sys out");
    LOG.error("CATCH - EXCEPTION", (Throwable) e);
    LOG.error("Creating window - More info: Exception");
    LOG.error("Creating window - More info: Exception", e);        
    LOG.error("Creating window - More info: Exception {}", e);
    LOG.error("Creating window - More info: Exception {} {} {}", Level.INFO, e.getMessage(), e);
    //  e.printStackTrace();
}

控制台输出:

12:17:08:995 [INFO] Main - Logger initialised.
12:17:08:996 [INFO] Main - test info
12:17:08:997 [WARN] Main - test warning
12:17:08:997 [ERROR] Main - test error
12:17:08:997 [INFO] Main - Stage start.
...
12:17:27:140 [INFO] View - Creating window - More info: loading.. .fxml
Exception in thread "JavaFX Application Thread" java.lang.RuntimeException: java.lang.reflect.InvocationTargetException
    at javafx.fxml.FXMLLoader$MethodHandler.invoke(FXMLLoader.java:1774)
    at javafx.fxml.FXMLLoader$ControllerMethodEventHandler.handle(FXMLLoader.java:1657)
...

问题一:

如您所见,tracedebug 不工作。我已经尝试了道具中的所有属性。文件和其他一些文件,但到目前为止还没有设法捕获任何异常或应用特定格式。

问题二:

如您所见,也根本没有记录异常。

附加信息:我已经重置了 IntelliJ 设置,我已经多次清理 win %temp% 文件夹,我已经多次清理缓存并重新启动 Intellij;所有这一切都是为了尝试如果道具。文件未正确读取或保存在缓存中的某个位置。

非常感谢任何帮助。请简单回答。

我们可以通过仅使用这些依赖项在 JavaFX 项目中使用 Slf4j:

  • slf4j-api-1.7.22.jar
  • slf4j-simple-1.7.22.jar

这是一个例子Application class:

...

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class Todo extends Application {

    private static final Logger log = LoggerFactory.getLogger(Todo.class);

    ...

    public static void main(String[] args) {

        log.info("launching...");
        log.warn("launching...");
        log.error("launching...");
        log.debug("launching...");
        log.trace("launching...");

        launch(args);
    }
}

Slf4j simple 已经有了默认设置,可能适用于各种场景。事实并非如此,可以通过将 simplelogger.properties 添加到 class 路径来配置记录器,这将在应用程序启动时由 Slf4j 自动获取。 SimpleLogger class 的 javadoc 很好地列出了所有可能配置的属性。

仅修改日志级别的 simplelogger.properties 文件的内容:

org.slf4j.simpleLogger.defaultLogLevel=trace

下面是 运行 日志级别设置为 trace 时的输出:

[main] INFO todo.Todo - launching... 
[main] WARN todo.Todo - launching... 
[main] ERROR todo.Todo - launching... 
[main] DEBUG todo.Todo - launching... 
[main] TRACE todo.Todo - launching...

问题 #1(未记录跟踪和调试级别)

来自 SimpleLogger 的文档:

org.slf4j.simpleLogger.defaultLogLevel - Default log level for all instances of SimpleLogger. Must be one of ("trace", "debug", "info", "warn", "error" or "off"). If not specified, defaults to "info".

因为默认级别是info,trace和debug级别是"under"info,它们会被logger过滤掉,不会到达appender。

因此,如果您在属性文件中添加以下行:

org.slf4j.simpleLogger.defaultLogLevel = trace

您应该还会看到带有跟踪和调试级别的消息。

问题 #2(错误跟踪记录不正确)

你正在捕获 IOExceptions,但实际上抛出了一个 InvocationTargetException(没有被捕获),因此执行永远不会进入你的 catch 块。您在控制台上看到的是打印出未处理的运行时异常。

here 所述,可以针对一个安装为每个用户配置 Maven 日志记录。 我将默认 simplelogger.properties 复制到 $M2_HOME/conf/logging 并添加:

org.slf4j.simpleLogger.log.com.example=trace

并且记录正常。 这可能不是最好的解决方案,但我发现它符合我的需要。您可以记录 DEBUG 但不能记录 TRACE,因为我记得我在某处读过。