四、logback配置文件

 

 

 

 

1、Logger & Appender & Layouts

Logback 主要的三个类 logger,appender和layouts。这三个组件一起作用可以满足我们开发中根据消息的类型以及日志的级别打印日志到不同的地方。

     logger是生产日志的原料厂;layout是日志的加工厂,主要用于对日志进行格式化;appender是交通工具,主要是把layout格式化好的日志信息以流的形式发送到磁盘等目的地。

     LoggerContext负责生产Logger,通过一个树状的层次结构来进行管理。上一篇文章我们讲到,logger是root是该树状结构的根,也就是所有logger的老祖宗,默认DEBUG级别。如果当前节点设置了日志级别,就不会考虑父类的日志级别。Logger 通过日志级别控制日志的启用和禁用。日志级别 TRACE < DEBUG < INFO < WARN < ERROR

 

2、logback配置文件标签说明

2.1 logback的configuration 

<configuration>是logback配置文件的根标签,<configuration>只有三个属性:

  • scan:当scan被设置为true时,当配置文件发生改变,将会被重新加载,默认为true
  • scanPeriod:检测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认为毫秒,当scan=true时这个值生效,默认时间间隔为1分钟
  • debug:当被设置为true时,将打印出logback内部日志信息,实时查看logback运行信息,默认为false

<configuration>的子节点有contextName、property、appender、logger、root等,我们主要看appender、logger、root标签的作用。

2.2 <logger>

<logger>用来设置某一个包或者具体某一个类的日志打印级别、以及指定<appender>。<logger>可以包含零个或者多个<appender-ref>元素,标识这个appender将会添加到这个logger。<logger>仅有一个name属性、一个可选的level属性和一个可选的additivity属性:

  • name:用来指定受此logger约束的某一个包或者具体的某一个类
  • level:用来设置打印级别,五个常用打印级别从低至高依次为TRACE、DEBUG、INFO、WARN、ERROR,如果未设置此级别,那么当前logger会继承上级的级别
  • additivity:是否向上级logger传递打印信息,默认为true

2.3 <root>

<root>也是<logger>元素,但是它是根logger,只有一个level属性,因为它的name就是ROOT。 如果没有指定logger,则那么所有的logger都会继承根logger的level。

2.4 <appender>

<appender>是负责写日志的组件。<appender>有两个必要属性name和class:

  • name指定<appender>的名称
  • class指定<appender>的全限定名

appender日志输出方式实现类:ConsoleAppender、FileAppender、RollingFileAppender、SocketAppender、SMTPAppender、DBAppender、SyslogAppender、SiftingAppender等.

       平时主要使用的是ConsoleAppender和RollingFileAppender,其中ConsoleAppender是往控制台打印日志,RollingFileAppender是往磁盘文件追加日志,而且可以按照一定的设置方式动态分割日志。

        RollingFileAppender 滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志记录到其他文件,有<file>、<append>、<encoder>、<rollingPolicy>、<triggeringPolicy >、<prudent>

<file>:被写入的文件名,可以是相对目录,也可以是绝对目录,如果上级目录不存在会自动创建,没有默认值。

<append>:如果是 true,日志被追加到文件结尾,如果是 false,清空现存文件,默认是true。 <encoder>:对记录事件进行格式化。)

<rollingPolicy>:当发生滚动时,决定 RollingFileAppender 的行为,涉及文件移动和重命名(重命名文件)。

<triggeringPolicy>:告知 RollingFileAppender 何时激活滚动。

<prudent>:当为true时,不支持FixedWindowRollingPolicy。支持TimeBasedRollingPolicy,但是有两个限制,1不支持也不允许文件压缩,2不能设置file属性,必须留空。

        encoder表示对参数进行格式化。简单说一下:

  • <encoder>是0.9.19版本之后引进的,以前的版本使用<layout>,logback极力推荐的是使用<encoder>而不是<layout>
  • 最常用的FileAppender和它的子类的期望是使用<encoder>而不再使用<layout>

1 <appender name="ROLLING-FILE-1" class="ch.qos.logback.core.rolling.RollingFileAppender">   
2     <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">   
3         <fileNamePattern>rolling-file-%d{yyyy-MM-dd}.log</fileNamePattern>   
4         <maxHistory>30</maxHistory>    
5     </rollingPolicy>   
6     <encoder>   
7         <pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>   
8     </encoder>   
9 </appender>

<rollingPolicy>的作用是当发生滚动时,定义RollingFileAppender的行为,其中上面的TimeBasedRollingPolicy是最常用的滚动策略,它根据时间指定滚动策略,既负责滚动也负责触发滚动,有以下节点:

  • <fileNamePattern>,必要节点,包含文件名及"%d"转换符,"%d"可以包含一个Java.text.SimpleDateFormat指定的时间格式,如%d{yyyy-MM},如果直接使用%d那么格式为yyyy-MM-dd。RollingFileAppender的file子节点可有可无,通过设置file可以为活动文件和归档文件指定不同的位置
  • <maxHistory>,可选节点,控制保留的归档文件的最大数量,如果超出数量就删除旧文件,假设设置每个月滚动且<maxHistory>是6,则只保存最近6个月的文件

2.5 <pattern>

pattern主要是为了格式化日志

转换符作  用是否避免使用

c{length}

lo{length}

logger{length}

输出日志的logger名称,可有一个整型参数来缩短<logger>名称,有几种情况:

1、不输入表示输出完整的<logger>名称(类的全名)

2、输入0表示只输出<logger>最右边点号之后的字符串

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必须通过一些特殊手段去获取这些数据(比如在日志打印出产生一个堆栈信息),这种操作会比较影响效率,因此除非必要,否则不建议打印这些数据。

每个格式转换符都以“%”开头。
 

2.6 MDC

        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

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值