springBoot(10)---logback日志

本文详细介绍了如何在Spring Boot项目中使用Logback进行日志配置,包括如何配置不同的输出级别、路径及文件滚动策略等。

一、概述

           和log4j优点:

            实际上,这两个日志框架都出自同一个开发者之手,Logback 相对于 Log4J 有更多的优点

           (1)logback不仅性能提升了,初始化内存加载也更小了。

           (2)内容更丰富的文档

           (3)更强大的过滤器

 

二、步骤

1、maven配置jar包

   logback默认就在spring-boot-starter-web包中,所以我们只要有spring-boot-starter-web

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

 

 

二、新建logback-spring.xml

   springboot官方建议命名为logback-spring.xml,在src/main/resources新建logback-spring.xml,这里不需要在application.properties中配置

   默认加载加载配置顺序 logback-spring.xml, logback-spring.groovy, logback.xml, or logback.groovy

复制代码

<?xml version="1.0" encoding="UTF-8" ?>
<configuration> 
        <!--    打印到控制台 -->
     <appender name="consoleApp" class="ch.qos.logback.core.ConsoleAppender">
        <layout class="ch.qos.logback.classic.PatternLayout">
            <pattern>
                %date{yyyy-MM-dd HH:mm:ss.SSS} %-5level[%thread]%logger{56}.%method:%L -%msg%n
            </pattern>
        </layout>
    </appender>


   <!--   打印到文件 -->
    <appender name="fileInfoApp" 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>
                %date{yyyy-MM-dd HH:mm:ss.SSS} %-5level[%thread]%logger{56}.%method:%L -%msg%n
            </pattern>
        </encoder>
        <!-- 滚动策略 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 路径 -->
            <fileNamePattern>app_log/log/app.info.%d.log</fileNamePattern>
        </rollingPolicy>
    </appender>
    
   
    <!--  打印到文件 -->
    <appender name="fileErrorApp" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>ERROR</level>
        </filter>
        <encoder>
            <pattern>
                %date{yyyy-MM-dd HH:mm:ss.SSS} %-5level[%thread]%logger{56}.%method:%L -%msg%n
            </pattern>
        </encoder>
        
        <!-- 设置滚动策略 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 路径,因为有 %d所以每天都会意时间来创建新的文件 -->
            <fileNamePattern>app_log/log/app.err.%d.log</fileNamePattern>
            
            <!-- 控制保留的归档文件的最大数量,超出数量就删除旧文件,假设设置每个月滚动,
            且<maxHistory> 是1,则只保存最近1个月的文件,删除之前的旧文件 -->
             <MaxHistory>1</MaxHistory>
             
          <!--   保持30天的历史记录上限为3GB总大小 -->
             <totalSizeCap>3GB</totalSizeCap>
            
        </rollingPolicy>
    </appender>
    
 <!--这里选择INFO就代表,进行INFO级别输出记录,那么在控制台也好,log文件也好只记录INFO及以上级别的日志,这里相当于第一道过滤器-->    
   <root level="INFO">  
        <appender-ref ref="consoleApp"/>
        <appender-ref ref="fileInfoApp"/>
        <appender-ref ref="fileErrorApp"/>
    </root>
</configuration>

复制代码

有关配置文件详细介绍放到下面讲,这里先跳过

3.controller类

复制代码

@RestController
@RequestMapping("/api/v1")
public class UserController {
    
    private Logger logger = LoggerFactory.getLogger(this.getClass());
    
    @GetMapping("log")
    public Object testLog(){
        
        logger.debug("---debug---debug---");
        logger.info("---info---信息---");
        logger.warn("---warn ---警告--- ");
        logger.error("---err---错误---");
        //这也是个错误的日志级别
        int i=1/0;
        return "yes";
    }

}

复制代码

 

4、效果:

我们发现,在项目中自动创建app_log/log/app.info(当天日期).log和app.err(当天日期).log文件

然后我们看

  app.err.2018-05-21.log

它只存放err级别日志

app.info.2018-05-21.log

它只存放的info和warn两种基本日志,这是为什么呢?详细介绍下配置文件

 

三、配置文件介绍

一:根节点<configuration>

 它的三个子节点
  (1)<appender></appender>  格式化日志输出节点,有两个必要属性name和class。
  (2) <logger></logger>  用来设置某一个包或具体的某一个类的日志打印级别、以及指定<appender>。
  (3)<root></root>(要加在最后)(必选,而且只有一个)(用来指定最基础的日志输出级别,他有俩个自己点可以用来应用appender,格式化日志输出)

 

二、appender节点

    它有两个属性name和class

    (1) class="ch.qos.logback.core.ConsoleAppender":把日志输出到

    (2)class="ch.qos.logback.core.FileAppender":把日志添加到文件

      (3)class="ch.qos.logback.core.rolling.RollingFileAppender":滚动记录文件,先将日志文件指定到文件,当符合某个条件时,将日志记录到其他文件

所以上面第一个appender代表输出到控制台,同时并没有进行任何过滤,所以只要是INFO级别以上的都会在控制台输出。

 

四、filter过滤器

 其它的一看就懂,就这里,一开始一直想不明白,为什么上面的info文件里只有info和warn,而err文件中只有err日志。后来明白了。

