zoukankan      html  css  js  c++  java
  • springboot中使用logback

    原文地址:https://blog.csdn.net/tianyaleixiaowu/article/details/73321610

    Springboot默认集成的就是logback,logback相对来说是优秀于log4j的,log4j2也是参考了logback的设计。本篇就是来看看如何使用logback。

    新建一个Springboot项目,勾选web就OK了,项目会自动集成logback。

    控制台日志

    写一个controller测试一下:

    1.  
      import org.slf4j.Logger;
    2.  
      import org.slf4j.LoggerFactory;
    3.  
      import org.springframework.web.bind.annotation.GetMapping;
    4.  
      import org.springframework.web.bind.annotation.RestController;
    5.  
       
    6.  
      /**
    7.  
      * Created by admin on 17/6/16.
    8.  
      */
    9.  
      @RestController
    10.  
      public class IndexController {
    11.  
      private final Logger logger = LoggerFactory.getLogger(getClass());
    12.  
       
    13.  
      @GetMapping("/index")
    14.  
      public Object index() {
    15.  
      logger.debug("debug");
    16.  
      logger.info("info");
    17.  
      logger.warn("warn");
    18.  
      logger.error("error");
    19.  
      return "success";
    20.  
      }
    21.  
      }


    需要注意:Logger是slf4j包中的logger,别引用错了。slf4j是一个工厂,可以和log4j、logback结合使用,熟悉工厂模式的自然理解。引用了logback那么Logger就会使用logback相关的方法来处理日志,引用了log4j也同理,这样能便于我们切换日志的实际处理类,这是工厂模式的优点。不要同时引用两个日志处理框架,这样工厂会懵逼的。

    访问上面的controller,查看控制台打印:

    2017-06-16 09:54:13.966  INFO 60356 --- [nio-8080-exec-1] c.e.demo.controller.IndexController      : info
    2017-06-16 09:54:13.967  WARN 60356 --- [nio-8080-exec-1] c.e.demo.controller.IndexController      : warn
    2017-06-16 09:54:13.967 ERROR 60356 --- [nio-8080-exec-1] c.e.demo.controller.IndexController      : error

    我们发现除了debug没出来,其他的都出来了。

    这是因为Springboot的日志level来控制的,根据不同的level来显示。在哪里控制呢?正常来说,应该是由我们在resources下配置的spring-logback.xml来控制,但是我们什么都没写,那么他就走了Springboot默认的配置。

    这里就是Springboot对logback配置的地方,base.xml里,可以看到root level=INFO,这个代表该项目默认是输出最低为info级别的日志。然后看到有两个append-ref,分别为console何file,这两个分别对应上面引用的两个include resource里的xml,每个名字对应一个处理类。

    ConsoleAppender和FixedWindowRollingPolicy都是logback提供的两个Appender处理类,Appender类代表了对日志的处理方法,这个可以自定义。系统提供了很多个Appender,基本满足了大部分场景的需求,像Console就是输出到控制台的,System.out.print之类的,而File的就是输出到日志文件的。

    刚才可以看到在控制台已经打印出了info及以上级别的日志了,那日志文件在哪里呢?

    日志文件

    上一段看到了默认的base.xml指定了ref为console和file,Console已经打印了,file却没有出现。下面就让file出现。
    在application.yml里加上:
    logging:
      file: ./logback.log
    这个是给日志文件起个名字,指定位置的。然后重新启动项目,并访问index,看看效果。
    可以发现在项目外面多了一个文件logback.log,打开看看
    发现和控制台的日志是一样的。

    修改其他配置

    在yml文件里还可以配置其他的一些属性
    譬如我要修改level
    logging:
      file: ./logback.log
      level:
        com.example.demo: debug
    这样可以指定不同的包使用不同的level。我指定了demo包level为debug,controller也在该包下,重启项目访问index,会发现debug的能显示出来了。
    这种配置可以细化,让不同的包显示不同的日志级别。
     

    使用自定义配置

    以上使用yml的配置功能比较少,要完成一些复杂配置,譬如在开发环境下和在生产环境下使用不同的level,使用自定义的Appender,那么就需要自定义配置。
     
    在resources新建logback-spring.xml

    修改日志级别

    删除yml对于level的配置,在xml文件里配置如下:
    1.  
      <?xml version="1.0" encoding="UTF-8"?>
    2.  
      <configuration>
    3.  
      <include resource="org/springframework/boot/logging/logback/base.xml" />
    4.  
       
    5.  
      <root level="WARN">
    6.  
      <appender-ref ref="CONSOLE" />
    7.  
      <appender-ref ref="FILE" />
    8.  
      </root>
    9.  
       
    10.  
       
    11.  
      </configuration>
    这里引用了base.xml并覆盖了root level为WARN,重启项目,并访问index


    这下连Springboot启动时的日志都没有了,只剩下warn和error了.

    按包名区分日志级别

    1.  
      <?xml version="1.0" encoding="UTF-8"?>
    2.  
      <configuration>
    3.  
      <include resource="org/springframework/boot/logging/logback/base.xml" />
    4.  
       
    5.  
      <root level="INFO">
    6.  
      <appender-ref ref="CONSOLE" />
    7.  
      <appender-ref ref="FILE" />
    8.  
      </root>
    9.  
       
    10.  
      <logger name="org.springframework.web" level="INFO"/>
    11.  
      <logger name="com.example.demo" level="WARN"/>
    12.  
      </configuration>
    在xml里配置不同的包的日志level。结果自行测试。

    按部署环境区分日志级别

    我们可以在不同的环境配置不同日志级别,如dev环境下用INFO,prod环境下用ERROR。
     
    1.  
      <?xml version="1.0" encoding="UTF-8"?>
    2.  
      <configuration>
    3.  
      <include resource="org/springframework/boot/logging/logback/base.xml" />
    4.  
       
    5.  
      <root level="INFO">
    6.  
      <appender-ref ref="CONSOLE" />
    7.  
      <appender-ref ref="FILE" />
    8.  
      </root>
    9.  
       
    10.  
      <!-- 测试环境+开发环境. 多个使用逗号隔开. -->
    11.  
      <springProfile name="test,dev">
    12.  
      <logger name="org.springframework.web" level="INFO">
    13.  
      <appender-ref ref="FILE"/>
    14.  
      </logger>
    15.  
      <logger name="com.example" level="INFO" />
    16.  
      </springProfile>
    17.  
       
    18.  
      <!-- 生产环境. -->
    19.  
      <springProfile name="prod">
    20.  
      <logger name="org.springframework.web" level="ERROR">
    21.  
      <appender-ref ref="FILE"/>
    22.  
      </logger>
    23.  
      <logger name="com.example" level="ERROR" />
    24.  
      </springProfile>
    25.  
      </configuration>
    写法如上,然后在yml里配置spring.profiles.active = dev结果自行测试。

    按时间自动滚动的日志文件

    这个就需要自定义一个appender的配置文件了
    1.  
      <appender name="MY_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    2.  
      <Prudent>true</Prudent>
    3.  
      <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
    4.  
      <fileNamePattern>logFile.%d{yyyy-MM-dd}.log</fileNamePattern>
    5.  
       
    6.  
      <maxHistory>30</maxHistory>
    7.  
      <totalSizeCap>3GB</totalSizeCap>
    8.  
       
    9.  
      </rollingPolicy>
    10.  
      <layout class="ch.qos.logback.classic.PatternLayout">
    11.  
      <Pattern> %d{yyyy-MM-dd HH:mm:ss} -%msg%n</Pattern>
    12.  
      </layout>
    13.  
      <encoder>
    14.  
      <pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>
    15.  
      </encoder>
    16.  
      </appender>
    我们定义一个name为MY_FILE的appender,配置fileName策略为按年月日.log的文件名,然后就可以使用这个Appender了。
    1.  
      <!-- 测试环境+开发环境. 多个使用逗号隔开. -->
    2.  
      <springProfile name="test,dev">
    3.  
      <logger name="org.springframework.web" level="INFO">
    4.  
      <appender-ref ref="MY_FILE"/>
    5.  
      </logger>
    6.  
      </springProfile>

    需要注意,Appender的定义要在上面,使用它的地方要在下面,不然会报错找不到Appender。
    定义好Appender后,就可以在任意的logger-name标签下使用了。需要注意不能同名,譬如不能也叫FILE,和base.xml里重名是不可以的。
    文件的生成策略可以有很多,按天分文件夹,按大小,按容量等等,可以自行查找配置。
    Appender也有很多种,系统已经完成的有Console,File,SocketAppender,SMTPAppender,DBAppender等,可以往远处服务器、数据库、文件、邮件、控制台等输出日志,功能强大。下一篇我会附一个系统已经完成的Appender说明。

    自定义Appender

    如果以上都不能满足要求,需要自定义Appender,譬如我们希望把日志除了往文件、控制台外,再往mongoDB输出一份,那么就需要自定义一个mongoAppender。回头等我实验好了,就弄一个mongoAppender。
  • 相关阅读:
    java常用问题排查工具
    一次CMS GC问题排查过程(理解原理+读懂GC日志)
    nginx [alert] 12339#0: 1024 worker_connections are not enough
    netstat Recv-Q和Send-Q
    Use of Recv-Q and Send-Q
    LoadRunner 11 error:Cannot initialize driver dll
    perf + Flame Graph火焰图分析程序性能
    nginx 499状态码
    supervisor管理nginx
    supervisor管理php-fpm
  • 原文地址:https://www.cnblogs.com/eyesfree/p/9565636.html
Copyright © 2011-2022 走看看