【问题标题】:logback spring turn off console logging based on spring profilelogback spring 根据 spring 配置文件关闭控制台日志记录
【发布时间】:2019-02-06 23:00:44
【问题描述】:

这是我的示例 logback-spring.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <property name="LOG_FILE" value="some file path here"/>
    <property name="LOG_FILE_MAX_SIZE" value="50MB" />
    <property name="LOG_FILE_MAX_HISTORY" value="30" />
    <include resource="org/springframework/boot/logging/logback/defaults.xml" />
    <include resource="org/springframework/boot/logging/logback/file-appender.xml" />
    <include resource="org/springframework/boot/logging/logback/console-appender.xml" />

<springProfile name="!test &amp; !prod">
    <logger name="com.myapp" level="DEBUG" />
    <root level="INFO">
        <appender-ref ref="CONSOLE"/>
    </root> 
</springProfile>

<springProfile name="test">
    <logger name="com.myapp" level="DEBUG" />
    <root level="WARN">
        <appender-ref ref="FILE" />
    </root>
</springProfile>

<springProfile name="prod">
    <logger name="com.myapp" level="INFO" />
    <root level="WARN">
        <appender-ref ref="FILE"/>
    </root>
</springProfile>

我的意图是将内容仅记录到 FILE 以用于测试和生产配置文件,但是对于任何其他配置文件(即本地主机),我希望我的日志仅在 CONSOLE 中获取。

使用上述设置,如果我使用 localhost 配置文件启动我的 spring boot 应用程序(版本 2.1.1.RELEASE),它只会按预期登录到 CONSOLE,但是如果我使用 test 或 prod 配置文件,它会同时记录内容在 CONSOLE 和 FILE 中。

您在 logback xml 中发现任何问题吗?

【问题讨论】:

    标签: spring-boot spring-logback


    【解决方案1】:

    据我所知,Spring 不允许在配置文件选择中使用逻辑表达式。可以只说!test,但不能说两者的组合。因此,在您的情况下,如果测试未激活或产品未激活,则条件将触发,这意味着测试激活或产品激活。

    您可以做的是枚举您实际想要登录到控制台的其他配置文件。例如。 localhost.

    【讨论】:

    • 是的,我最终列出了所有这些以使其正常工作。我在关注docs.spring.io/spring-boot/docs/current/reference/html/… 的文档,提到它可以是一个表达式,但不知何故无法让它工作。
    • 如果对您有帮助,请随时将答案标记为正确或有帮助。我想说在这种情况下文档有点误导,因为它说你可以做dev | staging 或者你可以做!production,但它不会告诉你不能两者都做。我们前段时间也被这个咬过...
    • 文档确实提到我们可以使用这样的表达production &amp; (eu-central | eu-west)
    【解决方案2】:

    这是一个您可以遵循的示例,您可以在其中为各种环境选择附加程序类型,例如仅 FILE 用于测试和生产配置文件,仅 stdout 或控制台用于本地环境。

           <springProfile name="dev,test,local">
        <property name="LOG_PATH" value="C:/<folder_name>/" />
    </springProfile>
      <!--if production environment is linux -->
       <springProfile name="prod">
        <property name="LOG_PATH" value="/opt/<folder_name>/" />
       </springProfile>
    
        <!-- make sure the pattern tag expression don't break in the middle-->
       <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
         <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(%5p) %clr(${PID:- }) 
       {magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} 
         %clr(:){faint} %m%n%wEx</pattern>
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
            </pattern>
        </encoder>
       </appender>
    
       <appender name="file"
        class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${LOG_PATH}projectLog.%d{dd-MM-yyyy}.log
            </fileNamePattern>
            <!-- <maxHistory>30</maxHistory> -->
            <totalSizeCap>3GB</totalSizeCap>
        </rollingPolicy>
    
       </appender>
    
      <springProfile name="local">
      <logger name="org.springframework" level="info" additivity="false">
            <appender-ref ref="STDOUT" />
        </logger>
       <root level="info">
            <appender-ref ref="STDOUT" />
        </root>
     </springProfile>
     <springProfile name="test,dev,prod">
     <logger name="org.springframework" level="error" additivity="false">
            <appender-ref ref="file" />
        </logger>
     <root level="info">
            <appender-ref ref="file" />
        </root>
      </springProfile>
    

    【讨论】:

      【解决方案3】:
      <springProfile name="staging">
          <!-- configuration to be enabled when the "staging" profile is active -->
      </springProfile>
      
      <springProfile name="dev | staging">
          <!-- configuration to be enabled when the "dev" or "staging" profiles are active ,for SpringBoot 1.5.4 replace with [name="dev, staging"]-->
      </springProfile>
      
      <springProfile name="!production">
          <!-- configuration to be enabled when the "production" profile is not active -->
      </springProfile>
      

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

      【讨论】: