Logback解析和实例

本文详细介绍了Logback作为SpringBoot默认日志框架的配置和使用,包括yml配置、logback-spring.xml的解析,如appender(ConsoleAppender、FileAppender、RollingFileAppender)、encoder、filter、logger和root的设置,以及日志文件的滚动策略和过滤器的使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >



1、概念


Logback是一个开源日志组件,同时也是 log4j 项目的后续版本,取代了log4j后续的地位。

Logback效率高、适应诸多的运行环境,同时logback 对SLF4J 进行了实现,天然支持 SLF4J。

Logback很灵活,架构通用性强,同时也是 SpringBoot 的内置日志框架。

Logback分为三个模块:logback-core、logback-classic、logback-access。

Logback-core是Logback日志的基础模块。

Logback-classic模块是log4j的改进版本。它本身实现了SLF4J API,所以使用它可以和log4j进行灵活的切换。

logback-access模块集成了Servlet容器,以便实现HTTP访问日志功能。


2、相关依赖


logback所需要的依赖

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

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

<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
</dependency>

springboot兼容logback,默认集成这些依赖。

spring-boot-starter其中包含了 spring-boot-starter-logging,该依赖内容就是 Spring Boot 默认的日志框架Logback+SLF4J。

spring-boot-starter-web 包含了spring-boot-starte。

所以我们只需要引入spring-boot-starter-web就可以了。

我们下面的解析基于springboot实现。

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

3、基于springboot的日志搭建


3.1、yml或properties 配置


属性描述
logging.file日志文件名
logging.path日志文件路径,可以是相对路径,也可以是绝对路径
logging.configlogback配置文件的路径
logging.level.包名指定包名下面的日志级别

  • classpath:表示当前服务Resources目录下
  • spring.application.name:表示当前服务名称
  • level.mybatis=debug:表示mybatis包下面打印日志的级别为debug
logging:
  config: classpath:logback-spring.xml
  file: ${spring.application.name}
  path: ../logs/
  level:
    mybatis: debug

3.2、 logback-spring.xml 详解

logback的配置文件有三个主要的标签:

  • appender
  • logger:设置某一个包或者具体的某一个类的日志打印级别、以及指定appender。它只有一个name属性,level、addtivity是可选属性。
  • root:属于根logger。它其实也是一个logger,只不过已经被默认命名为root。
    level属性设置打印级: TRACE、DEBUG、INFO、WARN、ERROR、ALL、 OFF,默认是DEBUG。
    如果上面的logger没有设置level属性, 则继承root的属性

3.2.1、appender 解析

负责写日志的组件, 用来设置日志的输出位置, 日志文件的生成策略等


3.2.1.1、ConsoleAppender-控制台打印

把日志打印到控制台

<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
...
</appender>

3.2.1.2、FileAppender-日志输出到文件

把日志输出到文件

<appender name="LOG_FILE" class="ch.qos.logback.core.FileAppender">
...
</appender>

3.2.1.3、RollingFileAppender-滚动记录并输出文件

滚动记录,同时把日志输出到文件。

支持日志文件按文件大小日期拆分

<appender name="LOG_FILE" class="ch.qos.logback.core.rolling.FileAppender">
...
</appender>

3.2.1.4、file-日志名称和路径

被写入的文件名,可以是相对目录,也可以是绝对目录,如果上级目录不存在会自动创建,没有默认值。

  • ${LOG_PATH}:yml配置文件中的 logging.path
  • ${LOG_FILE}:yml配置文件中的 logging.file
<appender name="LOG_FILE" class="ch.qos.logback.core.rolling.FileAppender">
<file>${LOG_PATH}${LOG_FILE}.log</file>
</appender>

3.2.1.5、rollingPolicy-日志行为

当发生滚动时,决定 RollingFileAppender 的行为,涉及文件移动和重命名。


它的策略一般常用的有两个

  • TimeBasedRollingPolicy:表示每天生成新的文件
  • SizeAndTimeBasedRollingPolicy:表示每天生成和大小生成同时执行

rollingPolicy下面有三个重要的标签

  • fileNamePattern:表示什么周期触发一次生成新的日志文件,也是周期触发后的文件名称。如果它后缀是 .gz 则代表自动压缩
  • maxHistory:表示保存日志的最大单位时间
  • MaxFileSize:表示每个文件的的大小
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
      <!-- 活动文件的名字会根据fileNamePattern的值,每隔一段时间改变一次 -->
      <fileNamePattern>${LOG_PATH}${LOG_FILE}.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern>
      <!-- 每产生一个日志文件,该日志文件的保存期限为30天 -->
      <maxHistory>7</maxHistory>
      <!-- maxFileSize:这是活动文件的大小,默认值是10MB,也可以自己设置 -->
      <MaxFileSize>10MB</MaxFileSize>
