Logback 主要的三个类 logger,appender和layouts。这三个组件一起作用可以满足我们开发中根据消息的类型以及日志的级别打印日志到不同的地方。
logger是生产日志的原料厂;layout是日志的加工厂,主要用于对日志进行格式化;appender是交通工具,主要是把layout格式化好的日志信息以流的形式发送到磁盘等目的地。
LoggerContext负责生产Logger,通过一个树状的层次结构来进行管理。上一篇文章我们讲到,logger是root是该树状结构的根,也就是所有logger的老祖宗,默认DEBUG级别。如果当前节点设置了日志级别,就不会考虑父类的日志级别。Logger 通过日志级别控制日志的启用和禁用。日志级别 TRACE < DEBUG < INFO < WARN < ERROR。
appender日志输出方式实现类:ConsoleAppender、FileAppender、RollingFileAppender、SocketAppender、SMTPAppender、DBAppender、SyslogAppender、SiftingAppender等.
平时主要使用的是ConsoleAppender和RollingFileAppender,其中ConsoleAppender是往控制台打印日志,RollingFileAppender是往磁盘文件追加日志,而且可以按照一定的设置方式动态分割日志。
RollingFileAppender 滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志记录到其他文件,有
encoder表示对参数进行格式化。简单说一下:
1
2
3 rolling-file-%d{yyyy-MM-dd}.log
4 30
5
6
7 %-4relative [%thread] %-5level %logger{35} - %msg%n
8
9
pattern主要是为了格式化日志
转换符 | 作 用 | 是否避免使用 |
c{length} lo{length} logger{length} |
输出日志的logger名称,可有一个整型参数来缩短 1、不输入表示输出完整的 2、输入0表示只输出 3、输入其他数字表示输出小数点最后边点号之前的字符数量 |
否 |
C{length} class{length} |
输出指定记录的请求的调用者的全限定名,length同上 | 是 |
d{pattern} date{pattern} |
输出时间格式,模式语法同java.text.SimpleDateFormat兼容 | 否 |
caller{depth} | 输出生成日志的调用者的位置信息,整数选项表示输出信息深度 | 否 |
L | 输出执行日志的请求行号 | 是 |
m msg message |
输出应用程序提供的信息 | 否 |
m | 输入执行日志请求的方法名 | 是 |
n | 输出平台相关的分行符"\n"或者"\r\n",即换行 | 否 |
p le level |
输出日志级别 | 否 |
r relative |
输出从程序启动到创建日志记录的时间,单位为毫秒 | 否 |
t thread |
输出产生日志的线程名称 | 否 |
i | 索引【从数字0开始递增】 | 否 |
最后一列是"是否避免使用",这是因为这些信息是无法直接拿到的(比如请求行号、调用方法名),logback必须通过一些特殊手段去获取这些数据(比如在日志打印出产生一个堆栈信息),这种操作会比较影响效率,因此除非必要,否则不建议打印这些数据。
每个格式转换符都以“%”开头。
logback内置的日志字段还是比较少,如果我们需要打印有关业务的更多的内容,包括自定义的一些数据,需要借助logback MDC机制,MDC为“Mapped Diagnostic Context”(映射诊断上下文),即将一些运行时的上下文数据通过logback打印出来;此时我们需要借助org.sl4j.MDC类。
MDC类基本原理其实非常简单,其内部持有一个InheritableThreadLocal实例,用于保存context数据,MDC提供了put/get/clear等几个核心接口,用于操作ThreadLocal中的数据;ThreadLocal中的K-V,可以在logback.xml中声明,最终将会打印在日志中。
比如:MDC.put("userId",1000);
那么在logback.xml中,即可在layout中通过声明“%X{userId}”来打印此信息。
在使用MDC时需要注意一些问题,这些问题通常也是ThreadLocal引起的,比如我们需要在线程退出之前清除(clear)MDC中的数据;在线程池中使用MDC时,那么需要在子线程退出之前清除数据;可以调用MDC.clear()方法。
一般我们会在请求到来时,将相关信息put到ThreadLocal中,在请求结束时,把ThreadLocal给清楚掉。
参考:
https://blog.csdn.net/Z875983491/article/details/104042357
https://blog.csdn.net/daobuxinzi/article/details/115392441
https://blog.csdn.net/iteye_19607/article/details/82677252