一、logback的三个主要模块
1.logback-core:提供基本的日志功能;
2.logback-classic:建立在logback-core之上,兼容SLF4和log4jAPI,提供一套强大的日志框架;
3.logback-access:允许通过servlet容器的访问日志功能来记录HTTP请求。
二、优点
1.性能高:被设计为高性能日志框架,有较低的运行是开销,异步日志记录和可配置的缓冲机制有助于提高性能;
2.灵活配置:采用xml格式,允许声明式配置日志输出;
3.丰富的appender;
4.API简单而强大;
5.广泛的社区支持。
三、配置文件的基本结构

四、xml配置文件完整示例
1.同步配置文件
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <!-- 日志存放路径 -->
 <property name="log.path" value="/data/xjdoc/logs" />
    <!-- 日志输出格式 -->
 <property name="log.pattern" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{20} - [%method,%line] - %msg%n" />
 <!-- 控制台输出 -->
 <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
  <encoder>
   <pattern>${log.pattern}</pattern>
  </encoder>
 </appender>
 
 <!-- 系统日志输出 -->
 <appender name="file_info" class="ch.qos.logback.core.rolling.RollingFileAppender">
     <file>${log.path}/sys-info.log</file>
        <!-- 循环政策:基于时间创建日志文件 -->
  <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 日志文件名格式 -->
   <fileNamePattern>${log.path}/sys-info.%d{yyyy-MM-dd}.log</fileNamePattern>
   <!-- 日志最大的历史 60天 -->
   <maxHistory>60</maxHistory>
  </rollingPolicy>
  <encoder>
   <pattern>${log.pattern}</pattern>
  </encoder>
  <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <!-- 过滤的级别 -->
            <level>INFO</level>
            <!-- 匹配时的操作:接收(记录) -->
            <onMatch>ACCEPT</onMatch>
            <!-- 不匹配时的操作:拒绝(不记录) -->
            <onMismatch>DENY</onMismatch>
        </filter>
 </appender>
 
 <appender name="file_error" class="ch.qos.logback.core.rolling.RollingFileAppender">
     <file>${log.path}/sys-error.log</file>
        <!-- 循环政策:基于时间创建日志文件 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 日志文件名格式 -->
            <fileNamePattern>${log.path}/sys-error.%d{yyyy-MM-dd}.log</fileNamePattern>
   <!-- 日志最大的历史 60天 -->
   <maxHistory>60</maxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>${log.pattern}</pattern>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <!-- 过滤的级别 -->
            <level>ERROR</level>
   <!-- 匹配时的操作:接收(记录) -->
            <onMatch>ACCEPT</onMatch>
   <!-- 不匹配时的操作:拒绝(不记录) -->
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>
 <!-- 系统模块日志级别控制  -->
 <logger name="cn.xj" level="info" />
 <!-- Spring日志级别控制  -->
 <logger name="org.springframework" level="warn" />
 
 <!--系统操作日志-->
    <root level="info">
       <appender-ref ref="console" />
        <appender-ref ref="file_info" />
        <appender-ref ref="file_error" />
    </root>