</rollingPolicy>

3.2.1.6、encoder-日志格式化
  • %d{yyyy-MM-dd}:获取现在的日期并格式化
  • %d{HH:mm:ss.SSS}:获取现在的时间并格式化
  • %-5level:输出日志级别,-5表示左对齐并且固定输出5个字符,如果不足在右边补0
  • %c{1.}:表示显示调用者的时候,只显示包名最后一截及方法名,前面的几段只取首字母
  • %L: 表示调用者所在代码的行号
  • %msg:表示需要打印的日志信息
  • %n: 表示系统换行符

颜色编码:

编码加粗编码描述
%black黑色
%red%boldRed红色
%green%boldGreen绿色
%yellow%boldYellow黄色
%blue%boldBlue蓝色
%magenta%boldMagenta洋红色
%cyan%boldCyan青色
%white%boldWhite白色
%gray灰色
%highlight高亮色
<encoder>
    <pattern>%d{yyyy-MM-dd} %d{HH:mm:ss.SSS} %green(%-5level) [%blue(%-20.20thread{20})] %cyan(%-36.36logger{36}) : %msg%n</pattern>
    <charset>utf-8</charset>
</encoder>

3.2.1.7、filter-过滤器

使用过滤器可以设置日志的传递。

日志经过各个过滤器进而被抛弃、被打印或者不处理。

  • level:过滤级别。参数有 TRACE、DEBUG、INFO、WARN、 ERROR、ALL 、OFF
  • onMatch:匹配大于这个级别的日志
  • onMismatch:匹配小于于这个级别的日志,可以选的有

onMatch和onMismatch可选参数有:

参数描述
ACCEPT打印
DENY不打印
NEUTRAL交给下一个过滤器处理
<!-- 日志级别过滤器 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
     <!-- 过滤的级别 -->
     <level>ERROR</level>
     <!-- 匹配时的操作:接收(记录) -->
     <onMatch>ACCEPT</onMatch>
     <!-- 不匹配时的操作:拒绝(不记录) -->
     <onMismatch>DENY</onMismatch>
</filter>

3.2.2、logger 解析

设置某一个包或者具体的某一个类的日志打印级别,以及指定appender。

它有三个属性,必选的name,可选的level、addtivity

  • name:指定受此loger约束的某一个包或者具体的某一个类。
  • level:设置打印级别,参数有 TRACE、DEBUG、INFO、WARN、 ERROR、ALL 、OFF。如果未设置此属性,logger将会继承上级的级别。
  • addtivity:是否向上级logger传递打印信息,默认true。
<logger name="com.atomikos.jdbc" level="OFF">
</logger>

<logger name="com.netflix.discovery.shared.resolver.aws.ConfigClusterResolver" level="OFF">
</logger>

3.2.3、root 解析

root同样也是logger元素,但是它是根logger。只有一个level属性,它默认命名为root。

  • level:设置打印级别,参数有 TRACE、DEBUG、INFO、WARN、 ERROR、ALL 、OFF。如果未设置此属性,logger将会继承上级的级别,默认为DEBUG。

如果logger没有设置level属性, 会继承root的属性

<root level="INFO">
    <appender-ref ref="STDOUT"/>
</root>

4、logback.xml实例

yml配置:

logging:
  config: classpath:logback-spring.xml
  file: ${spring.application.name}
  path: ../logs/
  level:
    mybatis: debug

