【问题标题】:Custom log file for specific packages in Spring bootSpring boot 中特定包的自定义日志文件
【发布时间】:2018-08-05 15:12:46
【问题描述】:

我有一个带有专门操作的 java 包。专业化的意义在于它们很少使用,我不想让它们与正常的日志记录混合在一起。

我知道添加 logging.file=myapplication.log 会将日志记录重定向到此文件,但有没有办法指定仅从特定包记录到另一个文件?喜欢logging.file.my.package=special.log

【问题讨论】:

    标签: spring spring-boot logging logback


    【解决方案1】:

    Spring Boot 提供的日志配置是不可能的。但是,您可以使用日志框架提供的配置。默认为Logback,可配置为记录到多个日志文件。

    为此,您需要将 logback.xml 文件添加到您的类路径并配置多个appenders。例如:

    <appender name="FILE1" class="ch.qos.logback.core.FileAppender">
        <file>log1.log</file>
        <append>true</append>
        <encoder>
            <pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>
        </encoder>
    </appender>
    
    <appender name="FILE2" class="ch.qos.logback.core.FileAppender">
        <file>log2.log</file>
        <append>true</append>
        <encoder>
            <pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>
        </encoder>
    </appender>
    

    现在您可以定义一个单独的记录器,以防您想记录到不同的文件。确保添加additivity="false" 否则,日志消息仍将打印在两个日志文件中:

    <logger name="com.example.apps.special-package" level="INFO" additivity="false">
        <appender-ref ref="FILE2" />
    </logger>
    <root level="INFO">
        <appender-ref ref="FILE1" />
    </root>
    

    在这种情况下,所有日志都将写入log1.logFILE1 appender),而来自包com.example.apps.special-package的日志将写入log2.logFILE2 appender)。

    【讨论】:

      【解决方案2】:

      Spring 使用 Logback 作为默认记录器。根据official doc,您可以自己设置 logback.xml 以将您的“特殊”行为添加到默认日志记录机制中:

      <?xml version="1.0" encoding="UTF-8"?>
      <configuration>
          <include resource="org/springframework/boot/logging/logback/defaults.xml" />
          <property name="LOG_FILE" value="${LOG_FILE:-${LOG_PATH:-${LOG_TEMP:-${java.io.tmpdir:-/tmp}}/}spring.log}"/>
      
          <include resource="org/springframework/boot/logging/logback/file-appender.xml" />
          <include resource="org/springframework/boot/logging/logback/console-appender.xml" />
      
          <property name="SPECIAL_FILE_NAME" value="special"/>
          <appender name="SPECIAL_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
              <encoder>
                  <pattern>%date{yyyy-MM-dd HH:mm:ss.SSS} [%-10.10thread] %-5level %30.30logger{29}:%-4line %msg%n</pattern>
                  <charset>utf8</charset>
              </encoder>
              <file>logs/${SPECIAL_FILE_NAME}.log</file>
              <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
                  <fileNamePattern>logs/${SPECIAL_FILE_NAME}-%i.log</fileNamePattern>
              </rollingPolicy>
              <triggeringPolicy
                      class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
                  <MaxFileSize>10MB</MaxFileSize>
              </triggeringPolicy>
          </appender>
      
          <logger name="logging.file.my.package" level="debug" additivity="false">
              <appender-ref ref="SPECIAL_FILE"/>
          </logger>
      
          <root level="INFO">
              <appender-ref ref="FILE" />
              <appender-ref ref="CONSOLE" />
          </root>
      </configuration>
      

      这里我们使用 Spring 默认的 FILECONSOLE appender 像往常一样记录应用程序信息(logging.file.my.package 除外),并使用 SPECIAL_FILE appender 将此包中的信息记录到文件 log/special.log

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-03-11
        • 2022-01-13
        • 1970-01-01
        • 2020-02-25
        • 1970-01-01
        • 2019-06-28
        相关资源
        最近更新 更多