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.javaslf4j 中的接口,如果您注意到 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 和内存。