xml配置:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <springProperty scope="context" name="app_name" source="spring.application.name"/>
    <include resource="org/springframework/boot/logging/logback/defaults.xml"/>
    <include resource="org/springframework/boot/logging/logback/console-appender.xml"/>
    <jmxConfigurator/>

    <!-- 控制台 -->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <!-- 日志格式 -->
        <encoder>
            <pattern>%d{yyyy-MM-dd} %d{HH:mm:ss.SSS} %green(%-5level) [%blue(%-20.20thread{20})] %cyan(%-36.36logger{36}) : %msg%n</pattern>
            <charset>utf-8</charset>
        </encoder>
        <!--此日志appender是为开发使用,只配置最底级别,控制台输出的日志级别是大于或等于此级别的日志信息-->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <!-- 只有这个日志权限才能看,sql语句 -->
            <level>DEBUG</level>
        </filter>
    </appender>

    <appender name="LOG_FILE" class="ch.qos.logback.core.rolling.FileAppender">
        <file>${LOG_PATH}${LOG_FILE}.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!-- 活动文件的名字会根据fileNamePattern的值,每隔一段时间改变一次 -->
            <fileNamePattern>${LOG_PATH}${LOG_FILE}.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern>
            <!-- 每产生一个日志文件,该日志文件的保存期限为30天 -->
            <maxHistory>7</maxHistory>
            <!-- maxFileSize:这是活动文件的大小,默认值是10MB,也可以自己设置 -->
            <MaxFileSize>10MB</MaxFileSize>
        </rollingPolicy>
        <encoder>
            <pattern>%d{yyyy-MM-dd} %d{HH:mm:ss.SSS} %green(%-5level) [%blue(%-20.20thread{20})] %cyan(%-36.36logger{36}) : %msg%n</pattern>
            <charset>utf-8</charset>
        </encoder>
    </appender>

    <appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_PATH}${LOG_FILE}.log.error</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!-- 活动文件的名字会根据fileNamePattern的值,每隔一段时间改变一次 -->
            <fileNamePattern>${LOG_PATH}${LOG_FILE}.%d{yyyy-MM-dd}.%i.log.error.gz</fileNamePattern>
            <!-- 每产生一个日志文件,该日志文件的保存期限为30天 -->
            <maxHistory>15</maxHistory>
            <!-- maxFileSize:这是活动文件的大小,默认值是10MB,也可以自己设置 -->
            <MaxFileSize>10MB</MaxFileSize>
        </rollingPolicy>
        <encoder>

            <pattern>%d{yyyy-MM-dd} %d{HH:mm:ss.SSS} %green(%-5level) [%blue(%-20.20thread{20})] %cyan(%-36.36logger{36}) : %msg%n</pattern>
            <charset>utf-8</charset>
        </encoder>
        <!-- 日志级别过滤器 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">

            <!-- 过滤的级别 -->
            <level>ERROR</level>
            <!-- 匹配时的操作:接收(记录) -->
            <onMatch>ACCEPT</onMatch>
            <!-- 不匹配时的操作:拒绝(不记录) -->
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>
    
    
	<!--  ELK 支持 -->
    <appender name="ELK_LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
        <!--
        destination 是 logstash 服务的 host:port,
        相当于和 logstash 建立了管道,将日志数据定向传输到 logstash
        -->
        <destination>127.0.0.1:9250</destination>
        <encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder">
            <customFields>{"appname":"${LOG_FILE}"}</customFields>
            <includeMdcKeyName>startTime</includeMdcKeyName>
            <includeMdcKeyName>endTime</includeMdcKeyName>
            <includeMdcKeyName>requestRawJson</includeMdcKeyName>
            <includeMdcKeyName>responseRawJson</includeMdcKeyName>
            <includeMdcKeyName>responseTime</includeMdcKeyName>
            <includeMdcKeyName>url</includeMdcKeyName>
            <includeMdcKeyName>method</includeMdcKeyName>
            <includeMdcKeyName>path</includeMdcKeyName>
        </encoder>
        <!-- 日志级别过滤器 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <!-- 过滤的级别 -->
            <level>INFO</level>
            <level>WARN</level>
            <level>ERROR</level>
            <!-- 匹配时的操作:接收(记录) -->
            <onMatch>ACCEPT</onMatch>
            <!-- 不匹配时的操作:拒绝(不记录) -->
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>


    <!--配置异步日志输出-->
    <appender name="ELK_LOGSTASH-ASYN" class="ch.qos.logback.classic.AsyncAppender">
        <appender-ref ref="ELK_LOGSTASH"/>
    </appender>

    <logger name="com.atomikos.jdbc" level="OFF">
    </logger>

    <logger name="com.netflix.discovery.shared.resolver.aws.ConfigClusterResolver" level="OFF">
    </logger>

    <root level="INFO">
    <!--<appender-ref ref="STDOUT"/>-->
        <appender-ref ref="LOG_FILE"/>
        <appender-ref ref="ERROR_FILE"/>
        <appender-ref ref="CONSOLE"/>
    </root>
</configuration>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值