我正在尝试将一个记录器添加到我的一个程序中,主要是为了替换System.out.println()
,它似乎给了我一些问题。
这是我第一次使用记录器,所以我就是一个菜鸟。
过去几天我看了很多链接,但仍然没有设法使我的记录器捕获异常;这里是我看到的一些链接(其中一些是5年,可能需要更新):
我正在使用:
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
无效。我已经尝试了道具中的所有属性。文件和更多文件,但到目前为止没有设法捕获任何异常或应用特定格式。
问题2:
如您所见,该异常也未被记录。
附加信息:我已经重置IntelliJ设置,我已经多次清理win%temp%文件夹,我一直在清理缓存并重启Intellij各种时间;所有这一切都在尝试如果道具。文件未正确读取或保存在缓存中。
非常感谢任何帮助。请以简单的方式回复。
答案 0 :(得分:3)
我们可以通过仅使用这些依赖项来在JavaFX项目中使用Slf4j:
以下是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,因为我记得我在某处阅读过。