(学习心得)logback日志配置简述

先说明 可能会写的比较啰嗦 因为是一边看一边总结的
2020-09-10

最近几天在公司看了看logback的官方文档
总结一下 以免忘记

1.级别

TRACE,DEBUG, INFO, WARN and ERROR。TRACE最低级别 ERROR最高级别

2.级别继承的问题

如果没有给定一个级别 那么日志记录器会从最近的一个上级中继承级别 举个例子 用官网的一个图来说
例子1:
在这里插入图片描述
root 是最顶级的一个日志记录器 他设定的级别是debug 那么他的有效等级就是debug级别
x是root下一个级别的日志记录器 但是他没有设定有效的级别(Assigned level = none)那么他的有效等级会从上一个级别中继承 那么就是 root的有效级别 debug。
后面的X.Y,X.Y.Z 同样的道理 最后大家的有效等级都是debug级别。

例子2:
在这里插入图片描述
这个例子就很好理解了 每个记录器都设定了日志级别 不会有继承的问题 所以设定什么级别 有效等级就是什么级别。

例子3:
在这里插入图片描述
root级别 设定了 debug级别 有效等级是debug 没有问题
X 设定了info级别 有效等级 info 没有问题
X.Y 没有设定有效等级 那么就会继承 但是他上面有两个级别 继承哪一个呢? 官网是这么说的

If a given logger is not assigned a level, then it inherits one from its closest ancestor with an assigned level.

选择最近的那个 所以 X.Y 的有效级别是 info 不是debug
X.Y.Z 设置了error级别 所以有效等级是error级别

3.日志的级别过滤问题

不知道大家有么有这样的问题 有一个日志记录器 设定了info级别 那么他会打印出来什么级别的日志?debug级别的日志能打印出来么?warn级别的日志呢?
直接给答案 warn能出来 debug出不来。 我是这么理解的
传过来的日志,比日志记录器级别高 能出来
传过来的日志,比日志记录器的级别低 出不来

上官网的图
在这里插入图片描述

可以看出来 如果设置的有效等级是trace 那么所有的日志都会打印。因为他是最低级别的
如果设置的是error 那么只有error会打印 因为他是最大的。

4.日志打印到哪里的问题

一个日志可以打印到多个地方 例如 你的控制台 文件 或者数据库中等。。。

这里要明确一个 单词 appender
官网中对于appender的解释是这样的

Logback allows logging requests to print to multiple destinations. In logback speak, an output destination is called an appender

大致的翻译呢 就是 logback允许日志请求打印到多个地方。在logback中 输出的目的地叫做appender。

那么我们就可以理解成 appender 用于控制日志输出在哪里。但是呢 这里还有一个传递的问题需要解释一下
解释这个问题 我们来模拟一个场景
在这里插入图片描述

现在 有 两个appender 分别是 root 和 x 。
root 设置了一个输出目的地 是控制台(A1) ;
x设置了两个输出目的地 文件1(x1)和文件2(x2)

如果现在一个日志请求,用的是root这个appender 那么这个日志会打印在哪里 只有控制台 因为root只配置了一个A1。
那么现在如果这个日志请求,用了x这个appender呢? 他会打印在哪里? 肯定有朋友会说会输出在两个文件 x1,x2 中。恭喜你 错了。他会输出在3个目的地中 x1,x2和A1 也就是说两个文件+控制台。
有的朋友应该会疑惑,为什么会输出到控制台A1 这就是要说的问题, 日志请求的时候 如果使用的appender存在父级,那么这个父级也会输出这个日志。当然,这是能够控制的。
additivity
这个属性就是用来控制是否向上级传递日志 如果设置了false 那么不会向上级传递。默认是true。

上官网的图
在这里插入图片描述
这里 要注意的是 security 和 security.access
security 的 Additivity Flag 是false 那么他不会向上级传递 所以他只会输出搭到A-sec。
security.access 没有配置 输出目的地 但是他的 Additivity Flag 是true 向上级传递 所以也会输出到A-sec

2020-09-11

5.官方推荐日志输出不要字符串拼接

我们在日常的工作中 输出日志是不是就像下图中的写法一下 字符串拼接
在这里插入图片描述
在这里插入图片描述

这样写呢 是没有问题的 但是 官方文档中说了

incurs the cost of constructing the message parameter, that is converting both integer i and entry[i] to a String, and concatenating intermediate strings. This is regardless of whether the message will be logged or not.

大致的翻译就是 构建这条消息 将整数类型的 i 和 Hello world. 组成一个新的字符串 这个开销 与我日志是记录没啥关系
反正人家不建议这样使用 推荐的使用方法是用 ‘{}’ 一对大括号 代替你要输出的信息

在这里插入图片描述
在这里插入图片描述
并且 如果是多个参数 就多个‘{}’ 好了

