SLF4J:SimpleLogger 不记录跟踪和调试,也不记录异常
SLF4J: SimpleLogger is not logging trace and debug and also not logging exceptions
我正在尝试将记录器添加到我的一个程序中,主要是为了替换 System.out.println()
,它似乎给我带来了一些问题。
这是我第一次使用记录器,所以我是菜鸟。
过去几天我查看了很多链接,但仍然没有设法让我的记录器捕捉到异常;这是我查看的一些链接(其中一些已有 5 年历史,可能需要更新):
- oracle simple formatter
- slf4j - interface logger
- slf4j - simple logger
- slf4j - faq
- slf4j - message formatter
- Whosebug 1
- Whosebug 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
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)
...
问题一:
如您所见,trace
和 debug
不工作。我已经尝试了道具中的所有属性。文件和其他一些文件,但到目前为止还没有设法捕获任何异常或应用特定格式。
问题二:
如您所见,也根本没有记录异常。
附加信息:我已经重置了 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(错误跟踪记录不正确)
你正在捕获 IOException
s,但实际上抛出了一个 InvocationTargetException
(没有被捕获),因此执行永远不会进入你的 catch 块。您在控制台上看到的是打印出未处理的运行时异常。
如 here 所述,可以针对一个安装为每个用户配置 Maven 日志记录。
我将默认 simplelogger.properties 复制到 $M2_HOME/conf/logging 并添加:
org.slf4j.simpleLogger.log.com.example=trace
并且记录正常。
这可能不是最好的解决方案,但我发现它符合我的需要。您可以记录 DEBUG 但不能记录 TRACE,因为我记得我在某处读过。
我正在尝试将记录器添加到我的一个程序中,主要是为了替换 System.out.println()
,它似乎给我带来了一些问题。
这是我第一次使用记录器,所以我是菜鸟。
过去几天我查看了很多链接,但仍然没有设法让我的记录器捕捉到异常;这是我查看的一些链接(其中一些已有 5 年历史,可能需要更新):
- oracle simple formatter
- slf4j - interface logger
- slf4j - simple logger
- slf4j - faq
- slf4j - message formatter
- Whosebug 1
- Whosebug 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
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)
...
问题一:
如您所见,trace
和 debug
不工作。我已经尝试了道具中的所有属性。文件和其他一些文件,但到目前为止还没有设法捕获任何异常或应用特定格式。
问题二:
如您所见,也根本没有记录异常。
附加信息:我已经重置了 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(错误跟踪记录不正确)
你正在捕获 IOException
s,但实际上抛出了一个 InvocationTargetException
(没有被捕获),因此执行永远不会进入你的 catch 块。您在控制台上看到的是打印出未处理的运行时异常。
如 here 所述,可以针对一个安装为每个用户配置 Maven 日志记录。 我将默认 simplelogger.properties 复制到 $M2_HOME/conf/logging 并添加:
org.slf4j.simpleLogger.log.com.example=trace
并且记录正常。 这可能不是最好的解决方案,但我发现它符合我的需要。您可以记录 DEBUG 但不能记录 TRACE,因为我记得我在某处读过。