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

时间:2017-01-11 12:31:11

标签: java intellij-idea javafx slf4j

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

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

我正在使用:

  • SLF4J-API-1.7.22.jar
  • SLF4J-简单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无效。我已经尝试了道具中的所有属性。文件和更多文件,但到目前为止没有设法捕获任何异常或应用特定格式。

问题2:

如您所见,该异常也未被记录。

附加信息:我已经重置IntelliJ设置,我已经多次清理win%temp%文件夹,我一直在清理缓存并重启Intellij各种时间;所有这一切都在尝试如果道具。文件未正确读取或保存在缓存中。

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

3 个答案:

答案 0 :(得分:3)

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

  • SLF4J-API-1.7.22.jar
  • SLF4J-简单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自动选取。 SimpleLogger类的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 :(得分:1)

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

来自SimpleLogger的文件:

  

org.slf4j.simpleLogger.defaultLogLevel - 所有人的默认日志级别   SimpleLogger的实例。必须是(" trace"," debug"," info",   "警告","错误"或者"关闭")。 如果未指定,则默认为"信息"。

因为defult级别是信息,跟踪和调试级别是""信息,他们将被记录器过滤掉,不会到达追加者。

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

org.slf4j.simpleLogger.defaultLogLevel = trace

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

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

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

答案 2 :(得分:0)

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

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

,它可以正常记录。 这可能不是最好的解决方案,但是我发现它可以满足我的需求。您可以登录DEBUG,但不能登录TRACE,因为我记得我在某处阅读过。