《SpringBoot 整合日志logback slf4j》

日志管理在任何工程里面都很重要,Java 体系比较成熟的日志管理工具有以下几个。

  • log4j ,Apache的开源项目log4j是一个功能强大的日志组件,早期开发者都在用的日志组件。
  • logback,是由log4j 作者重新编写的一套日志组件,需要配合slf4j(简单日志门面),logback完美实现了slf4j的功能,比log4j好用,性能更好,推荐使用。此处应该有一个,门面模式的介绍。
  • lombok,其实现在比较常用的统一由lombok来管理日志,其实lombok也是由slf4j,logback来管理日志的,关于lombok的详细介绍需要写一个专题文章

一、基于logback 和 slf4j 来增强springboot 的日志管理

1、在pom文件中,添加log4j 和 logback, 参考 http://www.slf4j.org/manual.html,为什么不看logback的官网而看slf4j官网呢?这是学习一个新技术最核心的问题,要理解我们用的是slf4j来做为日志的管理,slf4j代理了logback的日志管理的功能,角色是slf4j是个代理人,logback是真正干活儿的,只不过对外沟通托管给了slf4j,所以要看slf4j。

另外很多其他资料都是在pom中添加三个jar包,其实也不错,只不过还是简单,看一看官网就知道了,logback-classic 集成了 logback-core 和 slf4j-api,引入这一个就够了。这里总结了一个学习方法,先要搞明白每个角色负责啥,才知道从哪里入手开始搞。

<code><dependency>   <groupid>ch.qos.logback/<groupid>  <artifactid>logback-classic/<artifactid>  <version>1.2.3/<version>/<dependency>/<code>

2、在Springboot项目中使用logback

<code>package org.example;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;/** * Hello world! */@SpringBootApplicationpublic class App {    //实例化一个静态Logger对象用于在本类中统一处理日志    private final static Logger logger = LoggerFactory.getLogger(App.class);    public static void main( String[] args ) {        SpringApplication.run(App.class);        logger.info("ddddd");        System.out.println( "Hello World!" );    }}/<code>
  1. 在需要使用日志的类里,实例化一个静态对象Logger ,
  2. 在后续的方法中统一使用logger 来输出日志,如logger.info logger.error logger.debug问题来了
  • 我想改变日志格式 ?
  • 我想把日志记到文件里 ?
  • 我想日志按天切割 ?

3、 -针对上面的问题,配置logback的配置文件,包含日志切割方案,日志存放目录,日志格式

参考 http://logback.qos.ch/manual/ 坦白说这个官网藏得很深,我找了好久才找到

基础配置版本

<code><configuration>  <appender>        <encoder>      <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n/<pattern>    /<encoder>  /<appender>  <root>    <appender-ref>  /<root>/<configuration>/<code>

上面的 appender标签,root,appender-ref 看的好懵逼,还是要看看官网弄明白都是干什么用的,再把官网抛出来

http://logback.qos.ch/manual/

根标签,简单理解为,当前工程内所有java 包都采用root 标签的 日志级别和关联的 appender

输出源,指日志的输出源,常用的有如下几个

  • FileAppender 文件输出源
  • ConsoleAppender 控制台输出源
  • RollingFileAppender 分割文件输出源

按天分割,输出到指定文件配置参考官网如下

<code><configuration>  <appender>    <file>logs/logFile.log/<file>    <rollingpolicy>            <filenamepattern>logFile.%d{yyyy-MM-dd}.log/<filenamepattern>            <maxhistory>30/<maxhistory>      <totalsizecap>3GB/<totalsizecap>    /<rollingpolicy>    <encoder>      <pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n/<pattern>    /<encoder>  /<appender>   <root>    <appender-ref>  /<root>/<configuration>/<code>

appender 中的pattern 就是用来管理日志格式的,参考官网会看到对应的解释

<code><pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n/<pattern>/<code>

现在我们确定了logback的日志配置文件,这个配置文件怎么用呢?放在哪里?

所有问题都要去看官网,当然也可以搜索Baidu 或者 google ,但是我认为那是解决问题的方式,不是学习方式,学习是要自己能够去主动找到方法,并实践成功。


《SpringBoot 整合日志logback slf4j》

我们得出一个结论,logback 会在classpath 目录找 logback-test.xml 如果没有 logback.groovy ,如何还没有找 logback.xml

这里推荐使用logback.xml,放在工程目录的 resource文件下,其实resource文件只是一个特殊文件夹,放一些资源文件,能够让java 扫描到,核心为啥会扫描到,还是因为要把resource文件夹放在 classpath 里面。此处应该有个Java classpath的介绍。

启动Springboot,我们可以看到日志都输出到程序运行根目录下的logs文件夹下

问题又来了?我们想把一个特定的类或者包下的日志单独输出到另一个地方怎么做的?

还是看官网

增加 标签,用以指定特定的包的日志处理规范,包含日志级别和 appender, 参考官网配置

<code><configuration>  <appender>        <encoder>      <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n/<pattern>    /<encoder>  /<appender>  <logger>      <root>              <appender-ref>  /<root>    /<configuration>/<code>

至此,我们成功的为springboot 增强了日志管理,其实该方法同样适用于普通Java 工程。

二、基于lombok 来增强springboot的日志管理

加入lombok 的pom引用,Idea 需要增加lombok 的插件否则编辑代码的时候不会有提示

加入如下代码

<code><dependency>      <groupid>org.projectlombok/<groupid>      <artifactid>lombok/<artifactid>      <version>1.18.10/<version>      <scope>provided/<scope>    /<dependency>/<code>

采用lombok 插件+ @Slf4j 注解来简化Java 代码

<code>import lombok.extern.slf4j.Slf4j;/** * AiworksApplication * * @author yubangxu */@Slf4jpublic class AiworksApplication {    public static void main( String[] args ) {        log.info("hello world!");        System.out.println( "Hello World!" );    }}/<code>


关于lombok的其他用法,再后续的文章中会写到,同时会在下方增加一个链接


分享到:


相關文章: