为什么要使用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。
根节点的子节点
LogBack的配置大概包括3部分:appender, logger和root。
设置上下文名称
每个logger都关联到logger上下文,默认上下文名称为“default”。但可以使用设置成其他名字,用于区分不同应用程序的记录。一旦设置,不能修改。
设置变量
用来定义变量值的标签, 有两个属性,name和value;其中name的值是变量的名称,value的值时变量定义的值。通过定义的值会被插入到logger上下文中。定义变量后,可以使“${}”来使用变量。
获取时间戳字符串
两个属性 key:标识此 的名字;datePattern:设置将当前时间(解析配置文件的时间)转换为字符串的模式,遵循Java.txt.SimpleDateFormat的格式。
设置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。
下面一个小案列
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将信息打印到控制台;
输出结果
带有logger的配置,不指定级别,不指定appender
将控制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
将控制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的配置
如果你需要完整的配置文件可以关注以下回复 logback 获取的