Spring Boot、logback和logging.config属性

71

我正在使用logback库在一个Spring Boot项目中实现日志记录。我想根据我的Spring配置文件(属性spring.profiles.active)加载不同的日志记录配置文件。我有3个文件:

  • logback-dev.xml
  • logback-inte.xml
  • logback-prod.xml

我正在使用Spring Boot版本1.2.2.RELEASE。


正如您可以在Spring Boot文档中阅读到的:

各种日志系统可以通过在类路径上包含适当的库来激活,并通过提供位于类路径的根目录或由Spring环境属性logging.config指定的位置的适当配置文件进行进一步自定义。(但请注意,由于日志记录是在创建ApplicationContext之前初始化的,因此无法从Spring @Configuration文件中的@PropertySources控制日志记录。系统属性和常规的Spring Boot外部配置文件完全可以工作。)

所以我尝试在我的application.properties文件中设置logging.config属性:

logging.config=classpath:/logback-${spring.profiles.active}.xml

但是当我启动我的应用程序时,我的logback-{profile}.xml没有被加载。

我认为日志记录是所有使用Spring Boot的项目都会遇到的常见问题。我采取的上述方法是否正确?

我有其他可行的解决方案,但我发现它们不够优雅(在logback.xml文件中使用Janino进行条件解析或命令行属性)。


你是否找到了一种优雅的解决方案,可以同时拥有多个活动配置文件? - Marsellus Wallace
请检查我的2016年3月3日的编辑。 - LG_
请查看此链接:https://stackoverflow.com/a/49568780/4369820 - Satya Prakash
找到你的答案 - https://stackoverflow.com/a/54477155/5756557 - anandchaugule
6个回答

88

我找到了一种解决方案,并且明白了为什么Spring不使用我在application.properties文件中定义的logging.config属性。

解决方案和说明

在初始化日志记录时,Spring Boot只会查找类路径或环境变量中的配置。

我的解决方案是包含一个父级logback.xml文件,根据Spring的配置文件来引入正确的日志记录配置文件。

logback.xml

<configuration>
    <include resource="logback-${spring.profiles.active}.xml"/>
</configuration>

logback-[profile].xml(在本例中,logback-dev.xml):

<included>

    <!-- put your appenders -->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
    <!-- encoders are assigned the type
     ch.qos.logback.classic.encoder.PatternLayoutEncoder by default -->
       <encoder>
           <pattern>%d{ISO8601} %p %t %c{0}.%M - %m%n</pattern>
           <charset>utf8</charset>
        </encoder>
    </appender>

    <!-- put your loggers here -->
    <logger name="org.springframework.web" additivity="false" level="INFO">
        <appender-ref ref="CONSOLE" />
    </logger>

    <!-- put your root here -->
    <root level="warn">
        <appender-ref ref="CONSOLE" />
    </root>

</included>

注意

启动应用程序时,必须在命令行参数中设置spring.profiles.active
JVM属性示例:-Dspring.profiles.active=dev


参考文档


编辑(多个活动配置文件)

为了避免多个文件,我们可以使用条件处理,需要 Janino 依赖项 (在此设置),请参阅 条件文档

使用此方法,我们还可以同时检查多个活动配置文件。例如(我没有测试这个解决方案,请在评论中指出是否有效):

<configuration>

    <if condition='"${spring.profiles.active}".contains("profile1")'>
        <then>
         <!-- do whatever you want for profile1 -->
        </then>
    </if>

    <if condition='"${spring.profiles.active}".contains("profile2")'>
        <then>
         <!-- do whatever you want for profile2 -->
        </then>
    </if>

    <!-- common config -->

</configuration>

请参考 @javasenior answer,了解另一个条件处理的示例。


这种方法对您的用例似乎很好,但是在环境中可能会定义多个配置文件,这将导致包含文件出现错误。例如:spring.profiles.active=profile1,profile2. <include resource="logback-profile1,profile2.xml"/> - mjj1409
1
是的,没错。在这种情况下,我会使用Janino库。 - LG_
有没有关于同时拥有多个活动配置文件的优雅解决方案的更新? - Marsellus Wallace
1
请查看Spring Boot 1.3.0中即将推出的SpringProfile扩展 - 1in9ui5t
1
你可以在application.properties中定义默认配置文件,使用dev作为默认的spring.profiles.active=${dev:dev}。如果你没有传递-Dspring.profiles.active参数,默认值将为dev。 - amjad
如果人们仍在遇到此问题:实际原因是 Tomcat 覆盖了 config.location。在 Tomcat 10 中有一个修复方法。 - plmaheu

46

另一种处理多个配置文件的方法是为每个环境创建一个单独的配置文件。

application-prod.properties

logging.config=classpath:logback-prod.xml

应用程序开发环境属性文件(application-dev.properties)

logging.config=classpath:logback-dev.xml

应用程序本地属性

logging.config=classpath:logback-local.xml

注意

如果您不小心操作,可能会在意料之外的地方进行记录。

-Dspring.profiles.active=local,dev //will use logback-dev.xml
-Dspring.profiles.active=dev,local //will use logback-local.xml

10

如果每个配置文件的区别不大,建议使用以下方式(而不是为每个配置文件添加单独的logback xml文件或使用IF条件语句)以便进行简单的条件处理。有关详细信息,请参阅此处的文档链接。

<springProfile name="dev">
<logger name="org.sample" level="DEBUG" />
</springProfile>
<springProfile name="prod">
<logger name="org.sample" level="TRACE" />
</springProfile>

文档链接:https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-logging.html#_profile_specific_configuration - Wim Deblauwe
我们仍然需要指定spring.profiles.active=mode对吧? - Amber Kulkarni

5

您可以为不同的配置文件指定不同的logback.xml文件,只需要3个步骤:

1.在application.propertiesapplication.yml中指定激活的配置文件:

spring.profiles.active: test

2、将logback配置为通过配置文件不同的profile来实现不同的配置:

<!DOCTYPE configuration>
<configuration scan="true" scanPeriod="30 seconds">
    <springProperty scope="context" name="profile" source="spring.profiles.active"/>
    <include resource="logback.${profile}.xml"/>
</configuration>

3、创建配置文件logback.test.xml


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

这很简单,不需要做其他任何事情。


5

使用logback进行条件处理可以是不需要太多logback文件的解决方案。这里是链接和一个带有Spring配置文件的示例logback配置。

<configuration>

    <property name="LOG_LEVEL" value="INFO"/>

        <if condition='"product".equals("${spring.profiles.active}")'>
           <then>
                <property name="LOG_LEVEL" value="INFO"/>
           </then>
           <else>
                <property name="LOG_LEVEL" value="ERROR"/>
           </else>
        </if>

         .
         .
         appender, logger tags etc.
         .
         .

         <root level="${LOG_LEVEL}">
             <appender-ref ref="STDOUT"/>
         </root>

</configuration>

此外,您可能需要将此添加到您的pom.xml文件中。
<dependency>
    <groupId>org.codehaus.janino</groupId>
    <artifactId>janino</artifactId>
    <version>3.0.6</version>
</dependency>

4

Spring在Logback XML文件中支持<springProperty/>标签,该标签在此处有描述。这意味着您可以轻松地从Spring属性文件中添加变量,即使这个变量值通过Spring从环境/系统变量解析。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接