(3)Spring Boot日志
选择哪一种日志框架
市面上日志门面有:
JCL(Jakart Commons Logging) 、SLF4J(Simple Logging Facade For Java)、jboss-logging
日志实现有:
Log4J 、JUL(java.util.logging)、Log4j2、Logback
日志门面就是抽象接口,日志实现,就是具体的日志实现;
在日志接口中,jboss-logging 首先排除,它生来就不给我们普通程序员用的;接着排除掉 JCL,虽然它很好,也是 Apache 下面的项目,但是上一次更新还是 2014 年,辉煌也只属于过去了;
最后剩下了 SLF4J ,虽然它名字叫简陋的日志门面,但是这仅仅是作者的谦虚,这个日志门面一点都不简陋;
选好了日志门面,再选日志实现,首先排除 JUL ,它只是 Log4j 初出江湖,然后名震江湖之际,java 怕丢失日志市场,就推出了 JUL;
然后再说下 Log4J、Logback 其实它们是同一个作者写的,包括我们之前选的日志门面 SLF4J 也是出自同一人之手,大神的世界不是很懂;
然后 Log4j 是初级版本,大神后来加入了重大更新,有了 Logback ,因此 Logback 才是与 SLF4J 最切合的,毕竟出自同门;
为什么不选 Log4J2 ,它也是对 Log4J 的升级版,同样系出名门,来自 Apache小组,但是升级的太好了,以至于目前,还没有配得上它的日志门面。。。扎心了
Spring Boot 底层是 Spring 框架,Spring 框架默认使用的是 JCL,因此,之前使用 Spring 的时候,总是需要导入 Commons-Logging 日志框架 ;
Spring Boot 明智的选择了和我们分析的一样的 SLF4J + Logback 组合 ;
日志的使用
开发的时候,应该调用日志门面的方法,而不应该调用日志具体实现的方法,面向接口编程;
但是每一个日志实现框架都有自己的配置文件,在使用 SLF4J 的时候,日志配置文件还是使用具体日志实现框架的配置文件 ;
-
使用
SLF4J + Logback它们是天生就切合的;但是如果你日志实现不是使用
Logback呢,而是使用其他日志实现,那么SLF4J官方也提供了对应的jar包,进行适配;适配的原理就是,提供了一个适配层,比如你调用
SLF4J的某个方法,然后通过适配层翻译为对应日志实现框架的方法; -
历史遗留问题
我们在项目开发的时候,使用许多第三方框架,
Spring、Hibernate等等,它们各自都有自己依赖的日志框架;我们如何最后统一使用
SLF4J + Logback,SLF4J官方同样也提供了对应的jar包,具体的原理是这样的:比如Spring依赖Commons-logging那么,首先先去掉Commons-logging,去掉以后,Spring启动就会保错,因为找不到需要的日志类,这时候将官方提供的替换包,添加进去,这个替换包起到偷梁换柱的作用,Commons-logging包里面有的类,替换包都有,这样Spring启动的时候,就能找到对应的类了,但是这些类里面,都被动了手脚,里面都是去调用Logback的方法了;这样做以后,就能统一使用
SLF4J + Logback;
Spring Boot 日志使用
使用其他框架的时候,需要移除框架本身依赖的日志框架;
至于 Spring 框架,Spring Boot 已经默认移除了 Commons-logging ;
如果是使用 SLF4J + Logback 则不需要导入任何包,Spring Boot 默认已经集成了 ;
// 记录器(导包不要导错了,导 slf4j)
Logger logger = LoggerFactory.getLogger(this.getClass());
// 打印的日志,只会打印设定的级别及其之后的级别日志
logger.trace("这是 trace 日志 ...");
logger.debug("这是 debug 日志 ...");
// Spring Boot 默认给我们使用的级别是 info ,
logger.info("这是 info 日志 ...");
logger.warn("这是 warn 日志 ...");
logger.error("这是 error 日子 ...");
-
logging.level如果我们想更改默认的日志级别,可以在配置文件里面进行设置:
logging: level: cn: hyc: trace其中
logging.level用于控制日志级别,可以直接在后面写级别,如果想控制的细致点,可以在后面写上具体的包 ; -
logging.file + logging.path指定日志文件名字和日志文件保持路径;
如果都没有指定,则只在控制台打印;
但是这两个又是冲突的指令,当二者都存在的时候,只有
logging.file起作用 ;使用
logging.file,如果只指定了文件名,则在当前项目目录下,生成日志文件;当然也是可以指定具体路径的,比如下面的,就会在D盘下面生成日志文件:logging: file: D:my.log一般只是使用
logging.path,仅仅制定路径,日志文件的名字使用Spring Boot默认的 名字Spring.log;logging: path: /spring/log这里
/代表项目所在盘符的根目录 ; -
logging.pattern.console指定在控制台输出的日志的格式
-
logging.pattern.file指定文件中日志的格式;
-
指定配置文件
首先
Spring Boot有自己默认的日志配置,如果我们不想用,想用自己的配置,则
根据自己选择的日志实现框架,来命名自己的日志配置文件:

比如,博主选择的是
Logback日志实现,则日志配置文件的名字,可以是logback-spring.xml, logback-spring.groovy, logback.xml, or logback.groovy中的任何一个;把日志配置文件放在类路径下面,即可被
Spring Boot自动加载 ;但是官方建议我们使用
logback-spring.xml这样带后缀名的,而非直接使用logback.xml,因为logback.xml可以被日志框架直接识别,直接就加载了,Spring Boot在此过程插不上手;如果使用
logback-spring.xml这样的名字,日志框架就不认识,不会直接加载,而是由Spring Boot去解析日志配置,这样就可以使用高级Profile功能,比如:在配置文件的某项配置上,写<springProfile name = "dev>这样,只有在特定环境下(dev开发环境),该项配置才会生效;

浙公网安备 33010602011771号