在Spring Boot中,您可以使用Logback为不同的类配置不同的日志文件。以下是一个基本的 logback.xml
配置示例,展示了如何为两个类 com.example.Class1
和 com.example.Class2
配置不同的日志文件。
logback.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<appender name="CLASS1_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>logs/class1.log</file>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<appender name="CLASS2_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>logs/class2.log</file>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<logger name="com.example.Class1" level="info" additivity="false">
<appender-ref ref="CLASS1_FILE" />
</logger>
<logger name="com.example.Class2" level="info" additivity="false">
<appender-ref ref="CLASS2_FILE" />
</logger>
<root level="error">
<appender-ref ref="CLASS1_FILE" />
<appender-ref ref="CLASS2_FILE" />
</root>
</configuration>
这个配置定义了两个 appender,分别命名为 “CLASS1_FILE” 和 “CLASS2_FILE”。每个appender会将日志输出到指定的文件中,这里分别是 logs/class1.log
和 logs/class2.log
。
然后,定义了两个 logger,分别对应 com.example.Class1
和 com.example.Class2
类。这两个 logger 的日志级别都设置为 “info”,并将日志输出到对应的 appender 中。additivity="false"
的设置是为了防止日志被父 logger(在这里是 root logger)也处理。
最后,root logger 设置为只处理 “error” 级别以上的日志,它的日志输出到两个 appender 中。
以上配置示例可以根据你的具体需求进行调整,例如你可以修改日志级别、日志模式、日志文件的路径等。
<appender>
标签
<appender>
标签在Logback配置文件中定义了日志输出的目的地和格式。换句话说,它确定了日志消息的输出方式和地点。例如,这可能是一个文件,一个数据库,一个控制台窗口等等。
每个 <appender>
标签包含以下主要部分:
-
name
属性:此属性定义了appender的名称,你可以随意命名,但需要确保在配置文件中唯一。
-
class
属性:此属性定义了appender的类型。例如,ch.qos.logback.core.ConsoleAppender
是将日志发送到控制台,ch.qos.logback.core.rolling.RollingFileAppender
是将日志发送到文件,并提供滚动特性。
- 子标签
<encoder>
或 <layout>
:这些标签定义了日志输出的格式。PatternLayoutEncoder
或 PatternLayout
可以让你自定义日志的格式。
举个例子:
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<!-- 日志输出格式 -->
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
在这个例子中,名为 “STDOUT” 的appender是 ConsoleAppender
类型,这意味着它将日志输出到控制台。 <encoder>
标签定义了日志的输出格式。%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
表示日志包含时间戳、线程名、日志级别、logger名和消息内容。
<logger>
标签在Logback配置文件中定义了一个logger实例,这个实例会拦截、处理日志消息,并将日志传递到适当的appender中进行记录。
每个 <logger>
标签通常包含以下部分:
-
name
属性:此属性定义了logger的名称,通常与你想要记录日志的类或包的名称匹配。例如,如果你有一个名为 com.example.MyClass
的类,并且你想要特别记录这个类的日志,那么你可以创建一个名称为 com.example.MyClass
的logger。
-
level
属性:此属性定义了该logger接受的最低日志级别。可选的级别有 TRACE, DEBUG, INFO, WARN, ERROR, OFF。例如,如果设置为INFO,那么该logger将只记录INFO、WARN、ERROR级别的日志。
-
additivity
属性:此属性决定日志是否应传递给父logger进行处理。如果设为 false
,则日志仅由此logger处理,不会被传递到父logger;如果设为 true
或不设置,日志既由此logger处理,也会被传递到父logger。
- 子标签
<appender-ref>
:此标签用于将logger与appender关联起来。appender的引用名称必须与之前定义的appender的名称匹配。
例如:
<logger name="com.example.MyClass" level="info" additivity="false">
<appender-ref ref="STDOUT" />
</logger>
这个示例定义了一个名为 com.example.MyClass
的logger,其日志级别设置为 info
,并且不会把日志传递给父logger。日志将被发送到名为 STDOUT
的appender中进行处理。
综合logback.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false">
<!--为了防止进程退出时,内存中的数据丢失,请加上此选项-->
<shutdownHook class="ch.qos.logback.core.hook.DelayingShutdownHook"/>
<!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径-->
<property name="LOG_HOME" value="E:/code/logs/springboot_temple" />
<property name="LOG_NAME_BEGIN" value="springboot_temple" />
<property name="moduleName" value="springboot-temple" />
<property name="maxFileSize" value="100MB" />
<property name="totalSizeCap" value="2GB" />
<property name="MaxHistory" value="30" />
<!-- 彩色日志格式 -->
<property name="COLOUR_LOG_PATTERN"
value="%magenta(%d{yyyy-MM-dd HH:mm:ss.SSS}) %cyan([TRACE_ID:%X{TRACE_ID}]) %blue([%thread]) %highlight(%-5level) %green(%logger) - %msg%n"/>
<!-- Console 输出设置 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${COLOUR_LOG_PATTERN}</pattern>-->
<charset>utf8</charset>
</encoder>
</appender>
<!-- 按照每天生成日志文件 -->
<!-- 所有级别日志 appender -->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!--按大小+时间的策略保存日志-->
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!--日志文件输出的文件名-->
<fileNamePattern>${LOG_HOME}/${LOG_NAME_BEGIN}-all-%d{yyyy-MM-dd}_%i.log</fileNamePattern>
<!--每100m分一个文件-->
<maxFileSize>${maxFileSize}</maxFileSize>
<!--总大小不超过2G-->
<totalSizeCap>${totalSizeCap}</totalSizeCap>
<!--日志文件保留天数-->
<MaxHistory>${MaxHistory}</MaxHistory>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<pattern>${COLOUR_LOG_PATTERN}</pattern>
</encoder>
</appender>
<!-- warn日志 appender -->
<appender name="INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${LOG_HOME}/${LOG_NAME_BEGIN}-info-%d{yyyy-MM-dd}_%i.log</fileNamePattern>
<!--每100m分一个文件-->
<maxFileSize>${maxFileSize}</maxFileSize>
<!--总大小不超过2G-->
<totalSizeCap>${totalSizeCap}</totalSizeCap>
<!--日志文件保留天数-->
<MaxHistory>${MaxHistory}</MaxHistory>
</rollingPolicy>
<encoder>
<pattern>${COLOUR_LOG_PATTERN}</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter"><!-- 只打印info日志 -->
<level>INFO</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- debug日志 appender -->
<appender name="DEBUG" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${LOG_HOME}/${LOG_NAME_BEGIN}-debug-%d{yyyy-MM-dd}_%i.log</fileNamePattern>
<!--每100m分一个文件-->
<maxFileSize>${maxFileSize}</maxFileSize>
<!--总大小不超过2G-->
<totalSizeCap>${totalSizeCap}</totalSizeCap>
<!--日志文件保留天数-->
<MaxHistory>${MaxHistory}</MaxHistory>
</rollingPolicy>
<encoder>
<pattern>${COLOUR_LOG_PATTERN}</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter"><!-- 只打印debug日志 -->
<level>DEBUG</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- error日志 appender -->
<appender name="ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${LOG_HOME}/${LOG_NAME_BEGIN}-error-%d{yyyy-MM-dd}_%i.log</fileNamePattern>
<!--每100m分一个文件-->
<maxFileSize>${maxFileSize}</maxFileSize>
<!--总大小不超过2G-->
<totalSizeCap>${totalSizeCap}</totalSizeCap>
<!--日志文件保留天数-->
<MaxHistory>${MaxHistory}</MaxHistory>
</rollingPolicy>
<encoder>
<pattern>${COLOUR_LOG_PATTERN}</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter"><!-- 只打印error日志 -->
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- warn日志 appender -->
<appender name="WARN" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${LOG_HOME}/${LOG_NAME_BEGIN}-warn-%d{yyyy-MM-dd}_%i.log</fileNamePattern>
<!--每100m分一个文件-->
<maxFileSize>${maxFileSize}</maxFileSize>
<!--总大小不超过2G-->
<totalSizeCap>${totalSizeCap}</totalSizeCap>
<!--日志文件保留天数-->
<MaxHistory>${MaxHistory}</MaxHistory>
</rollingPolicy>
<encoder>
<pattern>${COLOUR_LOG_PATTERN}</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter"><!-- 只打印warn日志 -->
<level>WARN</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- 类级别日志输出-->
<appender name="CLASS1_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!--按大小+时间的策略保存日志-->
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!--日志文件输出的文件名-->
<fileNamePattern>${LOG_HOME}/${LOG_NAME_BEGIN}-class1-%d{yyyy-MM-dd}_%i.log</fileNamePattern>
<!--每100m分一个文件-->
<maxFileSize>${maxFileSize}</maxFileSize>
<!--总大小不超过2G-->
<totalSizeCap>${totalSizeCap}</totalSizeCap>
<!--日志文件保留天数-->
<MaxHistory>${MaxHistory}</MaxHistory>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<pattern>${COLOUR_LOG_PATTERN}</pattern>
</encoder>
</appender>
<appender name="CLASS2_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!--按大小+时间的策略保存日志-->
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!--日志文件输出的文件名-->
<fileNamePattern>${LOG_HOME}/${LOG_NAME_BEGIN}-class2-%d{yyyy-MM-dd}_%i.log</fileNamePattern>
<!--每100m分一个文件-->
<maxFileSize>${maxFileSize}</maxFileSize>
<!--总大小不超过2G-->
<totalSizeCap>${totalSizeCap}</totalSizeCap>
<!--日志文件保留天数-->
<MaxHistory>${MaxHistory}</MaxHistory>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<pattern>${COLOUR_LOG_PATTERN}</pattern>
</encoder>
</appender>
<logger name="com.example.demo_wwxx_dep.service.ClassLog1" level="info" additivity="true">
<appender-ref ref="CLASS1_FILE" />
</logger>
<logger name="com.example.demo_wwxx_dep.service.ClassLog2" level="info" additivity="false">
<appender-ref ref="CLASS2_FILE" />
</logger>
<!-- 日志输出级别 -->
<root level="DEBUG">
<appender-ref ref="STDOUT" />
<appender-ref ref="FILE" />
<appender-ref ref="ERROR" />
<appender-ref ref="DEBUG" />
<appender-ref ref="INFO" />
<appender-ref ref="WARN" />
</root>
</configuration>