</configuration>  
2.异步配置文件
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <!-- 日志存放路径 -->
 <property name="log.path" value="/data/xjdoc/logs" />
    <!-- 日志输出格式 -->
 <property name="log.pattern" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{20} - [%method,%line] - %msg%n" />
 <!-- 控制台输出 -->
 <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
  <encoder>
   <pattern>${log.pattern}</pattern>
  </encoder>
 </appender>
 
 <!-- 系统日志输出 -->
 <appender name="file_info" class="ch.qos.logback.core.rolling.RollingFileAppender">
     <file>${log.path}/sys-info.log</file>
        <!-- 循环政策:基于时间创建日志文件 -->
  <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 日志文件名格式 -->
   <fileNamePattern>${log.path}/sys-info.%d{yyyy-MM-dd}.log</fileNamePattern>
   <!-- 日志最大的历史 60天 -->
   <maxHistory>60</maxHistory>
  </rollingPolicy>
  <encoder>
   <pattern>${log.pattern}</pattern>
  </encoder>
  <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <!-- 过滤的级别 -->
            <level>INFO</level>
            <!-- 匹配时的操作:接收(记录) -->
            <onMatch>ACCEPT</onMatch>
            <!-- 不匹配时的操作:拒绝(不记录) -->
            <onMismatch>DENY</onMismatch>
        </filter>
 </appender>
 
 <appender name="file_error" class="ch.qos.logback.core.rolling.RollingFileAppender">
     <file>${log.path}/sys-error.log</file>
        <!-- 循环政策:基于时间创建日志文件 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 日志文件名格式 -->
            <fileNamePattern>${log.path}/sys-error.%d{yyyy-MM-dd}.log</fileNamePattern>
   <!-- 日志最大的历史 60天 -->
   <maxHistory>60</maxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>${log.pattern}</pattern>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <!-- 过滤的级别 -->
            <level>ERROR</level>
   <!-- 匹配时的操作:接收(记录) -->
            <onMatch>ACCEPT</onMatch>
   <!-- 不匹配时的操作:拒绝(不记录) -->
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>
    <appender name="async_file_info" class="ch.qos.logback.classic.AsyncAppender">
        <!--  当队列的剩余容量小于这个阈值并且当前日志level为 TRACE, DEBUG or INFO ,则丢弃这些日志。  -->
        <discardingThreshold>0</discardingThreshold>
        <!--  更改默认的队列的深度,该值会影响性能.默认值为256  -->
        <queueSize>1024</queueSize>
        <!--  新增这行为了打印栈堆信息  -->
        <includeCallerData>true</includeCallerData>
        <!--  添加附加的appender,最多只能添加一个  -->
        <appender-ref ref="file_info"/>
    </appender>
    <appender name="async_file_error" class="ch.qos.logback.classic.AsyncAppender">
        <!--  当队列的剩余容量小于这个阈值并且当前日志level为 TRACE, DEBUG or INFO ,则丢弃这些日志。  -->
        <discardingThreshold>0</discardingThreshold>
        <!--  更改默认的队列的深度,该值会影响性能.默认值为256  -->
        <queueSize>1024</queueSize>
        <!--  新增这行为了打印栈堆信息  -->
        <includeCallerData>true</includeCallerData>
        <!--  添加附加的appender,最多只能添加一个  -->
        <appender-ref ref="file_error"/>
    </appender>
    <appender name="async_file_debug" class="ch.qos.logback.classic.AsyncAppender">
        <!--  当队列的剩余容量小于这个阈值并且当前日志level为 TRACE, DEBUG or INFO ,则丢弃这些日志。  -->
        <discardingThreshold>0</discardingThreshold>
        <!--  更改默认的队列的深度,该值会影响性能.默认值为256  -->
        <queueSize>1024</queueSize>
        <!--  新增这行为了打印栈堆信息  -->
        <includeCallerData>true</includeCallerData>
        <!--  添加附加的appender,最多只能添加一个  -->
        <appender-ref ref="file_debug"/>
    </appender>
    <!-- 系统模块日志级别控制  -->
    <logger name="cn.xj" level="info" />
    <!-- Spring日志级别控制  -->
    <logger name="org.springframework" level="warn" />
 
 <!--系统操作日志-->
    <root level="info">
        <appender-ref ref="console" />
        <appender-ref ref="async_file_info" />
        <appender-ref ref="async_file_error" />
    </root>
</configuration>  
五、xml配置详解
1.property
<!-- 日志存放路径 -->
 <property name="log.path" value="/data/game/logs" />
    <!-- 日志输出格式 -->
 <property name="log.pattern" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{20} - [%method,%line] - %msg%n" /> 
log.path:定义了一个名为log.path的属性,值为/data/game/logs。这个属性可以在配置文件的其他地方通过${log.path}进行引用。这种属性一般用于用于同一管理日志的存放路径,方便修改。
log.pattern:这个属性可以在也可以用上述方法在别处引用,同一管理日志的输出格式,方便修改。
· %d{HH:mm:ss.SSS}:输出日志的时间戳,精确到毫秒;
|   转换模式  |   结果示例  | 
|   %d  |   2024-6-22 16:58:59,812  | 
|   %date  |   2024-6-22 16:58:59,812  | 
|   %date{ISO8601}  |   2024-6-22 16:58:59,812  | 
|   %date{HH:mm:ss.SSS}  |   16:58:59,812  | 
|   %d{HH:mm:ss.SSS}  |   16:58:59,812  | 
|   %date{dd MMM yyyy;HH:mm:ss.SSS}  |   22 jun.2024;16:58:59,812  | 
· [%thread]:输出线程名;
· %-5level:输出日志级别,左对齐占5个字符宽度;
· %logger{20}:输出logger名称,占20个字符的宽度;
· [%method,%line]:输出调用方法和行号;
· %msg:输出日志消息;
· %n:输出平台特定的换行符。
2.appender
<appender name="file_info" class="ch.qos.logback.core.rolling.RollingFileAppender">
     <file>${log.path}/sys-info.log</file>
        <!-- 循环政策:基于时间创建日志文件 -->
  <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 日志文件名格式 -->
   <fileNamePattern>${log.path}/sys-info.%d{yyyy-MM-dd}.log</fileNamePattern>
   <!-- 日志最大的历史 60天 -->
   <maxHistory>60</maxHistory>
  </rollingPolicy>
  <encoder>
   <pattern>${log.pattern}</pattern>
  </encoder>
  <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <!-- 过滤的级别 -->
            <level>INFO</level>
            <!-- 匹配时的操作:接收(记录) -->
            <onMatch>ACCEPT</onMatch>
            <!-- 不匹配时的操作:拒绝(不记录) -->
            <onMismatch>DENY</onMismatch>
        </filter>
 </appender> 