在这里插入图片描述
在这里插入图片描述

The following two lines will yield the exact same output. However, in case of a disabled logging statement, the second variant will outperform the first variant by a factor of at least 30
在这里插入图片描述

意思呢就是说 这两种写法的性能相差至少30倍

6.logback的 配置

  1. 初始化怎么找文件

在这里插入图片描述
a.找logback-test.xml
b.找logback.groovy
c.找logback.xml
d.找ch.qos.logback.classic.spi.Configurator 这个接口的实现
e.都找不到 用默认的BasicConfigurator 打印在控制台上

  1. 最基础的xml配置
<configuration>
  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
      <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
    </encoder>
  </appender>

  <root level="debug">
    <appender-ref ref="STDOUT" />
  </root>
</configuration>

appender
name : 取个名字任意定义
class : ch.qos.logback.core.ConsoleAppender 输出到控制台

encoder
pattern : 指定输出的格式

  1. 状态信息打印
<configuration debug="true"> 
  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> 
    <encoder>
      <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
    </encoder>
  </appender>
  <root level="debug">
    <appender-ref ref="STDOUT" />
  </root>
</configuration>

这一段 重点在于 debug=“true”

可以理解为开启检查 检查两个东西
1.哪个配置文件找到
2.xml的配置是否正确

Setting debug=“true” within the configuration element will output status information, assuming that:
1.the configuration file is found
2.the configuration file is well-formed XML.

注意一下 这个配置等同于

<configuration>
  <statusListener class="ch.qos.logback.core.status.OnConsoleStatusListener" />  

  ... 剩下的配置一样
</configuration>

建议还是开启 后续处理问题排查方便

  1. 自动更新配置
<configuration scan="true"> 
  ... 
</configuration> 

这里注意 scan=“true” 开启自动更新配置 如果没有加 scanPeriod 属性 那么默认是每分钟扫描一次

<configuration scan="true" scanPeriod="30 seconds" > 
  ...
</configuration> 

这里配置了 scanPeriod 属性 并且设置了30秒 意思就是每三十秒扫描一次
这里需要注意单位 单位只能是 milliseconds(毫秒),seconds(秒),minutes (分钟),hours(小时)

如果在修改配置文件的时候写错了 logback会退回到上一个没有语法错误的版本

As it is easy to make errors while editing a configuration file, in case the latest version of the configuration file has XML syntax errors, it will fall back to a previous configuration file free of XML syntax errors.

  1. 配置文件语法

在这里插入图片描述
上面这个图是官网的图
最基本的是 configuration 标签
它包含了0或者多个 appender标签,0或者多个logger标签以及唯一的一个root标签


logger标签:
必有一个name属性,level属性可有可无,additivity属性可有可无
logger标签内部有0个或多个 appender-ref 标签
root标签:
只有一个level属性 不能有其他的属性
内部会有0或多个appender-ref标签
在这里插入图片描述
logger 的name属性 可以是包路径或者类路径,指定这个包下的日志等级或者指定这个类的日志等级
举个例子解释一下 按上图所示的配置 logger 设置了name 是一个包路径 level 属性设置了debug。但是没有 appender-ref 标签。这个包或者类下面的日志只有比debug高的才会出来,比debug等级低的日志会被过滤掉 然后上级传递 到了 root,root 设置打印到控制台,日志会打印到控制台。


appender标签
在这里插入图片描述
name和class属性必须有!
name :取个名字任意填写
class :appender的实现
layout,encoder,filter 这三个标签非必须
在这里插入图片描述
上图例子

  1. 有两个appender 一个输出到 myApp.log 这个文件中,另一个appender输出到控制台
  2. root配置了两个appender-ref 分别使用这两个appender

这样的配置会使得使用root输出日志的信息会同时输出到文件和控制台。

在这里插入图片描述
上图例子:

  1. 只有一个appender 输出到控制台
  2. 有一个logger 一个root

这样会使得 chapters.configuration 这个包路径下的日志在控制台输出两次。但是不在这个路径下的只会使用root节点,在控制台输出一次。
在这里插入图片描述
在这里插入图片描述
上图例子:

  1. 两个appender 一个输出到文件 一个输出到控制台
  2. 一个logger,一个root。logger的name设置了包路径 输出到文件;root输出到控制台

chapters.configuration 这个路径下的日志会分别输出到文件和控制台中 不是这个路径下的会输出到控制台 和上个例子同理。

在这里插入图片描述
这个例子 跟上个例子相比 logger的包路径换成了类路径 logger的additivity属性设置为false;
chapters.configuration.Foo 这个类输出的日志 只会输出到文件 因为additivity为false;
其他的还是输出到控制台;
未完待续。。。。(禁止转载)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值