slf4j.Logger 不显示值
slf4j.Logger does not show value
为什么没有出现值 12?
代码:
logger.info("height", 12);
堆栈跟踪:
13:41:29.022 [JavaFX Application Thread] INFO com.math.pro.ak.fragment.dashboard.LoginController - height
logback.xml
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<layout class="ch.qos.logback.classic.PatternLayout">
<Pattern>
%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n
</Pattern>
</layout>
</appender>
<logger name="com.math.pro.ak" level="debug"
additivity="false">
<appender-ref ref="STDOUT" />
</logger>
<root level="error">
<appender-ref ref="STDOUT" />
</root>
</configuration>
也许您打算使用 parameterized logging:
logger.info("height: {}", 12);
或者您可以只传入一个参数(尽管如链接文档所述,使用参数化消息可以执行得更好):
logger.info("height: " + 12);
正如我在评论中提到的,您没有正确调用 logger.info()
。 Logger.java
是 slf4j
中的接口,如果您注意到 info
方法有重载方法。
Refer Logger interface info methods。
来自Logger.java
界面。当您调用 logger.info("height " + 12);
时,将调用采用 String
的以下方法。
/**
* Log a message at the INFO level.
*
* @param msg the message string to be logged
*/
public void info(String msg);
并且当您在下方调用 logger.info("height {}", 12);
时,重载 方法将被调用。
/**
* Log a message at the INFO level according to the specified format
* and argument.
* <p/>
* <p>This form avoids superfluous object creation when the logger
* is disabled for the INFO level. </p>
*
* @param format the format string
* @param arg the argument
*/
public void info(String format, Object arg);
重要 :- 您应该始终使用第二种方法 info(String format, Object arg)
,如方法 的 javadoc 注释中所述,这种形式避免了多余的对象创建当 INFO 级别 禁用记录器时(在创建对象之前,它会在内部检查给定的日志级别是否已启用)。因此,当禁用 INFO 级别时,您将同时保存 cpu 和内存,但在第一种方法的情况下,无论记录器级别如何,都会始终创建方法中给定的 String 。
以上优化在您使用 logger.debug()
时特别有用。大多数情况下,您的应用程序将 运行 处于 INFO 级别,您不必明确检查 if (logger.isDebugEnabled()) {
条件,以保存 cpu 和内存。
为什么没有出现值 12?
代码:
logger.info("height", 12);
堆栈跟踪:
13:41:29.022 [JavaFX Application Thread] INFO com.math.pro.ak.fragment.dashboard.LoginController - height
logback.xml
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<layout class="ch.qos.logback.classic.PatternLayout">
<Pattern>
%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n
</Pattern>
</layout>
</appender>
<logger name="com.math.pro.ak" level="debug"
additivity="false">
<appender-ref ref="STDOUT" />
</logger>
<root level="error">
<appender-ref ref="STDOUT" />
</root>
</configuration>
也许您打算使用 parameterized logging:
logger.info("height: {}", 12);
或者您可以只传入一个参数(尽管如链接文档所述,使用参数化消息可以执行得更好):
logger.info("height: " + 12);
正如我在评论中提到的,您没有正确调用 logger.info()
。 Logger.java
是 slf4j
中的接口,如果您注意到 info
方法有重载方法。
Refer Logger interface info methods。
来自Logger.java
界面。当您调用 logger.info("height " + 12);
时,将调用采用 String
的以下方法。
/**
* Log a message at the INFO level.
*
* @param msg the message string to be logged
*/
public void info(String msg);
并且当您在下方调用 logger.info("height {}", 12);
时,重载 方法将被调用。
/**
* Log a message at the INFO level according to the specified format
* and argument.
* <p/>
* <p>This form avoids superfluous object creation when the logger
* is disabled for the INFO level. </p>
*
* @param format the format string
* @param arg the argument
*/
public void info(String format, Object arg);
重要 :- 您应该始终使用第二种方法 info(String format, Object arg)
,如方法 的 javadoc 注释中所述,这种形式避免了多余的对象创建当 INFO 级别 禁用记录器时(在创建对象之前,它会在内部检查给定的日志级别是否已启用)。因此,当禁用 INFO 级别时,您将同时保存 cpu 和内存,但在第一种方法的情况下,无论记录器级别如何,都会始终创建方法中给定的 String 。
以上优化在您使用 logger.debug()
时特别有用。大多数情况下,您的应用程序将 运行 处于 INFO 级别,您不必明确检查 if (logger.isDebugEnabled()) {
条件,以保存 cpu 和内存。