• SpringBoot04 日志框架之Logback


     

    1 日志框架选择

      日志门面:SLF4J

      日志实现:Logback

     

    2 实现控制台的日志打印输出01

      2.1 在需要实现日志信息打印的类中实例化Logger对象

        坑01:springBoot项目默认使用slf4j的logback来实现日志处理,所以我们在导入日志相关的包是必须是 org.slf4j.Logger

        private final Logger logger = LoggerFactory.getLogger(getClass());

          注意01:getClass() 可以换成  类名.class

          注意02: 与日志相关的包导入的是 org.slf4j 下面的

          技巧01:LoggerFactory.getLogger() 中的参数是会包含在日志信息中的,所以参数必须是本类名,这样就可以根据日志信息准确的定位到日志产生处,如果写成其他的类名名就很容器造成歧义。

      2.2 通过日志对象调用相应的方法实现日志的打印

            log.debug("===debug===");
            log.info("===info===");
            log.warn("===warn===");

      2.3 运行,在控制台观察打印信息【我使用的是一个测试类】

          注意01:这里没有打印出debug相关的log信息,那是因为spring默认配置的日志级别是info,只有在info及以上级别的日志信息才会被打印出来

          技巧02:如何查看 日志级别 信息

            通过 navigate -> class 打开类名搜索窗口,IDEA的快捷键是 ctrl + N

            输入 Level 

            选择 org.slf4j.event

              从源代码中可以看出 debug 的日志级别要低于info的日志级别(数字越大级别越高)

               

      2.4 控制台的日志输出信息

        从控制台的输出信息可以看出,即使我们没有对log进行任何配置还是按照某种日志输出格式进行了输出;这是因为SpringBoot的logback日志框架有一些默认的日志配置,这就是SpringBoot默认大于配置的强大之处,如果开发者不进行任何配置时就会使用默认的配置。

      

      2.5 查看SpringBoot默认的日志配置

        在依赖文件中找到logback先关的包,正式由于这些默认的日志配置文件才出现了2.4的输出结果

            

          

    3 实现控制台的日志打印输出02

      3.1 在相应的类上添加 @Slf4j  注解

        注意01:需要额外导入相关jar包,这个lomboc依赖包不仅包含一些日志相关的还包含一些Get/Set相关的

            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
            </dependency>

      3.2 在需要进行日志输出的地方直接使用log对象的相关方法进行啦

          问题01: 在使用了  @Slf4j  注解,并且导入相关jar包后,log对象出现找不到的错误信息

          解决01:安装lombok相关插件,具体步骤请参见:点击前往

            

      3.3 运行项目,观察控制台信息【我使用的是一个测试类】

      

      3.4 如何在日志中输出变量

        @Test
        public void Test03() {
            String name = "warrior";
            Integer age = 24;
            log.info("===姓名:{} = 年龄:{}", name, age);
        }

        

     

    4 日志配置之利用yml文件进行配置

      如果只是对日志信息进行一些简单的配置就可以通过yml配置文件后者properties配置文件进行

      技巧01:通常在yml或者properties配置文件中只配置日志输出级别和日志文件存储路径,其他的都使用SpringBoot原生的配置

    logging:
      level:
          cn.xiangxu.demo.log: debug
    #  file: "C:/Users/a/Desktop/fury/log/logInfo.log"
      path: "C:/Users/a/Desktop/fury/log"
    
      # 坑01:level 设置必须制定一个包名
      # 坑02:path 和 file 只能设置一个

      坑01:path 和 file 只能设置一个,而且 path 仅仅是路径而已,具体日志文件名会使用 spring.log ;而 file 不经需要设置路径还要指定日志文件名,最末尾就代表日志文件名

      坑02:如果直接将 level 设置成 level: debug 这种形式就会报错,错误信息如下;因为之前版本的SpringBoot如果像这样设置就会对整个项目设置日志输出级别,我使用SpringBoot2.0版本时就会出现这种错误;解决办法时在设置 level 时指定一个包;参考博文:点击前往

      

      4.1 控制台输出的日志信息

        技巧01:日志文件中的日志信息和控制台输出的日志信息是一致的

        技巧02:从日志输出信息可以看出调试的日志信息也被打印出来了,这是因为我们在设置日志的输出级别时设置的是 debug 级别

       

    5 日志配置之利用xml文件进行配置

      5.1 在 resources 目录下创建一个名为 logback-spring.xml 的日志文件

        

      5.2 配置结果说明

        技巧01:一个配置文件中可以配置多个 appender 来处理日志输出

        技巧02:在 appender 由 layout 或者 encoder 负责日志格式化相关配置     

        技巧03:在 appender 中通过  rollingPolicy 来设置日志滚动配置(例如:每天产生一个日志文件)

        技巧04:在 appender 可以通过 filter  来过滤日志级别

          》LevelFilter

            主要过滤日志级别,只用满足条件的日志级别会被处理;必须通过 onMatch 和  onMismatch 设置匹配到的和没匹配到的状态;状态种类如下

              

              例子:

                <onMatch>DENY</onMatch>   -->> 表示对匹配到的日志级别不做处理  

                <onMismatch>DENY</onMismatch>  -->> 表示对未匹配到的日志级别不做任何处理

          》ThresholdFilter

            主要过滤某个日志级别及其之上的日志级别

            坑01:不可以通过 onMatch 和  onMismatch 设置匹配到的和没匹配到的状态

    <?xml version="1.0" encoding="UTF-8"?>
    
    <configuration>
        <!--控制台日志配置-->
        <appender name="consoleLog" class="ch.qos.logback.core.ConsoleAppender">
            <layout class="ch.qos.logback.classic.PatternLayout">
                <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg  %n</pattern>
            </layout>
        </appender>
    
        <!--文件日志配置【info以及warn】-->
        <appender name="fileInfoLog" 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 class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
                <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg  %n</pattern>
            </encoder>
            <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                <fileNamePattern>
                    C:/Users/a/Desktop/fury/log/fileInfoLog.%d.log
                </fileNamePattern>
            </rollingPolicy>
        </appender>
    
        <!--指定日志配置应用位置-->
        <root lever="info">
            <appender-ref ref="consoleLog" />
            <appender-ref ref="fileInfoLog" />
            <appender-ref ref="fileErLog" />
        </root>
    </configuration>

      5.3 完整的日志配置文件

         参考博文:点击前往

    <?xml version="1.0" encoding="UTF-8"?>
    
    <configuration>
        <!--控制台日志配置-->
        <appender name="consoleLog" class="ch.qos.logback.core.ConsoleAppender">
            <layout class="ch.qos.logback.classic.PatternLayout">
                <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg  %n</pattern>
            </layout>
            <!--<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">-->
                <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
                <!--<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg  %n</pattern>-->
            <!--</encoder>-->
        </appender>
    
        <!--文件日志配置【info以及warn】-->
        <appender name="fileInfoLog" 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 class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
                <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
                <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg  %n</pattern>
            </encoder>
            <!--滚动配置(按照日期生成日志文件)-->
            <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                <!--文件名配置-->
                <fileNamePattern>
                    C:/Users/a/Desktop/fury/log/fileInfoLog.%d.log
                </fileNamePattern>
            </rollingPolicy>
        </appender>
    
        <!--日志文件配置【error及其以上的都会被处理】-->
        <appender name="fileErrorLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <!--过滤日志级别:此处是指保留匹配到的级别-->
            <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
                <level>ERROR</level>
            </filter>
            <!--日志格式配置-->
            <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
                <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
                <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg  %n</pattern>
            </encoder>
            <!--滚动配置-->
            <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                <!--文件名配置-->
                <fileNamePattern>
                    C:/Users/a/Desktop/fury/log/fileErrorLog.%d.log
                </fileNamePattern>
            </rollingPolicy>
        </appender>
    
        <!--日志文件配置【fileDebugLog】(仅仅处理DEBUG级别)-->
        <appender name="fileDebugLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <!--过滤日志级别:此处是指处理匹配到的级别-->
            <filter class="ch.qos.logback.classic.filter.LevelFilter">
                <level>DEBUG</level>
                <onMatch>ACCEPT</onMatch>
                <onMismatch>DENY</onMismatch>
            </filter>
            <!--日志格式配置-->
            <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
                <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
                <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg  %n</pattern>
            </encoder>
            <!--滚动配置-->
            <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                <!--文件名配置-->
                <fileNamePattern>
                    C:/Users/a/Desktop/fury/log/fileDebugLog.%d.log
                </fileNamePattern>
            </rollingPolicy>
        </appender>
    
        <!--指定日志配置应用位置-->
        <root lever="info">
            <appender-ref ref="consoleLog" />
            <appender-ref ref="fileInfoLog" />
            <appender-ref ref="fileErrorLog" />
            <appender-ref ref="fileDebugLog" />
        </root>
    </configuration>
    View Code

      5.4 在配置文件中对日志进行相关配置(参考)

    <?xml version="1.0" encoding="UTF-8"?>
    
    <configuration>
        <!--控制台日志配置-->
        <appender name="consoleLog" class="ch.qos.logback.core.ConsoleAppender">
            <layout class="ch.qos.logback.classic.PatternLayout">
                <pattern>
                    %d - %msg - %n
                </pattern>
            </layout>
        </appender>
    
        <!--文件日志配置【info以及warn】-->
        <appender name="fileInfoLog" 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>
                    %d - %msg - %n
                </pattern>
            </encoder>
            <!--滚动配置-->
            <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                <!--文件名配置-->
                <fileNamePattern>
                    C:/Users/a/Desktop/fury/fileInfoLog.%d.log
                </fileNamePattern>
            </rollingPolicy>
        </appender>
    
        <!--日志文件配置【error】-->
        <appender name="fileErrorLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <!--过滤日志级别:此处是指保留匹配到的级别-->
            <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
                <level>ERROR</level>
            </filter>
            <!--日志格式配置-->
            <encoder>
                <pattern>
                    %d - %msg - %n
                </pattern>
            </encoder>
            <!--滚动配置-->
            <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                <!--文件名配置-->
                <fileNamePattern>
                    C:/Users/a/Desktop/fury/fileErrorLog.%d.log
                </fileNamePattern>
            </rollingPolicy>
        </appender>
    
        <!--指定日志配置应用位置-->
        <root lever="info">
            <appender-ref ref="consoleLog" />
            <appender-ref ref="fileInfoLog" />
            <appender-ref ref="fileErrorLog" />
        </root>
    </configuration>
    
    <!--<beans xmlns="http://www.springframework.org/schema/beans"-->
           <!--xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"-->
           <!--xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">-->
    <!--</beans>-->
    View Code
    <?xml version="1.0" encoding="UTF-8"?>
    <configuration debug="false">
        <!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径-->
        <!--<property name="LOG_HOME" value="./logs" />-->
        <property name="LOG_HOME" value="C:/Users/a/Desktop/fury/log" />
        <!-- 控制台输出 -->
        <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
            <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
                <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
                <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg  %n</pattern>
            </encoder>
        </appender>
        <!-- 按照每天生成日志文件 -->
        <appender name="FILE"  class="ch.qos.logback.core.rolling.RollingFileAppender">
            <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                <!--日志文件输出的文件名-->
                <FileNamePattern>${LOG_HOME}/runtime.log.%d{yyyy-MM-dd}.log</FileNamePattern>
                <!--日志文件保留天数-->
                <MaxHistory>30</MaxHistory>
            </rollingPolicy>
            <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
                <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
                <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg %n</pattern>
            </encoder>
            <!--日志文件最大的大小-->
            <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
                <MaxFileSize>10MB</MaxFileSize>
            </triggeringPolicy>
        </appender>
    
        <!-- 日志输出级别 -->
        <root level="INFO">
            <appender-ref ref="STDOUT" />
            <appender-ref ref="FILE" />
        </root>
    </configuration>
    详细配置02
     1 <?xml version="1.0" encoding="UTF-8" ?>
     2 <configuration scan="false" scanPeriod="60000" debug="false">
     3 
     4     <!--定义控制台的日志输出格式-->
     5     <property name="CONSOLE_LOG_PATTERN" value="%highlight(console) %highlight(%d{yyyy-MM-dd HH:mm:ss.SSS}) %highlight([%-10thread]) %highlight(%-5level) %highlight(%logger) -> %highlight(%msg%n)"></property>
     6     <property name="FILE_LOG_POSITION" value="F:/AltEnter/SpringBoot/01LvYiMing/01TwoQi/03AltEnterCode/00logdir/study0util.log"></property>
     7     <property name="FILE_LOG_PATTERN" value="console %d{yyyy-MM-dd HH:mm:ss.SSS} [%-10thread] %-5level %logger -> %msg%n"></property>
     8     <property name="ROLLING_FILE_LOG_POSITION" value="F:/AltEnter/SpringBoot/01LvYiMing/01TwoQi/03AltEnterCode/00logdir/study0util.%d{yyyy-MM-dd}.log"></property>
     9     <property name="ROLLING_FILE_LOG_PATTERN" value="console %d{yyyy-MM-dd HH:mm:ss.SSS} [%-10thread] %-5level %logger -> %msg%n"></property>
    10 
    11     <!--控制台输出的日志格式-->
    12     <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
    13         <encoder>
    14             <!--<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n</pattern>-->
    15             <!--<pattern>%black(控制台-) %red(%d{yyyy-MM-dd HH:mm:ss}) %green([%thread]) %highlight(%-5level) %boldMagenta(%logger{10}) - %cyan(%msg%n)</pattern>-->
    16             <pattern>${CONSOLE_LOG_PATTERN}</pattern>
    17         </encoder>
    18     </appender>
    19 
    20     <!--固定文件输出的日志格式-->
    21     <appender name="FILE" class="ch.qos.logback.core.FileAppender">
    22         <!--文件位置及其文件名-->
    23         <file>${FILE_LOG_POSITION}</file>
    24         <!--日志追加方式-->
    25         <append>true</append>
    26         <!--日志格式-->
    27         <encoder>
    28             <pattern>${FILE_LOG_PATTERN}</pattern>
    29         </encoder>
    30     </appender>
    31 
    32     <!--滚动文件输出的日志格式-->
    33     <appender name="ROLLING-FILE-1" class="ch.qos.logback.core.rolling.RollingFileAppender">
    34         <!--滚动配置(按照日期生成日志文件)-->
    35         <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
    36             <!--文件名配置-->
    37             <fileNamePattern>${ROLLING_FILE_LOG_POSITION}</fileNamePattern>
    38             <!--旧文件存储数量-->
    39             <maxHistory>30</maxHistory>
    40         </rollingPolicy>
    41         <!--日志格式-->
    42         <encoder>
    43             <pattern>${ROLLING_FILE_LOG_PATTERN}</pattern>
    44         </encoder>
    45     </appender>
    46 
    47     <!-- 异步输出 -->
    48     <appender name ="ASYNC" class= "ch.qos.logback.classic.AsyncAppender">
    49         <!-- 不丢失日志.默认的,如果队列的80%已满,则会丢弃TRACT、DEBUG、INFO级别的日志 -->
    50         <discardingThreshold>0</discardingThreshold>
    51         <!-- 更改默认的队列的深度,该值会影响性能.默认值为256 -->
    52         <queueSize>256</queueSize>
    53         <!-- 添加附加的appender,最多只能添加一个 -->
    54         <appender-ref ref ="ROLLING-FILE-1"/>
    55     </appender>
    56 
    57 
    58 
    59     <!--指定某个包或者类的日志输出方式(如果某个包在这里设定了,并且additivity="false",那么对应root中设定的日志输出方式就会失效)-->
    60     <!--<logger name="com.xunyji.point01logback" additivity="true"></logger>-->
    61     <!--<logger name="com.xunyji.point01logback" additivity="false" level="trace">-->
    62         <!--<appender-ref ref="CONSOLE"></appender-ref>-->
    63         <!--<appender-ref ref="ASYNC"></appender-ref>-->
    64     <!--</logger>-->
    65 
    66     <!--指定所有的日志输出方式-->
    67     <root level="info">
    68         <appender-ref ref="CONSOLE"></appender-ref>
    69         <appender-ref ref="FILE"></appender-ref>
    70         <appender-ref ref="ROLLING-FILE-1"></appender-ref>
    71     </root>
    72 
    73 </configuration>
    推荐配置文件

    对应参考博文:http://www.cnblogs.com/xrq730/p/8628945.html

    控制台日志输出颜色设置:https://www.cnblogs.com/sxdcgaq8080/p/7885340.html

     6 源代码

      点击前往

      

  • 相关阅读:
    js 正则表达式之环视结构
    Js 控制随机数概率
    js 随机点名
    事件处理机制
    事件处理程序 (DOM0级)
    事件处理程序(HTML)
    js正则表达式 URL格式匹配详解
    CSS中的圣杯布局与双飞翼布局
    CSS中的vertical-align属性
    CSS中元素的显示模式
  • 原文地址:https://www.cnblogs.com/NeverCtrl-C/p/7895394.html
Copyright © 2020-2023  润新知