Spring Boot:如何使用 application.properties 设置日志记录级别?

Posted

技术标签:

【中文标题】Spring Boot:如何使用 application.properties 设置日志记录级别?【英文标题】:Spring Boot: How can I set the logging level with application.properties? 【发布时间】:2013-12-27 09:56:49 【问题描述】:

这是一个非常简单的问题,但我找不到信息。 (可能是我对 Java 框架的了解严重不足)

如何使用 application.properties 设置日志记录级别? 以及日志文件位置等?

【问题讨论】:

作为记录,另一个选项是将日志级别设置为环境变量,例如通过 heroku 仪表板。在Settings -> Config Vars 中将logging.level.com.yourpackage 设置为所需的级别(INFO、ERROR、DEBUG)。 @LukeSolar 我喜欢这个主意。您能否解释一下如何读取环境变量的值并将其设置在application.properties 下,以便从开发环境到测试(或生产)环境有所不同?或者只是将我们重定向到一个链接或其他东西。我会很感激的。 嗨@KareemJeiroudi - 无需手动读取值;您可以在属性文件中使用模式logging.level.my.package.name=DEBUG 或使用键“logging.level.my.package.name”和值“DEBUG”在 heroku 中定义变量,这应该为定义的包设置日志级别。 【参考方案1】:

更新:从 Spring Boot v1.2.0.RELEASE 开始,application.propertiesapplication.yml 中的设置适用。请参阅参考指南的Log Levels section。

logging.level.org.springframework.web: DEBUG
logging.level.org.hibernate: ERROR

对于 Spring Boot 的早期版本,您不能。为此,您只需使用日志框架(log4j、logback)的正常配置即可。将适当的配置文件(log4j.xmllogback.xml)添加到 src/main/resources 目录并根据自己的喜好进行配置。

从命令行启动应用程序时,您可以通过指定--debug 来启用调试日志记录。

Spring Boot 还为 logback 提供了一个很好的起点来配置一些默认值、颜色等。base.xml 文件,您可以简单地将其包含在 logback.xml 文件中。 (这也是 Spring Boot 中默认的logback.xml 推荐的。

<include resource="org/springframework/boot/logging/logback/base.xml"/>     

【讨论】:

通常,您可以在命令行上执行的任何操作都可以在外部配置文件中使用。所以我认为 debug=true 会这样做。该标志有点特别,因为日志记录必须很早就初始化,但我认为这会起作用。 顺便说一句,首选的日志系统是 logback,这就是你从 starter poms 默认得到的。所以 logback.xml 是最常用的以细粒度方式配置日志的工具。 --debug 标志只是打开一些选定的 Spring 日志记录通道。 另一个提示,弹簧靴包括一个不错的base.xml。这是一个很好的起点。 (见我的扩展答案)。 @M.Deinum 再次感谢您的精彩提示!现在我可以更改自己代码的日志级别了。 现在看来我们可以了。至于 Spring v4.1.3.RELEASE(使用 Spring Boot v1.2.0.RELEASE),application.propertiesapplication.yml 中的设置确实适用,正如 Richard 所回答的那样(以 := 为模问题---冒号似乎对我有用)。【参考方案2】:

您可以使用您的 application.properties 来做到这一点。

logging.level.=ERROR -> 将根日志记录级别设置为错误 ...logging.level.=DEBUG -> 将根日志记录级别设置为 DEBUGlogging.file=$java.io.tmpdir/myapp.log -> 将绝对日志文件路径设置为 TMPDIR/myapp.log 关于使用配置文件进行日志记录的一组合理的默认 application.properties 将是: 应用程序.properties:

spring.application.name=<your app name here>
logging.level.=ERROR
logging.file=$java.io.tmpdir/$spring.application.name.log

应用程序-dev.properties:

logging.level.=DEBUG
logging.file=

当您在自己喜欢的 IDE 中进行开发时,您只需将 -Dspring.profiles.active=dev 作为 VM 参数添加到应用的运行/调试配置中。

这只会让您在开发过程中登录生产和调试日志时出错,而不会将输出写入日志文件。这将提高开发过程中的性能(并为 SSD 驱动器节省几个小时的运行时间;))。

【讨论】:

分配的“=”符号不起作用。分配是使用“:”作为分隔符完成的。 logging.level.:DEBUG 奇怪,我有这个设置在一个示例项目中工作。 ' '(空格)、'=' 和 ':' 符号被视为分隔符,除非在键中使用分隔符。您确定您的密钥不包含任何空格吗? 可以确认“:”有效但“=”被忽略,编辑:很快谈到,“=”和级别之间有一个空格。现在一切正常。 这在我使用spring-boot 1.4.0 的测试中不起作用:logging.level.=DEBUG 将导致应用程序无法启动,并出现错误:java.lang.ClassCircularityError: java/util/logging/LogRecord 在我看来logging.level. 只是logging.level.root 的一个方便的语法快捷方式,它可能更受欢迎,因为 (1) 不太容易与拼写错误混淆,(2) 可能更明确,并且(3) 使用= 赋值符号,它为配置文件提供了更多的整体一致性。【参考方案3】:

