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

Posted java微技术

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么要使用logback 日志框架?相关的知识,希望对你有一定的参考价值。

为什么要使用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后缀的可以使用<springProfile>这个标签。


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


 


在application.yml配置以下

logging:  config: classpath:logback-spring.xml


配置详解

根节点<configuration>包含的属性

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

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

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

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



根节点<configuration>的子节点

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



设置上下文名称<contextName>


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


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


设置变量 <property>

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

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


获取时间戳字符串 <timestamp>

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


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


设置logger和root

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



下面一个小案列


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


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)@SpringBootTest public class SpringbootLogbackApplicationTests { private static Logger log = LoggerFactory.getLogger(SpringbootLogbackApplicationTests.class); @Test public void contextLoads() {  log.trace("======trace"); log.debug("======debug"); log.info("======info"); log.warn("======warn"); log.error("======error"); } }


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


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


输出结果

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

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

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


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


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


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


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


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


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


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


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


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


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


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


<logger name=”logback.LogbackDemo” level=”INFO” additivity=”false”>控制logback.LogbackDemo类的日志打印,打印级别为“INFO”。

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


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


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


<logger name=”logback”/>未接到任何打印信息,当然也不会给它的上级root传递任何打印信息。


如果将<logger name=”logback.LogbackDemo” level=”INFO” additivity=”false”>修改为 <logger name=”logback.LogbackDemo” level=”INFO” additivity=”true”>那打印结果将是什么呢?

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


 


<appender>详解

 


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


 


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

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

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

以上是关于为什么要使用logback 日志框架?的主要内容,如果未能解决你的问题,请参考以下文章

Logback中使用TurboFilter实现日志级别等内容的动态修改

springboot的日志框架slf4j (使用logback输出日志以及使用)

Java日志框架:logback详解

Java日志框架:logback详解

日志框架-Logback

日志框架之Logback的使用与详细配置