基础配置介绍
完整配置 demo
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!-- 名称 -->
<contextName>${appName}</contextName>
<!-- 引入spirng boot默认的logback配置文件 -->
<include resource="org/springframework/boot/logging/logback/defaults.xml"/>
<!-- 读取 spring 的配置项,并映射到自定义的变量中,name 就是新的变量名,source 是 spring 配置项名称 -->
<springProperty name="appName" source="spring.application.name"/>
<springProperty name="rootLevel" source="logger.level"/>
<springProperty name="log.path" source="logger.file.path"/>
<!-- 日志文件存放的路径【可替换】 -->
<property name="log_path" value="${log.path}"/>
<property name="app_dir" value="log"/>
<!-- 将 error 级别的日志输出到文件中 -->
<appender name="FILE_ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 日志输出的文件名称 -->
<file>${log_path}/${app_dir}/log_error.log</file>
<!-- 基于时间的滚动策略,用于定义文件的保存、切割、大小,例如单个日志文件大小,保存周期,切割后的文件名命名格式 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 文件格式 -->
<fileNamePattern>${log_path}/${app_dir}/error/log-error-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<!-- 文件保留最大天数,超过 7 天的日志文件将会被删除 -->
<maxHistory>7</maxHistory>
<!-- 单个日志文件大小限制 -->
<maxFileSize>50MB</maxFileSize>
<!-- 总的日志文件大小限制,当总的日志文件大小超过这个数值时,会将最老的日志进行删除 -->
<totalSizeCap>500MB</totalSizeCap>
</rollingPolicy>
<!-- 新的日志内容将追加到现有的日志文件末尾。如果日志文件已经存在,新的日志记录会被添加在文件的末尾,而不会覆盖文件中已有的内容。这是默认的行为 -->
<append>true</append>
<!-- 输出格式 -->
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${FILE_LOG_PATTERN}</pattern>
<charset>${FILE_LOG_CHARSET}</charset>
</encoder>
<!-- 输出日志级别 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<!-- 指定日志级别 -->
<level>error</level>
<!-- 当日志级别匹配时的行为,ACCEPT 接受,DENY 拒绝 -->
<onMatch>ACCEPT</onMatch>
<!-- 当日志级别不匹配时的行为,ACCEPT 接受,DENY 拒绝 -->
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- warn file -->
<appender name="FILE_WARN" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log_path}/${app_dir}/log_warn.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${log_path}/${app_dir}/warn/log-warn-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>5MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<maxHistory>30</maxHistory>
</rollingPolicy>
<append>true</append>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${FILE_LOG_PATTERN}</pattern>
<charset>${FILE_LOG_CHARSET}</charset>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>warn</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- info file -->
<appender name="FILE_INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log_path}/${app_dir}/log_info.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${log_path}/${app_dir}/info/log-info-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>5MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<maxHistory>30</maxHistory>
</rollingPolicy>
<append>true</append>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${FILE_LOG_PATTERN}</pattern>
<charset>${FILE_LOG_CHARSET}</charset>
</encoder>
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>info</level>
</filter>
</appender>
<!-- ConsoleAppender 输出到控制台 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${CONSOLE_LOG_PATTERN}</pattern>
<charset>${CONSOLE_LOG_CHARSET}</charset>
</encoder>
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>debug</level>
</filter>
</appender>
<!-- 项目包路径【可替换】 -->
<logger name="cn.cy.server" level="debug"/>
<root level="info">
<appender-ref ref="FILE_ERROR"/>
<appender-ref ref="FILE_WARN"/>
<appender-ref ref="FILE_INFO"/>
<appender-ref ref="STDOUT"/>
</root>
</configuration>
contentName
contentName(上下文名称)可以为整个日志记录系统打上一个标识。这对于在日志中区分不同的应用程序实例或模块非常有用,尤其是在集中式日志管理工具中(如 ELK Stack 或 Splunk),可以通过上下文名称来快速过滤和查找日志。 它可以作为日志输出模式的一部分,用于记录每条日志事件所属的上下文。这对于排查和分析复杂系统中的问题非常有帮助。
<configuration>
<contextName>MyAppContext</contextName>
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %contextName - %msg%n</pattern>
</encoder>
</appender>
<root level="INFO">
<appender-ref ref="CONSOLE"/>
</root>
</configuration>
在某些复杂应用程序中,可能存在多个独立的 LoggerContext(日志上下文)。通过为每个 LoggerContext 设置不同的 contextName,可以确保日志配置和输出彼此独立。
include
include 标签用于在主配置文件中包含其他配置文件。这有助于组织和管理大型日志配置文件,使其更加模块化和可维护。在最上面的 demo 中,使用了 include 引入了 SpringBoot 默认的日志配置文件。
<configuration>
<!-- 引入spirng boot默认的logback配置文件 -->
<include resource="org/springframework/boot/logging/logback/defaults.xml"/>
</configuration>
property
property 标签使用来声明属性值的,目的是为了组织和管理日志配置中需要重复使用的变量值,例如日志的输出格式、输出的文件路径等。
<configuration>
<!-- 日志文件存放的路径【可替换】 -->
<property name="log_path" value="${log.path}"/>
<property name="app_dir" value="log"/>
</configuration>
springProperty
在与 spring 框架搭配使用时,可以使用 springProperty 标签获取 spring 配置文件中的属性值。
- name: 定义在 Logback 配置中使用的占位符名称。这个名称将在配置中通过 ${} 语法引用。
- source: 指定 Spring 应用上下文中属性的名称,也就是在 Spring 配置文件(如 application.properties 或 application.yml)中定义的属性名称。
例如:
<!-- logback-spring.xml -->
<configuration>
<!-- 引用 Spring 配置 -->
<springProperty name="appName" source="spring.application.name"/>
<springProperty name="rootLevel" source="logger.level"/>
<springProperty name="log.path" source="logger.file.path"/>
<!-- 使用 -->
<contentName>${appName}</contentName>
</configuration>
# application.yml
spring:
application:
name: sso server
logger:
level: info
file:
path: ./
appender
appender 标签用于定义日志输出的细节。如输出方式、输出何种日志级别等。可以根据需要定义多个 appender 对不同的日志(ERROR、WARING、INFO等)做不同方式的处理(输出到控制台、文件、数据库、远程服务器等)。
- name: 定义 Appender 的唯一名称,供
<root>
或<logger>
引用。 - class: 指定 Appender 的具体实现类,决定日志的输出目标类型。
appender 标签下还有其的配置标签
encoder: 定义日志事件的编码器,通常用于指定日志的输出格式。常用的编码器是 PatternLayoutEncoder,它通过指定模式来定义日志输出格式。
<encoder> <!-- 日志输出格式 --> <pattern>${FILE_LOG_PATTERN}</pattern> <!-- 日志输出编码 --> <charset>${FILE_LOG_CHARSET}</charset> </encoder>
- pattern: 用于定义日志输出格式,这里因为引用了 Spring 默认的日志配置,所以直接使用占位符引用。
- charset: 用于定义日志输出编码,通常使用 utf8。
file: 定义日志文件的路径,仅在 FileAppender 和 RollingFileAppender 中使用。
<file>logs/app.log</file>
append: 指定是否追加日志到现有文件中。true 表示追加,false 表示覆盖现有文件。
<append>true</append>
filter: 用于对日志事件进行过滤,只记录满足特定条件的日志事件。
<filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <!-- 指定日志级别 --> <level>error</level> <!-- 当日志级别匹配时的行为,ACCEPT 接受,DENY 拒绝 --> <onMatch>ACCEPT</onMatch> <!-- 当日志级别不匹配时的行为,ACCEPT 接受,DENY 拒绝 --> <onMismatch>DENY</onMismatch> </filter>
- level: 指定日志级别,ERROR、INFO、WARNING、DEBUGGER、TRACE。
- onMatch:当日志级别匹配时的行为,ACCEPT 接受,DENY 拒绝。
- onMismatch: 当日志级别不匹配时的行为,ACCEPT 接受,DENY 拒绝。
rollingPolicy: 仅在
RollingFileAppender
中使用,定义日志滚动策略。常用的滚动策略包括时间滚动(TimeBasedRollingPolicy
)和大小滚动(SizeBasedTriggeringPolicy
)。<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!-- 文件格式 --> <fileNamePattern>${log_path}/${app_dir}/error/log-error-%d{yyyy-MM-dd}.%i.log</fileNamePattern> <!-- 文件保留最大天数,超过 7 天的日志文件将会被删除 --> <maxHistory>7</maxHistory> <!-- 单个日志文件大小限制 --> <maxFileSize>50MB</maxFileSize> <!-- 总的日志文件大小限制,当总的日志文件大小超过这个数值时,会将最老的日志进行删除 --> <totalSizeCap>500MB</totalSizeCap> </rollingPolicy>
- fileNamePattern: 文件名称格式。
- maxHistory: 文件保留最大天数,超过这个阈值的日志会被删除。
- maxFileSize: 单个日志文件大小,超过这个阈值,日志会被拆分。
- totalSizeCap: 当前 appender 产生的所有日志文件大小,当超过这个阈值时,默认删除最老的日志。
logger
logger 标签用于定义特定包或类的日志记录器(Logger)。它可以用来设置不同的日志级别、附加日志输出目标(Appender),并进行其他日志记录配置。通过配置 <logger>
标签,你可以控制特定部分代码的日志行为,使其与应用程序的整体日志策略保持一致或独立。
- name:指定此 Logger 的名称,通常是包名或类名,例如 "com.example" 或 "com.example.MyClass"。
- level:设置此 Logger 的日志级别(如 DEBUG、INFO、WARN、ERROR 等)。如果没有指定级别,将继承上层 Logger 的级别。
- additivity:定义日志是否向上层 Logger 传播(默认为 true)。当设置为 false 时,日志只会在当前 Logger 中记录,而不会传播到上层 Logger。
<logger name="cn.cy.server" level="debug" additivity="true/false">
<appender-ref ref="APPENDER_NAME" />
<!-- 其他配置 -->
</logger>
root
root 标签用于配置根日志记录器(Root Logger),它是日志记录层次结构的最高级别。所有日志记录器(Loggers)都会直接或间接地继承 root Logger 的配置,除非它们在 <logger>
标签中有自己的特定配置。
<root level="info">
<appender-ref ref="FILE_ERROR"/>
<appender-ref ref="FILE_WARN"/>
<appender-ref ref="FILE_INFO"/>
<appender-ref ref="STDOUT"/>
</root>
注意
root、Logger 的级别是整个应用程序的基础级别。如果 root 设置为 INFO,则低于 INFO 级别的日志(如 DEBUG 和 TRACE)不会被记录,除非某个特定的 logger 另有配置。
<logger>
和 <root>
的区别
logger 标签:
- 适用于特定包或类,允许你对应用程序的某个部分单独设置日志策略。
- 例如,你可以为
com.example.dao
设置不同的日志级别或输出目标。
root 标签:
- 定义全局 Logger,是应用程序的默认 Logger。
- 所有未被
<logger>
标签明确配置的日志记录器都会继承<root>
的配置。
日志级别
- TRACE:最细粒度的信息。这是比 DEBUG 更低级别的日志,通常用于跟踪程序的每个步骤,包含极其详细的调试信息。
- DEBUG:详细的调试信息。这通常用于开发阶段,帮助开发者理解系统的执行流程。
- INFO:系统运行时的重要事件或信息。这通常用于记录系统的正常运行状态和关键业务操作。
- WARN:潜在的问题或可能影响系统运行的事件。这些问题不一定会导致系统崩溃,但需要注意。
- ERROR:严重错误或系统级故障。这些通常是必须立即处理的问题。
- ALL:记录所有日志。
- OFF:关闭日志记录。
优先级大小
如果设置了某个日志记录器的日志级别,比如 INFO,那么这个日志记录器将会记录 INFO 级别及其更高优先级的日志(即 INFO、WARN、ERROR),但不会记录 DEBUG 和 TRACE 级别的日志。
ERROR > WARN > INFO > DEBUG > TRACE
ALL 和 OFF 是两个特殊的日志级别
- ALL:记录所有级别的日志信息,包括 TRACE 级别。
- OFF:关闭所有日志记录。