一、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的输出目的地。可以有多个该元素,表示输出到多个目的地。