Logback简介
logback是一个开源的日志组件,是log4j的作者开发的用来替代log4j的。
logback由三个部分组成,logback-core, logback-classic, logback-access。其中logback-core是其他两个模块的基础。
logback-classic:它是log4j的一个改良版本,同时它完整实现了slf4j API,使我们可以在其他日志系统,如log4j和JDK14 Logging中进行转换
logback-access:访问模块和Servlet容器集成,提供通过Http来访问日志的功能
<?xml version="1.0" encoding="UTF-8"?><!-- scan属性是true时,如果配置文档发生改变将会进行重新加载 --><!-- scanPeriod属性设置监测配置文件修改的时间间隔,默认单位为毫秒,在scan为true时才生效 --><!-- debug属性如果为true时,会打印出logback内部的日志信息 --><configuration scan="true" scanPeriod="60 seconds" debug="false"><!-- 定义参数常量 --><!-- 日志级别:TRACE<DEBUG<INFO<WARN<ERROR,其中常用的是DEBUG、INFO和ERROR --><property name="log.level" value="debug" /><!-- 文件保留时间 --><property name="log.maxHistory" value="30" /><!-- 日志存储路径 --><property name="log.filePath" value="${catalina.base}/logs/webapps" /><!-- 日志的显式格式 --><property name="log.pattern"value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50}-%msg%n"></property><!-- 用于说明输出介质,此处说明控制台输出 --><appender name="consoleAppender"class="ch.qos.logback.core.ConsoleAppender"><!-- 类似于layout,除了将时间转化为数组,还会将转换后的数组输出到相应的文件中 --><encoder><!-- 定义日志的输出格式 --><pattern>${log.pattern}</pattern></encoder></appender><!-- DEBUG,表示文件随着时间的推移按时间生成日志文件 --><appender name="debugAppender"class="ch.qos.logback.core.rolling.RollingFileAppender"><!-- 文件路径 --><file>${log.filePath}/debug.log</file><!-- 滚动策略 --><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><!-- 设置文件名称 --><fileNamePattern>${log.filePath}/debug/debug.%d{yyyy-MM-dd}.log.gz</fileNamePattern><!-- 设置最大保存周期 --><MaxHistory>${log.maxHistory}</MaxHistory></rollingPolicy><encoder><pattern>${log.pattern}</pattern></encoder><!-- 过滤器,过滤掉不是指定日志水平的日志 --><filter class="ch.qos.logback.classic.filter.LevelFilter"><!-- 设置日志级别 --><level>DEBUG</level><!-- 如果跟该日志水平相匹配,则接受 --><onMatch>ACCEPT</onMatch><!-- 如果跟该日志水平不匹配,则过滤掉 --><onMismatch>DENY</onMismatch></filter></appender><!-- INFO,表示文件随着时间的推移按时间生成日志文件 --><appender name="infoAppender"class="ch.qos.logback.core.rolling.RollingFileAppender"><!-- 文件路径 --><file>${log.filePath}/info.log</file><!-- 滚动策略 --><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><!-- 设置文件名称 --><fileNamePattern>${log.filePath}/info/info.%d{yyyy-MM-dd}.log.gz</fileNamePattern><!-- 设置最大保存周期 --><MaxHistory>${log.maxHistory}</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><!-- ERROR,表示文件随着时间的推移按时间生成日志文件 --><appender name="errorAppender"class="ch.qos.logback.core.rolling.RollingFileAppender"><!-- 文件路径 --><file>${log.filePath}/error.log</file><!-- 滚动策略 --><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><!-- 设置文件名称 --><fileNamePattern>${log.filePath}/error/error.%d{yyyy-MM-dd}.log.gz</fileNamePattern><!-- 设置最大保存周期 --><MaxHistory>${log.maxHistory}</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><!-- 用于存放日志对象,同时指定关联的package位置 --><!-- name指定关联的package --><!-- level表明指记录哪个日志级别以上的日志 --><!-- appender-ref指定logger向哪个文件输出日志信息 --><!-- additivity为true时,logger会把根logger的日志输出地址加入进来,但logger水平不依赖于根logger --><logger name="<包名>" level="${log.level}" additivity="true"><appender-ref ref="debugAppender" /><appender-ref ref="infoAppender" /><appender-ref ref="errorAppender" /></logger><!-- 特殊的logger,根logger --><root lever="info"><!-- 指定默认的日志输出 --><appender-ref ref="consoleAppender" /></root></configuration>
流程
configuration
一个 logback.xml 的所有配置是包含在 configuration 里面的。
<?xml version="1.0" encoding="UTF-8"?>
<configuration ...>
...
</configuration>
configuration 的参数有:
- scan: 属性值为 true / false 表示,如果配置文件发生改变的时候,就重新进行加载
- scanPeriod: 60 seconds 表示 60 毫秒检查一次。 只有 scan = true 的时候才有效
- debug: 如果为 true 会打印出 logback 的内部日志信息
定义变量
<property name="log.level" value="debug" />
<!-- 文件保留时间 -->
<property name="log.maxHistory" value="30" />
<!-- 日志存储路径 -->
<property name="log.filePath" value="logs" />
<!-- 日志的显式格式 -->
<property name="log.pattern"
value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50}-%msg%n"></property>
使用变量
<appender name="consoleAppender"
class="ch.qos.logback.core.ConsoleAppender">
<!-- 类似于layout,除了将时间转化为数组,还会将转换后的数组输出到相应的文件中 -->
<encoder>
<!-- 定义日志的输出格式 -->
<pattern>${log.pattern}</pattern>
</encoder>
</appender>
appender
appender 就是我们定义日志输出的详细配置
首先是定义命令行输出:
<!-- 用于说明输出介质,此处说明控制台输出 -->
<appender name="consoleAppender"
class="ch.qos.logback.core.ConsoleAppender">
<!-- 类似于layout,除了将时间转化为数组,还会将转换后的数组输出到相应的文件中 -->
<encoder>
<!-- 定义日志的输出格式 -->
<pattern>${log.pattern}</pattern>
</encoder>
</appender>
接着是定义日志输出到文件
<appender name="debugAppender"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 文件路径 -->
<file>${log.filePath}/debug.log</file>
<!-- 滚动策略 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 设置文件名称 -->
<fileNamePattern>
${log.filePath}/debug/debug.%d{yyyy-MM-dd}.log.gz
</fileNamePattern>
<!-- 设置最大保存周期 -->
<MaxHistory>${log.maxHistory}</MaxHistory>
<totalSizeCap>20GB</totalSizeCap>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<!--文件达到最大10MB时会被压缩和切割-->
<maxFileSize>10MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<encoder>
<pattern>${log.pattern}</pattern>
</encoder>
<!-- 过滤器,过滤掉不是指定日志水平的日志 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<!-- 设置日志级别 -->
<level>DEBUG</level>
<!-- 如果跟该日志水平相匹配,则接受 -->
<onMatch>ACCEPT</onMatch>
<!-- 如果跟该日志水平不匹配,则过滤掉 -->
<onMismatch>DENY</onMismatch>
</filter>
</appender>
这里就有比较多的属性,可以了解一下
file: 文件路径
rollingPolicy: 滚动策略,因为日志是不断增加的,所以按照日期来生产log
fileNamePattern: 文件名规则
MaxHistory: 最大保留周期
totalSizeCap: 最大容量
timeBasedFileNamingAndTriggeringPolicy: maxFileSize 文件到达这个容量将进行切割
encoder: pattern, 输出规则
filter: 级别过滤器,如果符合这个级别才进行记录,否则就不进行记录。
日志级别由低到高: trace < debug < info < warm < error
所以 debug 会记录 debug及以上的
logger
指定具体的 logger, 针对包名,指定具体监听的logger, 比如
<logger name="<包名>" level="${log.level}" additivity="true">
<appender-ref ref="debugAppender" />
<appender-ref ref="infoAppender" />
<appender-ref ref="errorAppender" />
</logger>
这里针对这个包名,我们指定了三个监听的 logger, 只要有关这个包的输出,都会被记录到文件中
root
指定默认的日志输出
<root lever="info">
<!-- 指定默认的日志输出 -->
<appender-ref ref="debugAppender" />
<appender-ref ref="consoleAppender" />
</root>
这里是最基本的日志输出。 也是必须配置。这里我们设置了两个,一个是输出到文件,一个是命令行输出
