zoukankan      html  css  js  c++  java
  • 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 源代码

      点击前往

      

  • 相关阅读:
    软件体系架构复习要点
    Operating System on Raspberry Pi 3b
    2019-2020 ICPC North-Western Russia Regional Contest
    2019 ICPC ShenYang Regional Online Contest
    2019 ICPC XuZhou Regional Online Contest
    2019 ICPC NanChang Regional Online Contest
    2019 ICPC NanJing Regional Online Contest
    Codeforces Edu Round 72 (Rated for Div. 2)
    Codeforces Round #583 (Div.1+Div.2)
    AtCoder Beginning Contest 139
  • 原文地址:https://www.cnblogs.com/NeverCtrl-C/p/7895394.html
Copyright © 2011-2022 走看看