使用 jdk 进行 slf4j 日志记录 – 如何启用调试?

Posted

技术标签:

【中文标题】使用 jdk 进行 slf4j 日志记录 – 如何启用调试?【英文标题】:slf4j logging with jdk – how to enable debug? 【发布时间】:2011-05-15 18:34:02 【问题描述】:

默认情况下 slf4j,与 jdk (slf4j-jdk14-1.6.1.jar) 一起使用时,不会记录调试消息。 如何启用它们?

我在官方文档、网络或此处都找不到有关如何启用它的信息。

我找到了一些关于(虽然失败了)在 %JDK_HOME%/lib 中创建文件并在配置文件中定义级别的信息。 但是,我想在编译/运行时定义级别,这样我就可以在我的 IDE 中使用不同的日志记录级别运行和调试我的应用程序。

有没有我可以设置的环境变量,或者VM arg?

【问题讨论】:

【参考方案1】:

您可以将-Dorg.slf4j.simpleLogger.defaultLogLevel=debug 添加到虚拟机选项中。

【讨论】:

【参考方案2】:

如果你使用的是 lombok Slf4j

 package com.space.slf4j;

    import lombok.extern.slf4j.Slf4j;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;

    /**
     * @author anson
     * @date 2019/6/18 16:17
     */
    @Slf4j
    @RestController
    public class TestController 

        @RequestMapping("/log")
        public String testLog()
            log.info("#########  info  #########");
            log.debug("#########  debug  #########");
            log.error("#########  error  #########");
            return null;
        
    

application.yml

logging:
   level:
      root: debug

【讨论】:

【参考方案3】:

你认为它为什么不记录 DEBUG 消息?

如果您的意思是您的 log.debug(String) 日志调用不会在 java.util.logging 日志文件中结束,那么我想您必须配置 logging.properties 配置文件以允许在 FINE 级别记录消息。

如果您不想弄乱全局%JRE_HOME%/lib/logging.properties,那么您可以在命令行中传入-Djava.util.logging.config.file=logging.properties - 这将强制日志系统在当前目录中查找该配置文件。

或者使用其他(编程)方式来配置java.util.logging,教程见下文。

这与配置 SLF4J 无关;事实上,SLF4J 没有任何配置,一切都是配置,只是简单地交换 JAR 文件。


供您参考:

JDK14LoggerAdapter Java Logging API tutorial

【讨论】:

我希望调试消息显示在我的控制台(stdout / stderr)中。在这里使用日食。另外,如问题中所述,我更愿意在编译或运行时设置它,而不是适用于所有项目和所有运行配置的静态文件。这可能吗? 你试过 -Djava.util.logging.config.file=logging.properties 吗? 好的,我试试。谢谢。 (总比没有好,尽管我仍然更喜欢 var-/par-/env-setting 而不是使用文件。) 好吧,您可以为所有项目创建一个配置文件,然后将 -Djava.util.logging.config.file 设置指向该文件。这样您就可以避免为每个项目创建单独的文件。而且,如果您不想在命令行上指定任何内容,我想您可以定义一个名为“java.util.logging.config.file”的环境变量 - 如果我没记错的话,JRE 会像导入所有环境变量一样导入在命令行中指定。 嘿 Naeeme,请注意,您的“Java Logging API 及其使用方法”链接已失效【参考方案4】:

我只是将我的 logging.properties 文件放在我的应用程序 WEB-INF/classes 文件中(或者如果你没有在战争中部署,则使用由 Neeme Praks 标识的命令行参数),并在 eclipse 中打开属性文件所以我可以对其进行微调以记录包并在我感兴趣的级别。

在 logging.properties 文件中,您需要确保记录器级别和处理程序级别都设置为您想要的级别。例如,如果您希望输出到控制台,您至少需要具备以下条件:

#logging.properties file contents

#Define handlers
handlers=java.util.logging.ConsoleHandler

#Set handler log level
java.util.logging.ConsoleHandler.level=FINE

#Define your logger level
com.company.application.package.package.level=FINE

#Assign your handler to your logger
com.company.application.package.package.handlers=java.util.logging.ConsoleHandler

你提到了slf4j-jdk14-1.6.1.jar。这提供了与 java.util.logging 的 slf4j 绑定。您需要在类路径中包含它,但请确保您的类路径中也包含 slf4j api (slf4j-api-1.7.12.jar)。

我发现the example logging.properties file in this link 可用于创建各种记录器和处理程序,让您可以细粒度地控制哪些日志进入控制台以及哪些日志进入文件:。

还有here's the slf4j manual。

【讨论】:

为此加一个!没有意识到我必须为处理程序和记录器设置级别。【参考方案5】:

If you are using slf4j SimpleLogger implementation read this.

在那里您可以看到simpleLogger 使用INFO 作为默认日志级别。您可以使用系统属性对其进行更改。这对于非生产环境很有用:

static 

    System.setProperty("org.slf4j.simpleLogger.defaultLogLevel", "trace");

【讨论】:

请确保在logger = LoggerFactory.getLogger(MyClass.class);之前调用它

以上是关于使用 jdk 进行 slf4j 日志记录 – 如何启用调试?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Hibernate 4 中配置日志记录以使用 SLF4J

Java日志体系 —— 日志框架切换

org.slf4j.logger 日志记录到哪里

slf4j-jdk14 从哪里获取日志记录配置?

Kotlin 使用 slf4j 进行日志记录的最佳方式

使用 jboss/wildfly 10 进行 SLF4J 日志记录