设置root 日志记录级别的正确方法是使用属性logging.level.root。请参阅 documentation,自最初提出此问题以来已更新。

例子:

logging.level.root=WARN

【讨论】:

【参考方案4】:

如果您使用的是 Spring Boot,那么您可以直接 在 application.properties 文件中添加以下属性 来设置日志记录级别, 自定义日志记录模式并将日志存储在外部文件中。

这些是不同的日志记录级别及其从最小值

OFF

# To set logs level as per your need.
logging.level.org.springframework = debug
logging.level.tech.hardik = trace

# To store logs to external file
# Here use strictly forward "/" slash for both Windows, Linux or any other os, otherwise, its won't work.      
logging.file=D:/spring_app_log_file.log

# To customize logging pattern.
logging.pattern.file= "%dyyyy-MM-dd HH:mm:ss - %msg%n"

请通过此链接更生动地自定义您的日志。

https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-logging.html

【讨论】:

我不知道为什么,但是当我把 logging.level.roo=trace 它在工作时,logging.level.tech.hardik = trace 这在我的情况下不起作用【参考方案5】:

假设您的应用程序的包名称为com.company.myproject。然后,您可以在 application.properties 文件中为项目中的类设置日志记录级别,如下所示

logging.level.com.company.myproject = 调试

logging.level.org.springframework.web = DEBUGlogging.level.org.hibernate = DEBUG 将为 Spring 框架 web 和 Hibernate 的类设置日志记录级别。

要设置日志文件位置,请使用

logging.file = /home/ubuntu/myproject.log

【讨论】:

【参考方案6】:

确保 Dave Syer 的提示得到一些喜爱,因为将 debug=true 添加到 application.properties 确实会启用调试日志记录。

【讨论】:

【参考方案7】:

如果你想使用不同的日志框架,例如 log4j,我发现最简单的方法是禁用 spring boots 自己的日志并实现你自己的。这样我就可以在一个文件中配置每个日志级别,log4j.xml(在我的例子中)就是这样。

要实现这一点,您只需将这些行添加到您的 pom.xml:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
    <exclusions>
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-logging</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-log4j</artifactId>
</dependency>

你可能已经有了第一个依赖,只需要另外两个。请注意,此示例仅涵盖 log4j。 就是这样,现在你已经准备好在你的 log4j 配置文件中配置启动日志了!

【讨论】:

这个排除对我有用。我的 REST Api 没有选择我的 log4j 依赖项和 log4j.properties 他们现在也有 spring-boot-starter-log4j2【参考方案8】:

使用 Springboot 2,您可以使用如下环境变量设置根日志记录级别:

logging.level.root=DEBUG

或者您可以像这样为包设置特定的日志记录:

logging.level.my.package.name=TRACE

【讨论】:

对于环境变量配置,你宁愿使用:LOGGING_LEVEL_ROOT=DEBUG,使用驼峰式语法【参考方案9】:

您可以尝试将日志级别设置为 DEBUG,它将在启动应用程序时显示所有内容

logging.level.root=DEBUG

【讨论】:

【参考方案10】:

记录:official documentation,至于 Spring Boot v1.2.0.RELEASE 和 Spring v4.1.3.RELEASE:

如果您需要对日志记录进行的唯一更改是设置各种记录器的级别,那么您可以在 application.properties 中使用“logging.level”前缀进行此操作,例如

logging.level.org.springframework.web: DEBUG logging.level.org.hibernate: ERROR

您还可以使用“logging.file”设置要登录的文件的位置(除了控制台)。

要配置日志系统的更细粒度设置,您需要使用相关 LoggingSystem 支持的本机配置格式。默认情况下,Spring Boot 从系统的默认位置获取本机配置(例如,用于 Logback 的 classpath:logback.xml),但您可以使用“logging.config”属性设置配置文件的位置。

【讨论】:

【参考方案11】:

如果您想设置更多细节,请添加日志配置文件名称“logback.xml”或“logback-spring.xml”。

在您的 application.properties 文件中,输入如下:

logging.config: classpath:logback-spring.xml

