logback日志详细解析
1、为什么使用logback
- 内核重写、测试充分、初始化内存加载更小,这一切让logback性能和log4j相比有诸多倍的提升
- logback非常自然地直接实现了slf4j,方便理解
- 支持自动去除旧的日志文件,可以控制已经产生日志文件的最大数量
- 官方自动配置了许多的appender,方便使用
2、springboot中为什么使用logback-spring.xml来代替logback.xml
logback.xml的加载早于application.properties,所以如果在logback.xml中使用了变量,而恰好这个变量是写在application.properties时,那么就会获取不到,只要改成logback-spring.xml就可以解决。
3、属性
(1)configuration
configuration是logback的父节点,它只有三个属性:
- scan
自动加载判断,当配置文件发生改变时,将会被重新加载。默认为true
- scanPeriod
检测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认为毫秒,当scan=true时这个值生效,默认时间间隔为1分钟
- debug
当被设置为true时,将打印出logback内部日志信息,实时查看logback运行信息,默认为false
(2)logger
<logger>用来设置某一个包或者某一个具体类的日志打印级别以及方式。在logger内可以包含零个或者多个appender-ref,然后对应的appender将会被添加到这个logger。它的属性有:
- name
指定对应的包路径或者类路径。
- level
用来设置日志打印的级别,五个常用打印级别从低至高依次为TRACE、DEBUG、INFO、WARN、ERROR,如果未设置此级别,那么当前logger会继承上级的级别
- additivity
是否向上级log传递打印信息,默认为true
(3)root
<root>也是logger元素,但它是根logger,所有logger的最上级,只有一个level属性,它的name固定为ROOT
(4)appender
<appender>是configuration的子节点,它的作用是定义日志输出的方式。它有2个必要的属性:
- name:指定当前appender的名称
- class:指定appender对应的类,控制日志输出方式
(5)encoder
encoder主要负责的是将日志信息转换成字节数组以及将字节数组写到输出流中去。encoder
转换符 | 作用 | ||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
c {length } lo {length } logger {length } |
输出日志的logger名,可有一个整形参数,功能是缩短logger名,设置为0表示只输入logger最右边点符号之后的字符串。
|
||||||||||||||||||||||||
C {length } class {length } |
输出执行记录请求的调用者的全限定名。参数与上面的一样。尽量避免使用,除非执行速度不造成任何问题。 | ||||||||||||||||||||||||
contextName cn |
输出上下文名称。 | ||||||||||||||||||||||||
d {pattern } date {pattern } |
输出日志的打印日志,模式语法与java.text.SimpleDateFormat 兼容。
|
||||||||||||||||||||||||
F / file | 输出执行记录请求的java源文件名。尽量避免使用,除非执行速度不造成任何问题。 | ||||||||||||||||||||||||
caller{depth}caller{depth, evaluator-1, ... evaluator-n} | 输出生成日志的调用者的位置信息,整数选项表示输出信息深度。
例如, %caller{2} 输出为: 0 [main] DEBUG - logging statement Caller+0 at mainPackage.sub.sample.Bar.sampleMethodName(Bar.java:22) Caller+1 at mainPackage.sub.sample.Bar.createLoggingRequest(Bar.java:17) 例如, %caller{3} 输出为: 16 [main] DEBUG - logging statement Caller+0 at mainPackage.sub.sample.Bar.sampleMethodName(Bar.java:22) Caller+1 at mainPackage.sub.sample.Bar.createLoggingRequest(Bar.java:17) Caller+2 at mainPackage.ConfigTester.main(ConfigTester.java:38) |
||||||||||||||||||||||||
L / line | 输出执行日志请求的行号。尽量避免使用,除非执行速度不造成任何问题。 | ||||||||||||||||||||||||
m / msg / message |
输出应用程序提供的信息。 |
||||||||||||||||||||||||
M / method | 输出执行日志请求的方法名。尽量避免使用,除非执行速度不造成任何问题。 | ||||||||||||||||||||||||
n | 输出平台先关的分行符“\n”或者“\r\n”。 | ||||||||||||||||||||||||
p / le / level | 输出日志级别。 | ||||||||||||||||||||||||
r / relative | 输出从程序启动到创建日志记录的时间,单位是毫秒 | ||||||||||||||||||||||||
t / thread | 输出产生日志的线程名。 | ||||||||||||||||||||||||
replace(p ){r, t} |
p 为日志内容,r 是正则表达式,将p 中符合r 的内容替换为t 。 例如, "%replace(%msg){‘\s‘, ‘‘}"
|
(6)filter
<filter>是appender的子节点,表示对当前给定的日志级别再进行一次过滤。配置方式:
<filter class="ch.qos.logback.classic.filter.LevelFilter"><!-- 只打印错误日志 --> <level>ERROR</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter>
4、常用Appender说明
(1)ConsoleAppender
作用是将日志输出到控制台。配置方式为:
<appender name="console" class="ch.qos.logback.core.ConsoleAppender"> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern> </encoder> </appender>
(2)FileAppender
作用是将日志写入到文件中去。配置方式:
<appender name="FILE" class="ch.qos.logback.core.FileAppender"> <file>存储路径</file> <!-- true表示添加到文件结尾,false表示清空文件 --> <append>true</append> <encoder> <pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern> </encoder> </appender>
(3)RollingFileAppender
作用是滚动记录文件,先将文件记录到指定文件,当符合某个条件时,再将文件记录到其他的文件中去。配置方式:
<appender name="ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender"> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!--日志文件输出的文件名--> <FileNamePattern>${LOG_HOME}/error/spring-error-%d{yyyy-MM-dd}.log</FileNamePattern> <!--日志文件保留天数--> <MaxHistory>30</MaxHistory> </rollingPolicy> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符--> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern> </encoder> <!--日志文件最大的大小--> <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"> <MaxFileSize>100MB</MaxFileSize> </triggeringPolicy> <filter class="ch.qos.logback.classic.filter.LevelFilter"><!-- 只打印错误日志 --> <level>ERROR</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> </appender>
(4)异步写日志
通常日志会记录到文件中去,此时写一次就会造成一次磁盘IO,而采取异步写日志方式后,不让此次写日志阻塞线程,造成不必要的性能损耗。配置方式:
<!-- 异步输出 --> <appender name ="ASYNC" class= "ch.qos.logback.classic.AsyncAppender"> <!-- 不丢失日志.默认的,如果队列的80%已满,则会丢弃TRACT、DEBUG、INFO级别的日志 --> <discardingThreshold>0</discardingThreshold> <!-- 更改默认的队列的深度,该值会影响性能.默认值为256 --> <queueSize>512</queueSize> <!-- 添加附加的appender,最多只能添加一个 --> <appender-ref ref ="ERROR"/> </appender>