logback日志框架

目录

logback的基本介绍

 logback的模块组成

日志级别

Logback的配置文件结构讲解

  root标签

 logger标签

appender标签

 filter标签

encoder标签 

 property标签

logback 内部运行流程

Logback的快速使用

非 springboot 项目

springboot 项目

 logback.xml 配置文件说明


logback的基本介绍

Logback是一个用于Java应用程序的日志框架,它由log4j框架的创始人Ceki Gülcü开发。logback是log4j框架的继承者和改进版,并提供了更好的性能、可扩展性和灵活性。与Log4j相比,Logback提供了更快的速度和更低的内存占用,这使得它成为大型企业级应用程序的理想选择。

官网地址:https://logback.qos.ch/index.html

简单的说,logback是对log4j这个框架的改良和继承,同时logback还是springboot项目内置的日志框架,所以如果是springboot项目,你不需要自己引入相关的依赖,你只需要编写对应的logback配置就可以直接集成logback到你的项目中
 

spring-boot-starter-* =>spring-boot-starter =>spring-boot-starter-logging
spring-boot-starter-logging 启动器依赖,默认集成的是 logback 日志

 logback的模块组成

lLogback包括三个模块:logback-core、logback-classic和logback-access。

  • logback-core :提供了通用的日志记录功能
  • logback- classic:提供了与SLF4J API和log4j API兼容的日志记录功能;
  • logback-access:提供了HTTP访问日志的功能

logback-core是其它两个模块的基础模块。logback-classic 的地位和作用等同于 Log4J,它也被认为是 Log4J 的一个改进版,并且它实现了简单日志门面 SLF4J;而 logback-access 主要作为一个与 Servlet 容器交互的模块,比如说 tomcat 或者 jetty,提供一些与 HTTP 访问相关的功能。

简单理解就是logback-core是logback的核心模块,其他模块都依赖这个模块去实现日志功能,logback- classic这个模块就依赖了logback-core。springboot项目默认内置的就是logback- classic

日志级别

Logger有五个日志级别,分别是TRACE、DEBUG、INFO、WARN、ERROR,
这五个级别优先级为,TRACE<DEBUG<INFO<WARN<ERROR

TRACE - 这是最详细的日志级别,用于跟踪程序执行的每一个步骤,适合进行调试。
DEBUG - 提供较细粒度的信息,有助于开发者诊断问题。
INFO - 用于记录程序的主要运行状态和信息,如启动和关闭。
WARN - 表示可能出现潜在问题的警告信息。
ERROR - 记录严重的错误信息,可能会导致程序退出。

由测试可以看出logback默认的日志级别也是info 

Logback的配置文件结构讲解

logback.xml配置文件的基本结构可以描述为<configuration>标签,包含零个或多个<appender>标签,后跟零个或多个<logger>标签,后跟最多一个<root>标签(也可以没有)。

  root标签

root标签指定最基础的的日志输出级别,它只有一个level属性,可以包含 appender-ref 元素。
level属性可以选择,ALLTRACEDEBUGINFOWARNERRORNULLOFFINHERITED

使用示例:

    <root level="INFO">
        <appender-ref ref="console"/>
        <appender-ref ref="rollFile"/>
    </root>
 logger标签

logger就是日志记录器,用来控制要输出哪些日志记录语句,对日志信息进行级别限制。

有level属性、name属性、additivity属性,其中name属性必须要写,指定到哪一个类或者哪一个包,additivity表示是否向上一层传递打印信息,默认为true。可以包含 appender-ref 元素

在 logback 中,每个 logger 都是一个单例,调用 LoggerFactory.getLogger 方法时,如果传入的 logger name 相同,获取到的 logger 都是同一个实例。

在为 logger 命名时,用类的全限定类名作为 logger name 是最好的策略,这样能够追踪到每一条日志消息的来源。
使用示例:

<configuration>
    <logger level="ERROR" name="com.example.testlog.LogTest" additivity="false">
    	<appender-ref ref="STDOUT"></appender-ref>
    </logger>
</configuration>

这个相当于自定义了一个logger对象,默认可以不写(该开发中不常用) 

appender标签

appender就是附加器,日志记录器会将输出的任务交给附加器完成,不同的附加器会将日志输出到不同的地方,例如控制台、文件、网络等

几个常见的附加器:

