• 【转】 springBoot(10)---logback日志


    【转】 springBoot(10)---logback日志

    logback日志

    一、概述

               和log4j优点:

                实际上,这两个日志框架都出自同一个开发者之手,Logback 相对于 Log4J 有更多的优点

               (1)logback不仅性能提升了,初始化内存加载也更小了。

               (2)内容更丰富的文档

               (3)更强大的过滤器

    二、步骤

    1、maven配置jar包

       logback默认就在spring-boot-starter-web包中,所以我们只要有spring-boot-starter-web

            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>

    二、新建logback-spring.xml

       springboot官方建议命名为logback-spring.xml,在src/main/resources新建logback-spring.xml,这里不需要在application.properties中配置

       默认加载加载配置顺序 logback-spring.xml, logback-spring.groovy, logback.xml, or logback.groovy

    <?xml version="1.0" encoding="UTF-8" ?>
    <configuration> 
            <!--    打印到控制台 -->
         <appender name="consoleApp" class="ch.qos.logback.core.ConsoleAppender">
            <layout class="ch.qos.logback.classic.PatternLayout">
                <pattern>
                    %date{yyyy-MM-dd HH:mm:ss.SSS} %-5level[%thread]%logger{56}.%method:%L -%msg%n
                </pattern>
            </layout>
        </appender>
    
    
       <!--   打印到文件 -->
        <appender name="fileInfoApp" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <filter class="ch.qos.logback.classic.filter.LevelFilter">
                 <level>ERROR</level>
                <onMatch>DENY</onMatch>
                <onMismatch>ACCEPT</onMismatch>
            </filter>
            <encoder>
                <pattern>
                    %date{yyyy-MM-dd HH:mm:ss.SSS} %-5level[%thread]%logger{56}.%method:%L -%msg%n
                </pattern>
            </encoder>
            <!-- 滚动策略 -->
            <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                <!-- 路径 -->
                <fileNamePattern>app_log/log/app.info.%d.log</fileNamePattern>
            </rollingPolicy>
        </appender>
        
       
        <!--  打印到文件 -->
        <appender name="fileErrorApp" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
                <level>ERROR</level>
            </filter>
            <encoder>
                <pattern>
                    %date{yyyy-MM-dd HH:mm:ss.SSS} %-5level[%thread]%logger{56}.%method:%L -%msg%n
                </pattern>
            </encoder>
            
            <!-- 设置滚动策略 -->
            <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                <!-- 路径,因为有 %d所以每天都会意时间来创建新的文件 -->
                <fileNamePattern>app_log/log/app.err.%d.log</fileNamePattern>
                
                <!-- 控制保留的归档文件的最大数量,超出数量就删除旧文件,假设设置每个月滚动,
                且<maxHistory> 是1,则只保存最近1个月的文件,删除之前的旧文件 -->
                 <MaxHistory>1</MaxHistory>
                 
              <!--   保持30天的历史记录上限为3GB总大小 -->
                 <totalSizeCap>3GB</totalSizeCap>
                
            </rollingPolicy>
        </appender>
        
    <!--这里选择INFO就代表,进行INFO级别输出记录,那么在控制台也好,log文件也好只记录INFO及以上级别的日志,这里相当于第一道过滤器--> <root level="INFO"> <appender-ref ref="consoleApp"/> <appender-ref ref="fileInfoApp"/> <appender-ref ref="fileErrorApp"/> </root> </configuration>

    有关配置文件详细介绍放到下面讲,这里先跳过

    3.controller类

    @RestController
    @RequestMapping("/api/v1")
    public class UserController {
        
        private Logger logger = LoggerFactory.getLogger(this.getClass());
        
        @GetMapping("log")
        public Object testLog(){
            
            logger.debug("---debug---debug---");
            logger.info("---info---信息---");
            logger.warn("---warn ---警告--- ");
            logger.error("---err---错误---");
            //这也是个错误的日志级别
            int i=1/0;
            return "yes";
        }
    
    }

    4、效果:

    我们发现,在项目中自动创建app_log/log/app.info(当天日期).log和app.err(当天日期).log文件

    然后我们看

      app.err.2018-05-21.log

    它只存放err级别日志

    app.info.2018-05-21.log

    它只存放的info和warn两种基本日志,这是为什么呢?详细介绍下配置文件

    三、配置文件介绍

    一:根节点<configuration>

     它的三个子节点
      (1)<appender></appender>  格式化日志输出节点,有两个必要属性name和class。
      (2) <logger></logger>  用来设置某一个包或具体的某一个类的日志打印级别、以及指定<appender>。
      (3)<root></root>(要加在最后)(必选,而且只有一个)(用来指定最基础的日志输出级别,他有俩个自己点可以用来应用appender,格式化日志输出)

    二、appender节点

        它有两个属性nameclass

        (1) class="ch.qos.logback.core.ConsoleAppender":把日志输出

        (2)class="ch.qos.logback.core.FileAppender":把日志添加到文件

          (3)class="ch.qos.logback.core.rolling.RollingFileAppender":滚动记录文件,先将日志文件指定到文件,当符合某个条件时,将日志记录到其他文件

    所以上面第一个appender代表输出到控制台,同时并没有进行任何过滤,所以只要是INFO级别以上的都会在控制台输出。

    四、filter过滤器

     其它的一看就懂,就这里,一开始一直想不明白,为什么上面的info文件里只有info和warn,而err文件中只有err日志。后来明白了。

    他有几个常用的过滤器

     (1)LevelFilter 过滤器

     级别过滤器,根据日志级别进行过滤。如果日志级别等于配置级别,过滤器会根据onMath 和 onMismatch接收或拒绝日志。

      <filter class="ch.qos.logback.classic.filter.LevelFilter">
                 <level>ERROR</level>
                <onMatch>DENY</onMatch>
                <onMismatch>ACCEPT</onMismatch>
    </filter>

    <level>:设置过滤级别

    将过滤器的日志级别配置为ERROR,所有ERROR级别的日志交给appender处理,非ERROR级别的日志,被过滤掉。

    (这样的话那上面不是只显示ERROR日志,怎么最后显示的是INFO和WARN日志呢?看下面)

    <onMatch>: 用于配置符合过滤条件的操作

    <onMismatch>:用于配置不符合过滤条件的操作

     再看有这么几个单词DENY(拒绝),NEUTRAL(中性),ACCEPT(接受)

        (1)返回DENY,日志将立即被抛弃不再经过其他过滤器;

        (2)返回NEUTRAL,有序列表里的下个过滤器过接着处理日志;

        (3)返回ACCEPT,日志会被立即处理,不再经过剩余过滤器

    在理解下:

                <level>ERROR</level>         <!-- 所有ERROR级别的日志交给appender处理,非ERROR级别的日志,被过滤掉 -->
                <onMatch>DENY</onMatch>      <!-- 代表符合过滤条件的拒绝输出 -->
                <onMismatch>ACCEPT</onMismatch>   <!-- 不符合过滤条件的接受输出 -->  

    我靠,这么绕一圈不还是表示非ERROR级别的输出嘛,DEBUG除外,因为DUBUG在root标签,已经过滤掉,都不会走到appender标签这里

    (2)ThresholdFilter 过滤器

      临界值过滤器,过滤掉低于指定临界值的日志。当日志级别等于或高于临界值时,过滤器返回NEUTRAL;当日志级别低于临界值时,日志会被拒绝。

    <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
                <level>ERROR</level>
     </filter>

     这里只会访问ERROR及以上级别的过滤器,而ERROR已经是最高级了,所以就只显示ERROR日志在errer文件中了,所以一切都通了

    github源码:源码

     想太多,做太少,中间的落差就是烦恼。想没有烦恼,要么别想,要么多做。上尉【11】

  • 相关阅读:
    C++中virtual(虚函数)的用法
    testlins
    MATLAB——matlab特殊符号表【转载】
    VS-按F12无法跳转到函数定义,点击右键也无法跳转
    fatal error LNK1123: failure during conversion to COFF: file invalid or corrupt
    Matlab7.1——启动时只显示Logo
    CANopen——总线基本知识
    CANopen——笔记
    ASCII表格
    Codesys——AD_DA在PID控制中的作用
  • 原文地址:https://www.cnblogs.com/Javastudy-note/p/13818054.html
Copyright © 2020-2023  润新知