java为什么要用日志,为什么要使用logback 日志框架?

发布时间:2024-03-29 09:01

为什么要使用logback 日志框架?

经测试,spirngboot里面已经自带这个llogback这个日子框架,log4j和logback就是两个受欢迎的日志框架。但两者又有不同

slf4j是一系列的日志接口,而log4j logback是具体实现了的日志框架。

logback同样是由log4j的作者设计完成的,拥有更好的特性,用来取代log4j的一个日志框架。是slf4j的原生实现。

可以看到logback是直接实现了slf4j的接口,而log4j不是对slf4j的原生实现,所以slf4j api在调用log4j时需要一个适配层。

也就是说logback实现slf4j是不消耗内存和计算开销的。

最后总结一下:

1、slf4j是java的一个日志门面,实现了日志框架一些通用的api,log4j和logback是具体的日志框架。

2、他们可以单独的使用,也可以绑定slf4j一起使用。

单独使用。分别调用框架自己的方法来输出日志信息。

绑定slf4j一起使用。调用slf4j的api来输入日志信息,具体使用与底层日志框架无关(需要底层框架的配置文件)

显然这里我们不推荐单独使用日志框架。假设项目中已经使用了log4j,而我们此时加载了一个类库,而这个类库依赖另一个日志框架。这个时候我们就需要维护两个日志框架,这是一个非常麻烦的事情。而使用了slf4j就不同了,由于应用调用的抽象层的api,与底层日志框架是无关的,因此可以任意更换日志框架。

怎么学习springboot中的logback?

官方网站  https://logback.qos.ch/

在src/main/resources  这个目录下建立一个文件    logback-spring.xml

首先,官方推荐使用的xml名字的格式为:logback-spring.xml而不是logback.xml,至于为什么,因为带spring后缀的可以使用这个标签。

在resource下创建logback-spring.xml文件

在application.yml配置以下

logging:config:classpath:logback-spring.xml

配置详解

根节点包含的属性

scan:当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true.

scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟.

debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。

java为什么要用日志,为什么要使用logback 日志框架?_第1张图片

根节点的子节点

LogBack的配置大概包括3部分:appender, logger和root。

设置上下文名称

每个logger都关联到logger上下文,默认上下文名称为“default”。但可以使用设置成其他名字,用于区分不同应用程序的记录。一旦设置,不能修改。

java为什么要用日志,为什么要使用logback 日志框架?_第2张图片

设置变量

用来定义变量值的标签, 有两个属性,name和value;其中name的值是变量的名称,value的值时变量定义的值。通过定义的值会被插入到logger上下文中。定义变量后,可以使“${}”来使用变量。

java为什么要用日志,为什么要使用logback 日志框架?_第3张图片

获取时间戳字符串

两个属性 key:标识此 的名字;datePattern:设置将当前时间(解析配置文件的时间)转换为字符串的模式,遵循Java.txt.SimpleDateFormat的格式。

java为什么要用日志,为什么要使用logback 日志框架?_第4张图片

设置logger和root

用来设置某一个包或者具体的某一个类的日志打印级别、以及指定。仅有一个name属性,一个可选的level和一个可选的additivity属性。name:用来指定受此logger约束的某一个包或者具体的某一个类。level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,还有一个特殊值INHERITED或者同义词NULL,代表强制执行上级的级别。如果未设置此属性,那么当前logger将会继承上级的级别。additivity:是否向上级logger传递打印信息。默认是true。可以包含零个或多个元素,标识这个appender将会添加到这个logger。也是元素,但是它是根logger。只有一个level属性,应为已经被命名为”root”.level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,不能设置为INHERITED或者同义词NULL。默认是DEBUG。可以包含零个或多个元素,标识这个appender将会添加到这个logger。

下面一个小案列

java为什么要用日志,为什么要使用logback 日志框架?_第5张图片

package com.example.demo;import org.junit.Test;import org.junit.runner.RunWith;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.boot.test.context.SpringBootTest;import org.springframework.test.context.junit4.SpringRunner;@RunWith(SpringRunner.class)@SpringBootTestpublic class SpringbootLogbackApplicationTests {private static Logger log = LoggerFactory.getLogger(SpringbootLogbackApplicationTests.class);@Testpublic void contextLoads(){log.trace("======trace");log.debug("======debug");log.info("======info");log.warn("======warn");log.error("======error");}}

其中appender的配置表示打印到控制台(稍后详细讲解appender )。将root的打印级别设置为“INFO”,指定了名字为“STDOUT”的appender。

当执行logback.LogbackDemo类的main方法时,root将级别为“INFO”及大于“INFO”的日志信息交给已经配置好的名为“STDOUT”的appender处理,“STDOUT”appender将信息打印到控制台;

输出结果

7def28727a9a5d0eb85f2e6a9ef3cdd5.png

带有logger的配置,不指定级别,不指定appender

java为什么要用日志,为什么要使用logback 日志框架?_第6张图片

将控制logback包下的所有类的日志的打印,但是并没有设置打印级别,所以继承他的上级的日志级别“DEBUG”。

没有设置additivity,默认为true,将此logger的打印信息向上级传递。

没有设置appender,此logger本身不打印任何信息。

将root的打印级别设置为“DEBUG”,指定了名字为“STDOUT”的appender。

当执行logback.LogbackDemo类的main方法时,因为LogbackDemo 在包logback中,所以首先执行,将级别为“DEBUG”及大于“DEBUG”的日志信息传递给root,本身并不打印。

root接到下级传递的信息,交给已经配置好的名为“STDOUT”的appender处理,“STDOUT”appender将信息打印到控制台

带有多个logger的配置,指定级别,指定appender

java为什么要用日志,为什么要使用logback 日志框架?_第7张图片

将控制logback包下的所有类的日志的打印,但是并没用设置打印级别,所以继承他的上级的日志级别“DEBUG”。

没有设置additivity,默认为true,将此logger的打印信息向上级传递。

没有设置appender,此logger本身不打印任何信息。

控制logback.LogbackDemo类的日志打印,打印级别为“INFO”。

additivity属性为false,表示此logger的打印信息不再向上级传递,指定了名字为“STDOUT”的appender。

将root的打印级别设置为“ERROR”,指定了名字为“STDOUT”的appender。

当执行logback.LogbackDemo类的main方法时,先执行,将级别为“INFO”及大于“INFO”的日志信息交给此logger指定的名为“STDOUT”的appender处理,在控制台中打出日志,不再向次logger的上级 传递打印信息。

未接到任何打印信息,当然也不会给它的上级root传递任何打印信息。

如果将修改为 那打印结果将是什么呢?

没错,日志打印了两次,想必大家都知道原因了,因为打印信息向上级传递,logger本身打印一次,root接到后又打印一次:

详解

是的子节点,是负责写日志的组件。有两个必要属性name和class。name指定appender名称,class指定appender的全限定名。

结合所有情况这个是完整的贴出logback-spring.xml的配置

java为什么要用日志,为什么要使用logback 日志框架?_第8张图片

如果你需要完整的配置文件可以关注以下回复    logback    获取的

ItVuer - 免责声明 - 关于我们 - 联系我们

本网站信息来源于互联网,如有侵权请联系:561261067@qq.com

桂ICP备16001015号