在 loback-spring.xml 中,输入如下:

    <?xml version="1.0" encoding="UTF-8"?>
    <configuration>
        <include resource="org/springframework/boot/logging/logback/base.xml"/>

        <appender name="ROOT_APPENDER" class="ch.qos.logback.core.rolling.RollingFileAppender">

            <filter class="ch.qos.logback.classic.filter.LevelFilter">
                <level>INFO</level>
                <onMatch>ACCEPT</onMatch>
                <onMismatch>DENY</onMismatch>
            </filter>

            <file>sys.log</file>

            <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">


                <fileNamePattern>$LOG_DIR/$SYSTEM_NAME/system.%dyyyy-MM-dd.%i.log</fileNamePattern>

                <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                    <maxFileSize>500MB</maxFileSize>
                </timeBasedFileNamingAndTriggeringPolicy>
            </rollingPolicy>

            <encoder>
                <pattern>%-20(%dyyy-MM-dd HH:mm:ss.SSS [%XrequestId]) %-5level - %logger80 - %msg%n
                </pattern>
            </encoder>
        </appender>


        <appender name="BUSINESS_APPENDER" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <filter class="ch.qos.logback.classic.filter.LevelFilter">
                <level>TRACE</level>
                <onMatch>ACCEPT</onMatch>
                <onMismatch>DENY</onMismatch>
            </filter>

            <file>business.log</file>

            <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">

                <fileNamePattern>$LOG_DIR/$SYSTEM_NAME/business.%dyyyy-MM-dd.%i.log</fileNamePattern>

                <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                    <maxFileSize>500MB</maxFileSize>
                </timeBasedFileNamingAndTriggeringPolicy>
            </rollingPolicy>

            <encoder>
                <pattern>%-20(%dyyy-MM-dd HH:mm:ss.SSS [%XrequestId]) %-5level - %logger80 - %msg%n
                </pattern>
            </encoder>
        </appender>


        <logger name="project-package-name" level="TRACE">
            <appender-ref ref="BUSINESS_APPENDER" />
        </logger>

        <root level="INFO">
            <appender-ref ref="ROOT_APPENDER" />
        </root>

    </configuration>

【讨论】:

【参考方案12】:

现有的答案很棒。我只是想与您分享一个新的 Spring Boot 功能,允许对日志进行分组并设置整个组的日志记录级别。

文档中的示例:

创建日志记录组
logging.group.tomcat=org.apache.catalina, org.apache.coyote, org.apache.tomcat
为组设置日志记录级别
logging.level.tomcat=TRACE

这是一个很好的功能,它带来了更多的灵活性。

【讨论】:

【参考方案13】:

在 Spring Boot 项目中,我们可以编写 logging.level.root=WARN 但这里的问题是,即使我们添加了 devtools 依赖项,我们也必须再次重新启动,如果我们在属性文件中修改任何值将不会自动检测到,因为这个限制我知道了解决方案,即我们可以在 pom.xml 中添加执行器并传递记录器级别,如下所示在邮递员客户端 在网址栏中 http://localhost:8080/loggers/ROOT 或 http://localhost:8080/loggers/com.mycompany 在正文中,您可以传递如下所示的 json 格式


  "configuredLevel": "WARN"

【讨论】:

【参考方案14】:

在我当前的配置中,我在 application.yaml 中定义了它:

logging:
  level:
    ROOT: TRACE

我正在使用 spring-boot:2.2.0.RELEASE。您可以定义任何应该具有类似 TRACE 级别的包。

【讨论】:

这是在应用程序级别设置的。 OP 只希望跟踪您需要在日志设置中使用包级别过滤器的休眠日志【参考方案15】:

我们也可以通过如下命令行开启DEBUG日志:-

java -jar <jar file> --debug

【讨论】:

【参考方案16】:
logging:
  level:
    root: INFO
    com.mycompany.myapp: DEBUG

【讨论】:

【参考方案17】:

如果使用 eclipse IDE 并且您的项目是 maven,请记住清理并构建项目以反映更改。

【讨论】:

【参考方案18】:

根据documentation,您可以拥有基于 java 包的不同日志记录级别

 logging.level.com.mypackage.myproject=WARN
 logging.level.org.springframework=DEBUG
 logging.level.root=INFO 

这意味着

对于您的自定义包com.mypackage.myproject WARN 将应用日志记录级别 对于 spring 框架包 org.springframework DEBUG 将应用日志记录级别 对于每个其他包 INFO 将应用日志记录级别

您还可以将不同的 java 包组合在一起,并在一行中指示系统对该组的所有包使用相同的日志记录级别。

在前面的例子中你可以这样做

 logging.level.root=INFO 
 logging.level.org.springframework=DEBUG
 
 logging.group.myCustomGroup = com.mypackage.myproject, com.otherpackage.otherproject, com.newpackage.newproject
 logging.level.myCustomGroup=WARN

这意味着包

com.mypackage.myproject com.otherpackage.otherproject com.newpackage.newproject

都将应用日志记录级别WARN

【讨论】:

以上是关于Spring Boot:如何使用 application.properties 设置日志记录级别?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Spring Data JPA 在 Spring Boot 2 应用程序中发布数据

从 Shell 脚本优雅地关闭 Spring Boot 应用程序

根据环境变量设置 Spring Boot application.properties

SpringBoot发送简单文本邮件

如何使用 Spring-Boot 播种 Spring-Security

如何使用 graphql-spring-boot 向 GraphQL Java 添加检测?