slf4j和logback什么关系
slf4j: Simple Logging Facade for Java 简单日志切面For Java,在博客中作者解释是
- “为java提供的简单日志Facade。Facade:门面,更底层一点说就是接口”
但是我认为这里的Facade是指AOP中切面的意思,后半句感觉才是重点,SLF4J提供的是一套接口,并没有具体的实现。有点类似于一个标准,而logbook就是其中一个SLF4J的具体实现
logback配置原理
logback的的配置原理有三点
- 日志分级: 在打印日志时从高到低分为5个级别 error > warn > info > debug > trace 然后在不同分区上(Java包名内)都可以设置
- 日志打印机: 打印机就是Appender,可以设定打印的格式,可以挂在分区内
- 日志分区: 就是根据Java包名来进行区域划分,每个区域都可以设置自己都分级和打印机,根分区是Root
分级、打印机、分区的拟物比较
你可以把整个日志系统想像成一列火车,车头是代码,车尾是打印结果,你抱着代码里的日志走过每一节车厢,每个车厢就是不同的logger(分区,包括root),每一个车厢里放有不同的打印机(appender),然后你走进每一节车厢,都会查看当前车厢的打印等级(level),然后把大于等于车厢等级的日志打印出来,如果在某个车厢里切断了传递(logger的additivity为false),那在以后的车厢包括root就不再打印了,如果某个logger(车厢)没有设定additivity或者appender(打印机),均在最后一节车厢root进行打印。
logback配置讲解
对logback的使用进行简单讲解
配置文件放哪里
配置文件起名叫logback.xml放在resources的根目录下就好,因为logback本身和spring貌似没什么关系,所以也不用在spring里配置
配置文件
根结点
如同spirng配置文件的beans根结点一样,logback的根节点叫做configuration
1 | <?xml version="1.0" encoding="UTF-8"?> |
日志分级和分区
在根结点下可以使用logger标签进行不同的分区,但是一定要记得配置root标签,至少要有root可以没有其他的分区
1 | <configuration> |
在以上这个配置中,最外层的网使用的是WARN级别,而另外两个日志分区
- org.springframework: 仅可以输出 ERROR 级别的日志,由于ROOT可以输出WARN级别的日志,所以最终会被输出两次
- java.sql: 可以输出 ERROR WARN INFO DEBUG 级别的日志,由于additivity被设置了false,所以root不会再次打印
打印机Appender
除了可以对日志进行分类和分级以外,还可以使用不同的Appender标签定义不同的日志输出样式,并且使用一些关键字来获取到程序运行的信息
控制台输出
可以完成控制台输出的类是 ch.qos.logback.core.ConsoleAppender 使用Appender节点配置可以配置它的输出样式
1 | <configuration> |
带有回滚功能的文件输出
除了可以输出到控制台,还可以输出到磁盘文件中,并且还有定期回滚功能的类是 ch.qos.logback.core.rolling.RollingFileAppender
1 | <configuration> |
这里需要注意的是 File 和 fileNamePattern 都是以容器目录为上级目录设定的
关键字占位符
关键字 | 含义 |
---|---|
%date | 时间,可以在后边加{yyyy-MM-dd HH:mm:ss}来规定格式 |
%thread | 线程号 |
%level | 日志等级 |
%c | 类名 |
%line | 发生在哪一行 |
%msg | 日志信息 |
%n | 换行 |
具体的详细配置可以参考官方文档或者网友博客
使用MDC放入自定义信息
MDC是SLF4J提供的一个MAP,可以以KEY-VALUE的形式放入一些关键字,然后在日志的格式里通过 %mdc{KEY} 或者 %X{KEY} 的方式输出Value值,例如
1 | import org.slf4j.MDC; |