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

标签 java intellij-idea javafx slf4j

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

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

我正在使用:

  • slf4j-api-1.7.22.jar
  • slf4j-simple-1.7.22.jar
  • jdk1.8.0_71
  • IntelliJ 2016.3.2

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

Main 类的一部分:

...
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"

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

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)
...

问题 1:

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

问题 2:

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

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

非常感谢任何帮助。请用简单的方式回答。

最佳答案

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

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

这是一个示例 Application 类:

...

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 添加到类路径来配置记录器,这将在应用程序启动时由 Slf4j 自动获取。 javadoc SimpleLogger 类很好地列出了所有可能配置的属性。

仅修改日志级别的 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...

关于java - SLF4J:SimpleLogger 不记录跟踪和调试,也不记录异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41591057/

相关文章:

java - 代码帮助 - 使用扫描仪初始化字符串数组。显示时数组值全部为空

java - 菜鸟问题 - 我可以编写一个脚本来为我们的内部云软件执行操作吗?

java - android studio/intellij中自定义 "Group by methods defining type"的定义

JavaFX:FXML 字段可以是私有(private)的吗?

javafx - 如何在JavaFX中为TextArea设置圆角?

java - Android - 如何在 android 中将字符串转换为 utf-8

java - Java webapp 中请求的异步处理

android - 带有 SBT : ANDROID_HOME not found 的 IntelliJ IDEA

debugging - 如何使用 IntelliJ 从 jars(非 JDK)进入代码?

css - 如何将 CSS 文档放入 Netbeans