日志框架之logback

寻渝记 寻渝记     2022-10-02     493

关键词:

 

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 
springboot使用之三:springboot使用logback日志

springboot默认使用的日志就是logback,所以使用logback不需要添加日志相关依赖了,执行添加logback.xml配置文件,springboot这个聪明的框架便能识处理你的配置。做法:将logback.xml放在resources下(classpath)下即可。配置参考如下:<?xm... 查看详情

springboot初始教程之日志处理

SpringBoot初始教程之日志处理(二)1.介绍SpringBoot默认是采用logback进行日志处理、Logback是由log4j创始人设计的又一个开源日志组件。Logback是由log4j创始人设计的又一个开源日志组件。logback当前分成三个模块:logback-core,logback-classic和... 查看详情

重学springboot系列之日志框架与全局日志管理(代码片段)

...门面存在的意义日志框架选型日志级别常见术语概念解析logback日志框架配置application配置文件实现日志配置日志格式占位符使用logback-spring.xml实现日志配置需求需求实现测试一下log4j2日志框架整合与使用引入maven依赖添加配置文... 查看详情

springboot之logback日志最佳实践

...但是底层日志实现是开放的。为JavaUtil日志记录、Log4J2和Logback提供了缺省配置。在每种情况下,日志记录器都预先配置为使用控制台输出和可选的文件输出。  默认情况下,如果使用SpringBoot的“Starters”坐标,则默认使用Logbac... 查看详情

springboot初始教程之日志处理(代码片段)

SpringBoot初始教程之日志处理(二)1.介绍SpringBoot默认是采用logback进行日志处理、Logback是由log4j创始人设计的又一个开源日志组件。Logback是由log4j创始人设计的又一个开源日志组件。logback当前分成三个模块:logback-core,logback-class... 查看详情

springboot初始教程之日志处理(代码片段)

SpringBoot初始教程之日志处理(二)1.介绍SpringBoot默认是采用logback进行日志处理、Logback是由log4j创始人设计的又一个开源日志组件。Logback是由log4j创始人设计的又一个开源日志组件。logback当前分成三个模块:logback-core,logback-class... 查看详情

logback日志框架的简单使用(代码片段)

最近在自己搭建项目的时候,遇到logback选的问题,现在记录如下在框架中使用logback日志框架,关于logback和log4j日志框架的选择,这里就不多说了网上百度一大堆,总之一句话logback要比log4j效率高,性能好,配置灵活。1.首先在ma... 查看详情

日志框架统一切换之:日志分割需求(转)

...的6点、12点、18点、24点分割日志。 二、现状目前的logback只是按照每月、日、半天、时、分切割,没有按照每隔6小时切割的配置支持(我知道的没有,请指教) 三、解决方案之前使用过SizeAndTimeBasedFNATP来按照时间和文件... 查看详情

slf4j之logback日志之环境安装

一、maven引用.传送门:http://www.slf4j.org/manual.html#projectDep<dependency><groupId>ch.qos.logback</groupId><artifactId>logback-classic</artifactId><version>1.0.13</ve 查看详情

日志框架--logback(代码片段)

logback背景介绍:SLF4J(SimpleLoggingFacadeforJava)是一个日志API接口,SLF4J提供TRACE,DEBUG,INFO,WARN,ERROR五种级别,而log4j和logback就是对SLF4J的具体实现。logback的性能优于log4j。logback-core:其它两个模块的基础模块logback-classic:它是log4j的一... 查看详情

logback之appender源码解读

参考技术A在logback日志框架中,每一个Logger都会去关联一个Appender,Appender是真正把日志内容输出到控制台,文件等,可以说在日常应用中非常重要和拓展的一个组件。其中最重要的就是doAppend()方法,每一个日志事件输出,都会... 查看详情

日志组件之debug动态开关(代码片段)

日志组件之debug动态开关一、应用场景二、logback简介三、logback应用debug动态开关 一、应用场景生产环境,系统日志记录级别一般高于或等于INFO,不会开启DEBUG级别的日志打印。但如果生产环境系统出现问题,需要在... 查看详情

akka中使用logback日志框架

...可以整合SLF4J这样的日志系统,下面介绍如何在Akka中使用Logback记录日志。 1.创建Maven工程引入相关依赖。<projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSche 查看详情

slf4j与logback日志配置详解

背景javaweb下有好几种日志框架,比如:logback,log4j,log4j2(slj4f并不是一种日志框架,它相当于定义了规范,实现了这个规范的日志框架就能够用slj4f调用)。其中性能最高的应该使logback了,而且springboot默认使用的也是logback日... 查看详情

日志框架-logback

...是同一个作者,性能过于优秀,但并不支持太多场景6)Logback-推荐7)JUL-官方的日志,但是实现太过于简陋  查看详情

logback日志框架第三方jar包下载教程

logback-core下载(点击下方链接即可跳转):https://logback.qos.ch/download.html点击选择对应的模块:选择对应的版本:(本篇以1.2.3版本为例子)选择对应的jar包并保存到本地即可:由于logback-classic的下载过程与logback- 查看详情

slf4j和logback日志框架详解(代码片段)

SLF4J和Logback日志框架详解作者:chszs,转载需注明。博客主页:http://blog.csdn.net/chszs本文讲述SLF4J和Logback日志框架。  SLF4J是一套简单的日志外观模式的JavaAPI,帮助在项目部署时对接各种日志实现。LogBack在运行时... 查看详情

日志框架logback相对于log4j的优势

日志框架logback相对于log4j的优势。更快的实现 Logback的内核重写了,在一些关键执行路径上性能提升10倍以上。而且logback不仅性能提升了,初始化内存加载也更小了。 非常充分的测试 Logback经过了几年,数不清小时的... 查看详情