ConsoleAppender(控制台输出):class="ch.qos.logback.ConsoleAppender"
用于将日志输出到控制台,主要用于开发金额调试时观察日志。
FileAppender(文件输出):class="ch.qos.logback.core.FileAppender"
用于将日志输出到文件,可以配置文件路径、文件名等参数。
RollingFileAppender(滚动文件输出):class="ch.qos.logback.core.RollingFileAppender"
在FileAppender的基础上支持滚动策略,可以按照一定的规则滚动创建日志文件,例如:按照时间没一天或一个小时将日志输出成文件,并定义文件名为输出时间。
AsyncAppender(异步输出):class="ch.qos.logback.core.AsyncAppender"
用于异步输出日志,可以提高性能,特别适用于高吞吐的应用,包装其他Appender,将日志记录过程一步执行。
滚动策略( 元素)
· TimeBasedRollingPolicy (基于时间的滚动策略):按照一定时间间隔滚动创建新的日志文件,fileNamePattern属性定义了日志文件名的格式,可以包含时间相关的占位符,例如:%d{yyyy-MM-dd}。
· SizeAndTimeBasedRollingPolicy(基于时间和大小的滚动策略):同时基于时间和文件大小的滚动策略,既可以按照时间滚动,又可以在文件达到一定大小时滚动创建新的日志文件。里面永阳可以使用fileNamePattern来定义文件名。maxFileSize属性定义了每个日志文件的最大大小。
· FixedWindowRollingPolicy(固定窗口的滚动策略):固定窗口的滚动策略,按照一定的窗口大小滚动创建新的日志文件。
· SizeBasedTriggeringPolicy(基于大小触发滚动策略):基于文件的大小触发滚动的策略,当当前文件大小达到一定的阈值是触发滚动。
· TimeBasedFileNamingAndTriggeringPolicy(基于时间的文件命名和触发策略):按照一定的时间间隔和文件名格式触发滚动。
<encoder>元素:用于配置日志的输出格式,${log.pattern}引用了之前定义的属性。
<filter>元素:
· 使用ch.qos.logback.classic.filter.LevelFilter过滤器,仅接受INFO级别的日志记录;
· onMatch指定匹配时的操作为接受(ACCEPT);
· onMismatch指定不匹配时的操作为拒绝(DENY)。
3.logger
    <!-- 系统模块日志级别控制  -->
    <logger name="cn.xj" level="info" />
    <!-- Spring日志级别控制  -->
    <logger name="org.springframework" level="warn" /> 
name属性:通常使用类名或者报名来指定Logger;
level属性:定义日志级别,标配是记录的日志消息级别。可选值包括:
· TRACE(追踪):最低级别的日志,用于记录程序的详细执行信息,日志量较大,一般不用;
· DEBUG(调试):用于输出调试信息,有助于定位问题,包含详细的变量信息和方法调用堆栈等;
· INFO(信息):用于记录一般性的信息,表示程序执行的正常流程。显示重要的运行时信息,通常用于生产环境,没有明确指出日志等级时,默认是INFO级别;
· WARN(警告):用于记录一些可能需要关注的问题,但不会导致程序失败,表示程序遇到了默写问题和潜在的错误,但是仍然可以执行;
· ERROR(错误):用于记录程序的错误和异常情况。
4.root
    <root level="info">
        <appender-ref ref="console" />
        <appender-ref ref="async_file_info" />
        <appender-ref ref="async_file_error" />
    </root> 
level属性:定义了根Logger的默认日志级别,表示整个日志系统的最低输出级别;
<appender-ref>元素:用于引用一个或多个Appender,将其关联到根Logger,即设置根Logger的输出目的地。可以有多个该元素,表示输出到多个目的地。
















![【2024最新华为OD-C/D卷试题汇总】[支持在线评测] LYA的巡演(100分) - 三语言AC题解(Python/Java/Cpp)](https://img-blog.csdnimg.cn/direct/a2b2f85b50134deebe9b053692534dd4.png)
