- 跑起来
- 配置项
- 工做原理
巴拉巴拉。。。 (为何这么玩,有什么好处 google it)html
说明: 本篇主要偏应用为主,介绍了如何使用logback, 以及相关的配置,对于这个东西的实现原理以及工做机制,没有涉入; 此外大部份内容来源于互联网,博客,这里只是给了一个梳理和小结,方便一键式接入java
官方文档 http://logback.qos.ch/manual/index.html算法
maven依赖:app
<dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>${logback.version}</version> </dependency>
代码中使用方式maven
package com.mushroom.hui; public class LogTest { private static final org.slf4j.Logger logger = org.slf4j.LoggerFactory(LogTest.class); @Test public void logTest() { logger.info("hello wolrd! This is in method {}, print by {}", "logTest", "yihui"); } }
完成上面的这些,测试一下,发现控制台没有任何输出,由于缺了配置文件测试
配置文件在log4j里一般叫作log4j.xml,在logback里是logback.xml,或者,在测试环境里叫作logback-test.xml。ui
在Maven project里,logback.xml文件必须放在$PROJECT_HOME/src/main/resources目录中。logback-test.xml文件必须放在$PROJECT_HOME/src/test/resources目录中google
ok,在测试工程中添加一个 logback-test.xml 配置文件:lua
<configuration> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <!-- encoders are assigned the type ch.qos.logback.classic.encoder.PatternLayoutEncoder by default --> <encoder> <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern> </encoder> </appender> <root level="debug"> <appender-ref ref="STDOUT" /> </root> </configuration>
顺带提一句,xml加载顺序是: logback.groovy -> logback.xml -> logback-test.xml -> default(默认)debug
上面就有一个简单的配置文件,首先对出现的几个节点(<节点>)进行说明
从这霸气的名字能够看出,这货就是根节点,定义一些配置相关信息
scan: 当此属性设置为true时,配置文件若是发生改变,将会被从新加载,默认值为true。
scanPeriod: 设置监测配置文件是否有修改的时间间隔,若是没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。
debug: 当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。
<!-- 部署出logback内部日志信息,每隔60s判断一下配置文件有没有个更新,若更新,则从新加载 --> <configuration debug="false" scan="true" scanPeriod="60 seconds">
每一个logger都关联到logger上下文,默认上下文名称为“default”。但可使用<contextName>设置成其余名字,用于区分不一样应用程序的记录。一旦设置,不能修改。
用来定义变量值的标签,<property> 有两个属性,name和value;其中name的值是变量的名称,value的值时变量定义的值。经过<property>定义的值会被插入到logger上下文中。定义变量后,可使${}
来使用变量。
<configuration> <property name="CONTEXT_NAME" value="test"/> <contextName> ${CONTEXT_NAME} </contextName> </configuration>
<timestamp>
两个属性 key:标识此<timestamp>
的名字;datePattern:设置将当前时间(解析配置文件的时间)转换为字符串的模式,遵循java.txt.SimpleDateFormat的格式
<configuration scan="true" scanPeriod="60 seconds" debug="false"> <timestamp key="bySecond" datePattern="yyyyMMdd'T'HHmmss"/> <contextName>${bySecond}</contextName> <!-- 其余配置省略--> </configuration>
下面一大串文字的描述(网上copy来),简单来讲loger就是指定类or包的输出级别
<level>
指定打印级别
<name>
指定包名or类名,或一个固定的约束条件
<logger>
用来设置某一个包或者具体的某一个类的日志打印级别、以及指定<appender>
。<logger>
仅有一个name属性,一个可选的level和一个可选的addtivity属性。
name: 用来指定受此loger约束的某一个包或者具体的某一个类。
level: 用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,还有一个特俗值INHERITED或者同义词NULL,表明强制执行上级的级别。 若是未设置此属性,那么当前loger将会继承上级的级别。
addtivity: 是否向上级loger传递打印信息。默认是true。 <loger>能够包含零个或多个<appender-ref>元素,标识这个appender将会添加到这个loger。
<root>
也是<logger>
元素,可是它是根loger。只有一个level属性,应为已经被命名为"root".
level: 默认是DEBUG。
<root>
能够包含零个或多个<appender-ref>
元素,标识这个appender将会添加到这个loger。
如上面的java文件对应的配置能够是下面的:
<logger name="com.mushroom.hui" level="INFO" /> <!--若是上面的JAVA中的logger获取是: --> <!-- Logger logger = LoggerFactor.getLogger("logTest")--> <logger name="logTest" level="DEBUG" />
上面的logger有一个 <append-ref>
的东西,从名字很容易看出就是一个引用 <append>
<appender>
是<configuration>
的子节点,是负责写日志的组件。两个必要属性name和class。name指定appender名称,class指定appender的全限定名。
下面是一个天天生成一个文件,保存30天的配置项
<configuration> <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>logFile.%d{yyyy-MM-dd}.log</fileNamePattern> <maxHistory>30</maxHistory> </rollingPolicy> <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"> <maxFileSize>5MB</maxFileSize> <!-- 当文件大于5MB时,分拆一下日志文件--> </triggeringPolicy> <encoder> <pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern> </encoder> </appender> <root level="DEBUG"> <appender-ref ref="FILE" /> </root> </configuration>
<append-ref>
指定的ref值这两个都比较简单,直接上代码说明
<configuration> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>%-4relative [%thread] %-5level %logger{35} - %msg %n</pattern> </encoder> </appender> <logger name="test" level="DEBUG" /> <appender name="FILE" class="ch.qos.logback.core.FileAppender"> <file>testFile.log</file> <!-- 文件名,这里是相对路径,也能够指定绝对路径 --> <append>true</append> <!-- true 表示追加写方式,默认就是true,所以这个常省略 --> <encoder> <pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern> </encoder> </appender> <root level="INFO"> <appender-ref ref="FILE" /> </root> </configuration>
如上面的天天记录一个日志文件,并保存30天,就是用搞这个模式来玩的,对比上面的两个xml(主要看fileAppender与rollingFileAppender)
RollingPolicy 这个是主要关注点,用来指定滚动策略的
- TimeBasedRollingPolicy:根据时间来滚动,最多见的一种 fileNamePattern: 文件名 maxHistory: 最多保存的时间 - FixedWindowRollingPolicy: 根据固定窗口算法重命名文件的滚动策略
triggeringPolicy 根据文件大小进行拆日志文件,当大于指定的文件时
SizeBasedTriggeringPolicy: 查看当前活动文件的大小,若是超过指定大小会告知 RollingFileAppender 触发当前活动文件滚动。只有一个节点: `<maxFileSize>`:这是活动文件的大小,默认值是10MB。
配合appender使用,过滤日志
过滤器,执行一个过滤器会有返回个枚举值,即DENY,NEUTRAL,ACCEPT其中之一。返回DENY,日志将当即被抛弃再也不通过其余过滤器;返回NEUTRAL,有序列表里的下个过滤器过接着处理日志;返回ACCEPT,日志会被当即处理,再也不通过剩余过滤器。
级别过滤器,根据日志级别进行过滤。若是日志级别等于配置级别,过滤器会根据onMath 和 onMismatch接收或拒绝日志。有如下子节点:
<level>
:设置过滤级别 <onMatch>
:用于配置符合过滤条件的操做 <onMismatch>
:用于配置不符合过滤条件的操做
过滤掉低于指定临界值的日志。当日志级别等于或高于临界值时,过滤器返回NEUTRAL;当日志级别低于临界值时,日志会被拒绝
<level>
:设置过滤级别
不经常使用,有兴趣官网走起