我正在尝试向我的一个程序中添加一个记录器,主要是为了替换 System.out.println()
,它似乎给我带来了一些问题。
这是我第一次使用记录器,所以我是个菜鸟。
过去几天我查看了很多链接,但仍然没有设法让我的记录器捕捉到异常;以下是我查看的一些链接(其中一些已有 5 年历史,可能需要更新):
- oracle simple formatter
- slf4j - interface logger
- slf4j - simple logger
- slf4j - faq
- slf4j - message formatter
- stackoverflow 1
- stackoverflow 2
我正在使用:
- 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:
如您所见,trace
和 debug
不工作。我已经尝试了 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/