控制台附加器:ch.qos.logback.core.ConsoleAppender
文件附加器:ch.qos.logback.core.FileAppender
滚动文件附加器:ch.qos.logback.core.rolling.RollingFileAppender

属性有name、class,class用来指定附加器,name来表示当前附件器的名字。其他需要指定附件器的标签,可以通过appender-ref标签中的ref来指定。可以包含encoder元素、fileter元素等 

案例:

 控制台appender

 滚动日志文件appender

 filter标签

filter是过滤器,过滤器是附件器的一个组件,它是用于判断附件器是否输出日志的。一个附件器可以包含多个过滤器。
过滤器只能有三个值,DENY、NEUTRAL、ACCEPT。
DENY是不输出日志
NEUTRAL是不决定是否输出日志
ACCEPT是输出日志。

<configuration>
 	<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <filter>
            <level>info</level>
            <onMatch>DENY</onMatch>
            <onMismatch>ACCEPT</onMismatch>
        </filter>
        <encoder>
            <pattern>%d{HH:mm:ss.SSS} [%-5level] %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>
</configuration>
encoder标签 

encoder最主要的就是pattern标签,用于控制输出日志的格式

<!--
日志输出格式:
%-5level
%d{yyyy-MM-dd HH:mm:ss.SSS}日期
%c类的完整名称
%M为method
%L为行号
%thread线程名称
%m或者%msg为信息
%n换行
-->
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度
%msg:日志消息,%n是换行符-->

 property标签

property标签用来定义变量, 有两个属性,name和value;其中name的值是变量的名称,value的值时变量定义的值

这里相当于定义了一个pattern变量,可以在整个配置文件中使用

logback 内部运行流程

当应用程序发起一个记录日志的请求,例如 info() 时,logback 的内部运行流程如下所示

  1. 获得过滤器链条

  2. 检查日志级别以决定是否继续打印

  3. 创建一个 LoggingEvent 对象

  4. 调用 Appenders

  5. 进行日志信息格式化

  6. 发送 LoggingEvent 到对应的目的地

Logback的快速使用

使用流程:导入依赖--》编写配置文件(不管那种项目,logback的使用流程都是这样)

  • 非 springboot 项目

导入依赖

<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
</dependency>

编写配置文件(这个配置文件是参考的开发的配置,一般都可以直接这样用)

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <!--
    日志输出格式:
    %-5level
    %d{yyyy-MM-dd HH:mm:ss.SSS}日期
    %c类的完整名称
    %M为method
    %L为行号
    %thread线程名称
    %m或者%msg为信息
    %n换行
    -->
    <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度
    %msg:日志消息,%n是换行符-->
    <property name="pattern" value="%d{yyyy-MM-dd HH:mm:ss} [%-5level] %c %M %L [%thread] %m %n"/>
    <!--
    Appender: 设置日志信息的去向,常用的有以下几个
    ch.qos.logback.core.ConsoleAppender (控制台)
    ch.qos.logback.core.rolling.RollingFileAppender (文件大小到达指定尺
    寸的时候产生一个新文件)
    ch.qos.logback.core.FileAppender (文件)
    -->
    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <!--输出流对象 默认 System.out 改为 System.err-->
        <target>System.out</target>
        <!--日志格式配置-->
        <encoder
                class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>${pattern}</pattern>
        </encoder>
    </appender>

    <!-- 日志文件存放目录 -->
    <property name="log_dir" value="./logs"></property>
    <!-- 日志文件拆分和归档的appender对象-->
    <appender name="rollFile"
              class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!--日志格式配置-->
        <encoder
                class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>${pattern}</pattern>
        </encoder>
        <!--日志文件名-->
        <file>${log_dir}/logback.log</file>
        <!--指定日志文件拆分和压缩规则-->
        <rollingPolicy
                class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!--通过指定压缩文件名称,来确定分割文件方式-->
            <fileNamePattern>${log_dir}/logback-%d{yyyy-MM-dd}-%i.log</fileNamePattern>
            <!--文件拆分大小-->
            <maxFileSize>50MB</maxFileSize>
        </rollingPolicy>
    </appender>

    <!--
    也是<logger>元素,但是它是根logger。默认debug
    level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL
    和 OFF,
    <root>可以包含零个或多个<appender-ref>元素,标识这个appender将会添加到这个
    logger。
    -->
    <root level="INFO">
        <appender-ref ref="console"/>
        <appender-ref ref="rollFile"/>
    </root>
