一.logback的配置介绍
Logback的配置分为三个内容:Logger、appender及layout
Logger:作为日志的记录器,主要用于存放日志对象,也可以定义日志类型、级别。
appender:主要用于指定日志输出的目的地。目的地可以是控制台、文件、远程套接字服务器、 MySQL、PostreSQL、 Oracle和其他数据库、 JMS和远程UNIX Syslog守护进程等。
Layout:负责把事件转换成字符串,格式化日志信息的输出.
二.Logger context的介绍
各个logger都会被关联到一个LoggerContext上,LoggerContext负责制造logger,也负责以树结构排列各logger.所有的logger都是通过org.slf4j.LoggerFactory类的静态方法getLogger取得。
private Logger logger = LoggerFactory.getLogger(Example.class);
三.Logger级别的打印与规则设置
日志级别分为: TRACE(跟踪) < DEBUG < INFO < WARN < ERROR
如果Logger没有被分配级别,那么它将继承root的默认级别:DEBUG
打印方法决定记录请求的级别。例如,如果 L 是一个 logger 实例,那么,语句 L.info("..")是一条级别为 INFO的记录语句。记录请求的级别在高于或等于其 logger 的有效级别时被称为被启用,否则,称为被禁用。
记录请求级别为 p,其 logger的有效级别为 q,只有则当 p>=q时,该请求才会被执行。
该规则是 logback 的核心。级别排序为: TRACE < DEBUG < INFO < WARN < ERROR
四.Logback的默认配置
当Logback启动后,会在classpath下查找文件logback-test.xml,如果文件不存在会查找logback.xml文件,如果这2个文件都不存在,logback用BasicConfigUrator自动对自己进行配置,这样会导致记录输出到控制台上。
五.logback.xml常用配置详解
1.根节点<configuration>的配置
<configuration scan="true" scanPeriod="60 seconds" debug="false">
<!--其他配置省略-->
</configuration>
scan: 当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true。
scanPeriod: 设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。
debug: 当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。
2.子节点<contextName>
作用:用来设置上下文名称,每个logger都关联到logger上下文,默认上下文名称为default。但可以使用<contextName>设置成其他名字,用于区分不同应用程序的记录。一旦设置,不能修改。
<configuration scan="true" scanPeriod="60 seconds" debug="false">
<contextName>myAppName</contextName>
<!--其他配置省略-->
</configuration>
3.子节点<property>
作用:用来定义变量值,它有两个属性name和value,通过<property>定义的值会被插入到logger上下文中,可以使”${}”来使用变量。
<configuration scan="true" scanPeriod="60 seconds" debug="false"> <property name="APP_Name" value="myAppName" /> name: 变量的名称 value: 的值时变量定义的值 <contextName>${APP_Name}</contextName> <!--其他配置省略--> </configuration>
4.子节点<timestamp>
作用:获取时间戳字符串,他有两个属性key和datePattern
<configuration scan="true" scanPeriod="60 seconds" debug="false"> <timestamp key="bySecond" datePattern="yyyyMMdd'T'HHmmss"/> key: 标识此<timestamp> 的名字; datePattern: 设置将当前时间(解析配置文件的时间)转换为字符串的模式,遵循java.txt.SimpleDateFormat的格式。 <contextName>${bySecond}</contextName> <!-- 其他配置省略--> </configuration>
5.子节点<appender>
作用:负责写日志的组件,它有两个必要属性name和class。name指定appender名称,class指定appender的全限定名,name的不同,也决定了这个appender的作用不同
5.1当class为:ConsoleAppender时,表示要将日志打印到控制台,有以下属性
<encoder>:对日志进行格式化
<target>:字符串System.out(默认)或者System.err(区别不多说了)
<configuration> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>%-4relative [%thread] %-5level %logger{35} - %msg %n</pattern> </encoder> </appender> <root level="DEBUG"> <appender-ref ref="STDOUT" /> </root> </configuration>
此配置表示: 把 >= DEBUG 级别的日志都输出到控制台上
5.2 当class为FileAppender时:表示把日志添加到文件中。有以下属性
<file>:被写入的文件名,可以是相对目录,也可以是绝对目录,如果上级目录不存在会自动创建,没有默认值。
<append>:如果是 true,日志被追加到文件结尾,如果是 false,清空现存文件,默认是true。
<encoder>:对记录事件进行格式化.负责两件事,一是把日志信息转换成字节数组,二是把字节数组写入到输出流。
<prudent>:如果是 true,日志会被安全的写入文件,即使其他的FileAppender也在向此文件做写入操作,效率低,默认是 false。(如果设置成了true其它的FileAppender也可以向该文件中写,就是速度慢)
<configuration> <appender name="FILE" class="ch.qos.logback.core.FileAppender"> <file>testFile.log</file> <append>true</append> <encoder> <pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern> </encoder> </appender> <root level="DEBUG"> <appender-ref ref="FILE" /> </root> </configuration>
上述配置表示: 把>=DEBUG级别的日志都输出到testFile.log
5.3当class为RollingFileAppender:表示滚动记录文件,先将日志记录到指定的文件上,当符合某个条件时,会将日志记录到其它文件上。有以下属性:
<file>:被写入的文件名,可以是相对目录,也可以是绝对目录,如果上级目录不存在会自动创建,没有默认值。
<append>:如果是 true,日志被追加到文件结尾,如果是 false,清空现存文件,默认是true。
<rollingPolicy>:当发生滚动时,会根据class定义的滚动策略来决定RollingFileAppender的行为,可能是文件移动和重命名。
在这里请注意:FollingFileAppender下的rollingPolicy策略有4种,这里只介绍一种最常用的SizeAndTimeBasedRollingPolicy
当rollingPolicy的class为SizeAndTimeBasedRollingPolicy:表示按照文件的大小和日期生成日志文件
<fileNamePattern>:生成文件的名字
<maxFileSize> :生成文件的大小
<maxHistory> :保存日志文件的日期,以天为单位
<totalSizeCap> :保存日志的最大容量
注意:在配置<fileNamePattern>时,按日期格式化的配置 .%d{yyyy-MM-dd}.%i 是不能更改的,否则会失效
<?xml version="1.0" encoding="UTF-8"?> <configuration scan="true" scanPeriod="60 seconds" debug="false"> <property name="LOG_HOME" value="D:logs" /> <!-- 滚动记录文件 --> <appender name="metrics" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>${LOG_HOME}metrics.log</file> <append>true</append> <!-- 每天创建1个日志 文件,当超过1MB时创建新的文件--> <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy" > <fileNamePattern>${LOG_HOME}metrics.%d{yyyy-MM-dd}.%i.log</fileNamePattern> <!-- 注意标红这里是不能更改的,必须包含的元素 --> <maxFileSize>1MB</maxFileSize> <maxHistory>30</maxHistory> <totalSizeCap>3GB</totalSizeCap> </rollingPolicy> <encoder> <pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n|==|%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern> </encoder> </appender> <logger name="metrics.zpb" level="info" additivity="false"> <appender-ref ref="metrics"/> </logger> <root level="INFO"> <appender-ref ref="metrics"/> </root> </configuration>
6.子节点<loger>
作用:用来设置打印哪一个包下的日志或者某一具体类的日志,以及打印的级别,以及指定<appender>
<loger>仅有一个name属性,一个可选的level和一个可选的addtivity属性
name: 用来指定受此loger约束的某一包或者具体的某一个类
Level: 用来设置打印级别,大小写无关,:trace < debug <info < warn < error < all < off
还有一特定值,INHERITED或同义词NULL,代表强制执行上级的级别,如果未设置些属性,那么当前logger将会继承上级的级别
addtivity: 是否向上级loger传递打印信息。默认是true,同<logger>一样,可以包含零个或多个
<appender-ref>元素,标识这个appender将会添加到这个loger
7.子节点<root>
作用:根节点,其实它也是一个loger,只不过是loger的顶级,只有一个level属性
level: 用来设置打印级别,大小无关,trace < debug <info < warn < error < all < off
不能设置为INHERITED或者同义词NULL,默认是DEBUG
六.logback所需jar包
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.7</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>1.1.7</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-access</artifactId>
<version>1.1.7</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.1.7</version>
</dependency>
七.自定义输出格式
%m 输出代码中指定的消息 %p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL %r 输出自应用启动到输出该log信息耗费的毫秒数 %c 输出所属的类目,通常就是所在类的全名 %t 输出产生该日志事件的线程名 %n 输出一个回车换行符,Windows平台为“ ”,Unix平台为“ ” %d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS},输出类似:2002年10月18日 22:10:28,921 %L 输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数。举例:Testlog4.main(TestLog4.java:10)
八.示例
<?xml version="1.0" encoding="UTF-8"?> <configuration scan="true" scanPeriod="60 seconds" debug="false"> <!-- 输出到控制台上 --> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss}| %-5level|%c %L|%m%n</pattern> </encoder> </appender> <logger name="com.zpb.metrics" level="debug" additivity="false"> <appender-ref ref="STDOUT"/> </logger> <!-- 输出到文件上 --> <appender name="metrics" class="ch.qos.logback.core.FileAppender"> <File>D:logsmetrics.log</File> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss}| %-5level|%c|%m %n</pattern> </encoder> </appender> <!-- logger 中的配置的解释: name: 从指定的包路径下接收日志 level: 设置日志接收的级别 additivity:表示此logger信息不再向上级传递 --> <logger name="com.metrics.zpb" level="info" additivity="false"> <appender-ref ref="metrics"/> </logger> <root level="INFO"> <appender-ref ref="STDOUT" /> <appender-ref ref="metrics"/> </root> </configuration>
此配置表示:将不同级别的日志分别输出到控制台和日志文件中