他有几个常用的过滤器

 (1)LevelFilter 过滤器

 级别过滤器,根据日志级别进行过滤。如果日志级别等于配置级别,过滤器会根据onMath 和 onMismatch接收或拒绝日志。

  <filter class="ch.qos.logback.classic.filter.LevelFilter">
             <level>ERROR</level>
            <onMatch>DENY</onMatch>
            <onMismatch>ACCEPT</onMismatch>
</filter>

<level>:设置过滤级别

将过滤器的日志级别配置为ERROR,所有ERROR级别的日志交给appender处理,非ERROR级别的日志,被过滤掉。

(这样的话那上面不是只显示ERROR日志,怎么最后显示的是INFO和WARN日志呢?看下面)

<onMatch>: 用于配置符合过滤条件的操作

<onMismatch>:用于配置不符合过滤条件的操作

 再看有这么几个单词DENY(拒绝),NEUTRAL(中性),ACCEPT(接受)

    (1)返回DENY,日志将立即被抛弃不再经过其他过滤器;

    (2)返回NEUTRAL,有序列表里的下个过滤器过接着处理日志;

    (3)返回ACCEPT,日志会被立即处理,不再经过剩余过滤器

在理解下:

            <level>ERROR</level>         <!-- 所有ERROR级别的日志交给appender处理,非ERROR级别的日志,被过滤掉 -->
            <onMatch>DENY</onMatch>      <!-- 代表符合过滤条件的拒绝输出 -->
            <onMismatch>ACCEPT</onMismatch>   <!-- 不符合过滤条件的接受输出 -->  

我靠,这么绕一圈不还是表示非ERROR级别的输出嘛,DEBUG除外,因为DUBUG在root标签,已经过滤掉,都不会走到appender标签这里

 

(2)ThresholdFilter 过滤器

  临界值过滤器,过滤掉低于指定临界值的日志。当日志级别等于或高于临界值时,过滤器返回NEUTRAL;当日志级别低于临界值时,日志会被拒绝。

<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>ERROR</level>
 </filter>

 这里只会访问ERROR及以上级别的过滤器,而ERROR已经是最高级了,所以就只显示ERROR日志在errer文件中了,所以一切都通了

### Logback 日志框架的集成与配置 在 Spring Boot 项目中,可以通过引入 `Logback` 来实现日志功能。Spring Boot 默认使用 `Logback` 作为日志框架,但为了更好地定制化日志输出格式、级别以及文件路径等,通常需要手动配置 `Logback`。 #### 添加依赖 如果您的项目基于 `spring-boot-starter`,则无需额外添加 `Logback` 的依赖,因为 `spring-boot-starter` 已经默认包含 `Logback`。如果您想显式声明依赖或自定义版本,可以在 `pom.xml` 文件中添加以下内容: ```xml <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.2.3</version> <!-- 根据需求调整版本号 --> </dependency> ``` #### 配置 Logback 文件 根据最佳实践,建议将日志配置文件命名为 `logback-spring.xml`,这样可以利用 Spring Boot 提供的特有功能[^1]。该文件应放置在 `src/main/resources` 目录下。 以下是 `logback-spring.xml` 的一个基本示例: ```xml <?xml version="1.0" encoding="UTF-8"?> <configuration debug="false"> <!-- 定义日志文件的存储位置 --> <property name="LOG_HOME" value="./logs"/> <!-- 控制台输出 --> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <!-- 格式化输出:%d表示日期,%thread表示线程名,%-5level:日志级别从左显示5个字符宽度 %logger{36}:日志记录器名称最大长度为36,%msg:日志消息,%n是换行符 --> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern> </encoder> </appender> <!-- 按照每天生成日志文件 --> <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>${LOG_HOME}/app.log</file> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!-- 日志文件输出的文件名 --> <fileNamePattern>${LOG_HOME}/app.%d{yyyy-MM-dd}.log</fileNamePattern> <!-- 日志保留天数 --> <maxHistory>30</maxHistory> </rollingPolicy> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern> </encoder> <!-- 追加模式 --> <append>true</append> </appender> <!-- 异步日志记录 --> <appender name="ASYNC" class="ch.qos.logback.classic.AsyncAppender"> <appender-ref ref="STDOUT"/> <appender-ref ref="FILE"/> </appender> <!-- 设置日志级别 --> <root level="info"> <appender-ref ref="ASYNC"/> </root> </configuration> ``` 此配置文件定义了两个主要的日志输出方式:控制台输出 (`STDOUT`) 和按天滚动的日志文件输出 (`FILE`)。此外,还通过 `AsyncAppender` 实现了异步日志记录,以提高性能。 #### 测试 Logback 配置 为了验证 `Logback` 是否正确配置并运行,您可以创建一个简单的测试类来触发日志输出。例如: ```java import org.junit.jupiter.api.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class LoggingTest { private static final Logger logger = LoggerFactory.getLogger(LoggingTest.class); @Test public void testLogging() { logger.info("This is an info message."); logger.error("This is an error message."); } } ``` 这段代码会在控制台和指定的日志文件中分别记录两条信息级别的日志。 #### 注意事项 - 确保 `logback-spring.xml` 文件的位置正确,并且没有语法错误。 - 如果您打算将日志发送至远程服务器或其他目的地(如 RabbitMQ 或 Elasticsearch),则需要进一步配置相应的 appender[^2]。 - 对于生产环境,建议关闭调试日志,并适当调整日志级别以减少日志量。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值