SpringBoot⽇志框架的选择及使⽤原理
1 ⽇志框架介绍
对于我们⽇常开发⽇志是经常使⽤的,当然以前的我们可能还傻傻的各种System.out.println("重要数据")在控制台输出各种重要数据呢,投⼊⽣产的时候再注释掉。到现在为⽌呢,已经有很多⽇志可供选择了,⽽市⾯上常见的⽇志框架有很多,⽐如:JCL、SLF4J、Jboss-logging、jUL、log4j、log4j2、logback等等,我们该如何选择呢?
市⾯上的⽇志框架;
JUL、JCL、Jboss-logging、logback、log4j、log4j2、slf4j…
左边选⼀个抽象层、右边来选⼀个实现;类似与我们经常使⽤的JDBC⼀样,选择不同的数据库驱动。
下⾯我们先看看⽇志的抽象层:JCL⼤家应该很熟悉,Commons Logging,spring中常⽤的框架最后⼀次更新2014年~~~;jboss-logging使⽤的场景太少了;就剩下SLF4j了也是我们springboot中使⽤的⽇志
抽象层。
⽇志实现:⼤家应该看着都很熟悉把Log4j⼤家应该⽤的挺多的,Logback是Log4j的升级版本出⾄于同⼀个⼈开发的,考虑到以后的升级使⽤等问题,⼜写出了SLF4j的⽇志抽象层使⽤起来更加灵活。JUL(java.util.logging)⼀看就知道是java util包下的;Log4j2咋⼀看像是Log4j的升级版本,其实并不是,它是apache下⽣产的⽇志框架。
SpringBoot选⽤ SLF4j和logback
2 SLF4j使⽤原理
在使⽤⼿册中给我们写了⼀个著名的Hello world
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class HelloWorld {
public static void main(String[] args) {
Logger logger = Logger(HelloWorld.class);
logger.info("Hello World");
}
}
下⾯我们看⼀张图到底如何使⽤:
我们现在已经知道了springboot中使⽤的是 SLF4j和logback,但是如果我们想使⽤log4j该怎么办呢,从上⾯的图⽰中我们可以看出想要使⽤log4j我们肯定还是要使⽤ SLF4j作为抽象层,但是中间给我们加⼊了⼀层适配层(Adaptation layer)然后使⽤log4j进⾏实现,那么我们需要导⼊图⽰中的jar包即可,其他的也是⼀样了。所以说,以后开发的时候,⽇志记录⽅法的调⽤,不应该来直接调⽤⽇志的实现类,⽽是调⽤⽇志抽象层⾥⾯的⽅法; 每⼀个⽇志的实现框架都有⾃⼰的配置⽂件。使⽤slf4j以后,配置⽂件还是做成⽇志实现框架⾃⼰本⾝的配置⽂件;
可能存在的问题
现在开发中我么想使⽤slf4j+logback,但是对于⼀些遗留项⽬中例如Spring(commons-logging)、Hibernate(jboss-logging)…等等,如何去做到⽇志同⼀呢?
你想到的问题SLF4j能想不到吗?答案是可以的,我们看看下⾯的图就明⽩了
如何让系统中所有的⽇志都统⼀到slf4j;
1、将系统中其他⽇志框架先排除出去;
2、⽤中间包来替换原有的⽇志框架;
3、我们导⼊slf4j其他的实现
其实通过idea我们创建⼀个springboot项⽬也可以查看⽇志依赖(截取其中部分):
SpringBoot使⽤它来做⽇志功能:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</dependency>
SpringBoot能⾃动适配所有的⽇志,⽽且底层使⽤slf4j+logback的⽅式记录⽇志,引⼊其他框架的时候,只需要把这个框架依赖的⽇志框架排除掉即可;
例如
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<exclusions>
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
3 SpringBoot⽇志的默认配置
package cn.zhangyu;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.st.context.SpringBootTest;
import st.context.junit4.SpringRunner;
import java.applet.AppletContext;
@RunWith(SpringRunner.class)
@SpringBootTest
public class Springboot1ApplicationTests {
//记录器
Log log = Log(Springboot1ApplicationTests.class);
@Test
public void test(){
/
/⽇志的级别;
//由低到⾼ trace<debug<info<warn<error
//可以调整输出的⽇志级别;⽇志就只会在这个级别以以后的⾼级别⽣效springboot框架是干嘛的
log.debug("debug级别的⽇志");
//SpringBoot默认给我们使⽤的是info级别的,没有指定级别的就⽤SpringBoot默认规定的级别;root级别log.info("info级别的⽇志");
log.warn("warn级别的⽇志");
<("error级别的⽇志");
}
}
其他配置
#修改⽇志的级别,默认root是info
#=trace
# 不指定路径在当前项⽬下⽣成springboot.log⽇志
#logging.file=springboot.log
# 可以指定完整的路径;
logging.file=d://springboot.log
# 在当前磁盘的根路径下创建spring⽂件夹和⾥⾯的log⽂件夹;使⽤spring.log 作为默认⽂件
logging.path=/spring/log
# 在控制台输出的⽇志的格式
sole=%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n
# 指定⽂件中⽇志输出的格式
logging.pattern.file=%d{yyyy-MM-dd} === [%thread] === %-5level === %logger{50} ==== %msg%n
⽇志输出格式:
%d表⽰⽇期时间,
%thread表⽰线程名,
%-5level:级别从左显⽰5个字符宽度
%logger{50} 表⽰logger名字最长50个字符,否则按照句点分割。
%msg:⽇志消息,
%n是换⾏符
4 SpringBoot指定⽇志⽂件
给类路径下放上每个⽇志框架⾃⼰的配置⽂件即可;SpringBoot就不使⽤他默认配置的了Logging System Customization
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论