</configuration>

这里主要是有一个控制台的输出appender(console),用于控制控制台的日志输出,还有一个用于控制日志文件的输出,里面配置和二个滚动规则,当输出的日志文件大于50MB会对日志文件进行压缩,然后每天都会将日志生成一个单独的文件  

  • springboot 项目

任何一个 spring-boot-starter-* 都会默认导入一个 spring-boot-starter-logging 启动器依赖,因此只要当前项目的依赖中有starter,无需显式引入。

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

logback-spring.xml配置文件

配置文件内容如上


Spring Boot默认支持Logback,并已经带有一系列的自动配置。当我们在classpath下添加了logback-spring.xml或logback.xml配置文件时,Spring Boot会使用Logback作为默认的日志框架。

 logback.xml 配置文件说明

<?xml version="1.0" encoding="UTF-8" ?>
<!--
configuration是logback的根标签
scan="true" 表示配置文件发生了改变会自动加载
scanPeriod="60 seconds" 检测配置文件修改的时间间隔,默认的单位是毫秒,这里设置的表示每分钟检测
debug="false" debug如果设置为true,表示会打印出来logback自身实时的运行信息,这里就不需要了,因为logback自身运行时非常稳定的,不需要对它做日志
-->
<configuration
    scan="true"
    scanPeriod="60 seconds"
    debug="false">

    <!--**************配置********************-->

    <!--优雅关机 为了防止进程退出时,内存中的数据丢失,请加上此选项
        5 seconds 表示服务会等待5秒后执行释放资源的相关操作,默认位0秒-->
    <shutdownHook class="ch.qos.logback.core.hook.DelayingShutdownHook">
        <delay>5 seconds</delay>
    </shutdownHook>

    <!--**************定义常量参数********************-->

    <!--定义一些参数常量-->
    <!--定义日志的输出地址 用于windows电脑日志存放地址路径-->
    <property name="log.filepath" value="D:\\logfile\\logfile"/>

    <!--定义日志的输出地址 用于linux服务器日志存放地址路径
        source="logging.file.path" 指向 yml 或者 properties 配置文件里面的值-->
    <springProperty scope="context"  name="log.path.linux"  source="logging.file.path"/>

    <!--
    定义日志展示格式
    %d{yyyy-MM-dd HH:mm:ss} 定义一条日志的展示时间
    [%thread] 表示执行日志的线程名称
    %-5level 空出5个空格,然后显示日志级别
    %logger{100} 显示在哪个类(全限定类名)里面记录的日志,后面的{100}表示这个类名展示的最大长度是100
    %msg 表示的日志信息
    %n 表示换行
    -->
    <property name="log.pattern" value="%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{100} - %msg%n"/>

    <!--彩色日志展示格式-->
    <property name="console.log.pattern" value="%red(%d{yyyy-MM-dd HH:mm:ss}) %green([%thread]) %highlight(%-5level) %boldMagenta(%logger{36}) - %msg%n"/>

    <!--**************设置输出媒介********************-->

    <!--定义日志输出媒介-->
    <!--定义控制台输出,class指定的具体输出要使动的类-->
    <appender name="consoleAppender" class="ch.qos.logback.core.ConsoleAppender">
        <!--appender其实是负责统一调度日志的输出工作,而具体的日志的格式化工作和输出的工作会交给encoder-->
        <encoder>
            <!--定义日志输出的格式-->
            <pattern>${console.log.pattern}</pattern>
            <!--设置输出内容编码-->
            <charset>utf-8</charset>
        </encoder>
        <!--过滤底层日志记录器向上层抛出的日志
            因为consoleAppender只需要记录INFO及其以上级别的日志,对于其他的日志不需要,
            所以只需要下面设置即可实现只显示INFO及其以上级别的日志-->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>INFO</level>
        </filter>
    </appender>

    <!--
    接下来还要定义不同级别的日志输出的媒介
    对于日志框架来说,日志是有级别的,logback的日志级别有如下:
    trace(追踪) < debug(调试) < info(记录信息) < warn(警告) < error(错误)
    再记录日志的时候,一般需要使用到一个Logger类的对象,然后可以调用如下方法:
    looger.trace("xxxx"),logger.debug("xxxx"),....等等
    如果记录的日志级别是info的话,info是大于trace和debug的,这个时候调用trace和debug发方法记录的日志是无法显示的。而调用warn和error是可以展示的。
    一般情况下在开发项目的时候,只需要记录debug,info,error的日志就行了,而这个三个级别的日志需要放在不同的文件中
    -->
    <!--定义debug级别的日志输出,RollingFileAppender表示滚动日志,可以按天或者按月来生成不同的日志文件-->
    <appender name="debugAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!--文件路径-->
        <file>${log.filepath}/debug.log</file>
        <!--定义滚动策略,TimeBasedRollingPolicy是一个基于时间的滚动策略-->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--设置按时间的方式来生成文件,如果文件名是用.gz结尾的,那么logback会自动压
                缩日志文件,如果不需要压缩,可以直接把.gz删除就行了
                %d{yyyy-MM-dd} 表示按天保存日志
                %d{yyyy-MM-dd_HH_mm} 表示按分钟保存日志-->
            <fileNamePattern>${log.filepath}/debug-%d{yyyy-MM-dd}.log.gz</fileNamePattern>
            <!--表示日志文件的最大大小,当日志文件达到该大小时,会进行滚动输出,创建一个新的日志文件-->
            <maxFileSize>1024MB</maxFileSize>
            <!--设置文件最大保存的历史数据,这里就默认30份就行了,也就是最大保存30个文件-->
            <maxHistory>30</maxHistory>
        </rollingPolicy>
        <!--定义日志格式-->
        <encoder>
            <!--定义日志输出的格式-->
            <pattern>${log.pattern}</pattern>
            <!--设置输出内容编码-->
            <charset>utf-8</charset>
        </encoder>
        <!--需要注意 <onMatch>ACCEPT</onMatch> 和 <onMismatch>DENY</onMismatch>
            标签只用于日志记录到文件的类型、控制台输出不能使用
            因为debugAppender只需要记录debug级别的日志,对于其他的日志不需要,
            所以要加一个过滤器
            <onMatch>ACCEPT</onMatch> 和 <onMismatch>DENY</onMismatch> 两个标签
            可以实现只显示某一级别的日志,使用这两个标签后,会把非匹配级别的日志直接过滤掉,
            如果只是用了 <level>DEBUG</level> 标签,那么设置级别(包括设置的级别)以上
            的级别都会被记录下来-->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>DEBUG</level>
            <!--如果是DEBUG日志,同意被记录到文件-->
            <onMatch>ACCEPT</onMatch>
            <!--如果不是DEBUG日志,直接忽略-->
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <!--定义info级别的日志的appender-->
    <appender name="infoAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!--文件路径-->
        <file>${log.filepath}/info.log</file>
        <!--定义滚动策略,TimeBasedRollingPolicy是一个基于时间的滚动策略-->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--设置按时间的方式来生成文件,如果文件名是用.gz结尾的,那么logback会自动压
                缩日志文件,如果不需要压缩,可以直接把.gz删除就行了
                %d{yyyy-MM-dd} 表示按天保存日志
                %d{yyyy-MM-dd_HH_mm} 表示按分钟保存日志-->
            <fileNamePattern>${log.filepath}/info-%d{yyyy-MM-dd}.log.gz</fileNamePattern>
            <!--表示日志文件的最大大小,当日志文件达到该大小时,会进行滚动输出,创建一个新的日志文件-->
            <maxFileSize>1024MB</maxFileSize>
            <!--设置文件最大保存的历史数据,这里就默认30份就行了,也就是最大保存30个文件-->
            <maxHistory>30</maxHistory>
        </rollingPolicy>
        <!--定义日志格式-->
        <encoder>
            <!--定义日志输出的格式-->
            <pattern>${log.pattern}</pattern>
            <!--设置输出内容编码-->
            <charset>utf-8</charset>
        </encoder>
        <!--需要注意 <onMatch>ACCEPT</onMatch> 和 <onMismatch>DENY</onMismatch>
            标签只用于日志记录到文件的类型、控制台输出不能使用
            因为infoAppender只需要记录debug级别的日志,对于其他的日志不需要,
            所以要加一个过滤器
            <onMatch>ACCEPT</onMatch> 和 <onMismatch>DENY</onMismatch> 两个标签
            可以实现只显示某一级别的日志,使用这两个标签后,会把非匹配级别的日志直接过滤掉,
            如果只是用了 <level>DEBUG</level> 标签,那么设置级别(包括设置的级别)以上
            的级别都会被记录下来-->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>INFO</level>
            <!--如果是INFO日志,同意被记录到文件-->
            <onMatch>ACCEPT</onMatch>
            <!--如果不是INFO日志,直接忽略-->
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <!--定义error级别的日志的appender-->
    <appender name="errorAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!--文件路径-->
        <file>${log.filepath}/error.log</file>
        <!--定义滚动策略,TimeBasedRollingPolicy是一个基于时间的滚动策略-->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--设置按时间的方式来生成文件,如果文件名是用.gz结尾的,那么logback会自动压
                缩日志文件,如果不需要压缩,可以直接把.gz删除就行了
                %d{yyyy-MM-dd} 表示按天保存日志
                %d{yyyy-MM-dd_HH_mm} 表示按分钟保存日志-->
            <fileNamePattern>${log.filepath}/error-%d{yyyy-MM-dd_HH_mm}.log.gz</fileNamePattern>
            <!--表示日志文件的最大大小,当日志文件达到该大小时,会进行滚动输出,创建一个新的日志文件-->
            <maxFileSize>1024MB</maxFileSize>
            <!--设置文件最大保存的历史数据,这里就默认2份就行了,也就是最大保存2个文件-->
            <maxHistory>2</maxHistory>
        </rollingPolicy>
        <!--定义日志格式-->
        <encoder>
            <!--定义日志输出的格式-->
            <pattern>${log.pattern}</pattern>
            <!--设置输出内容编码-->
            <charset>utf-8</charset>
        </encoder>
        <!--需要注意 <onMatch>ACCEPT</onMatch> 和 <onMismatch>DENY</onMismatch>
            标签只用于日志记录到文件的类型、控制台输出不能使用
            因为errorAppender只需要记录debug级别的日志,对于其他的日志不需要,
            所以要加一个过滤器
            <onMatch>ACCEPT</onMatch> 和 <onMismatch>DENY</onMismatch> 两个标签
            可以实现只显示某一级别的日志,使用这两个标签后,会把非匹配级别的日志直接过滤掉,
            如果只是用了 <level>DEBUG</level> 标签,那么设置级别(包括设置的级别)以上
            的级别都会被记录下来-->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>ERROR</level>
            <!--如果是ERROR日志,同意被记录到文件-->
            <onMatch>ACCEPT</onMatch>
            <!--如果不是ERROR日志,直接忽略-->
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <!--**************设置日志记录器(日志记录器+输出媒介即可输出日志)********************-->
    <!--注意一:日志记录器和输出媒介都可以设置日志输出级别,日志记录器是第一层过滤,输出媒介是第二层过滤
        注意二:自定义的日志记录器优先级大于根日志记录器-->

    <!--根日志记录器,所有包下面的日志都会被记录-->
    <root level="DEBUG">
        <appender-ref ref="debugAppender"/>
        <appender-ref ref="infoAppender"/>
        <appender-ref ref="errorAppender"/>
    </root>

    <!--根日志记录器,所有包下面的日志都会被记录-->
    <root level="DEBUG">
        <appender-ref ref="consoleAppender"/>
    </root>

    <!--自定义记录器
        配置自己写的代码的日志记录器
        name="com.dkk" 表示对应包(包含子包)里面的代码产生的日志,会被下面的日志记录器记录,否则不会被记录
        level="DEBUG" 表示日志记录的级别是DEBUG,如果不指定level的时候,这个日志记录器对应的级别自动继承根记录器
        additivity="true" 表示日志事件是否向父节点logger传递。当additivity属性设置为true时,日志事件不仅会被当前logger处理,也会被传递给父节点logger进行处理。这意味着,如果一个logger的配置的appender(媒介输出器)是上级logger(如root logger也就是根记录器)配置的appender,那么当此logger的additivity属性为true时,日志信息会同时输出到当前logger和上级logger的appender中。反之,如果additivity属性设为false,则日志事件只会被当前的logger处理,不会传递给上级logger。因此,根据实际的项目需求,可以灵活设置additivity属性来控制日志信息的输出路径-->
    <logger name="com.zdx" level="ERROR" additivity="true">
        <appender-ref ref="consoleAppender"/>
    </logger>
</configuration>

  • 9
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

smilehjl

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值