【问题标题】: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.log(FILE1 appender),而来自包com.example.apps.special-package的日志将写入log2.log(FILE2 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 默认的 FILE 和 CONSOLE appender 像往常一样记录应用程序信息(logging.file.my.package 除外),并使用 SPECIAL_FILE appender 将此包中的信息记录到文件 log/special.log。