Spring Boot 日志详解

1、lomback的核心依赖

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

2、lomback简述

springboot项目中logback-spring依赖通常包含在Spring Boot Starter中,它提供了对日志系统的自动配置和管理。具体来说,Spring Boot提供了以下几个Starter来支持不同的日志框架:

  • spring-boot-starter-logging:这个Starter提供了Spring Boot默认的日志框架,即Logback。

  • spring-boot-starter-log4j2:这个Starter提供了对Log4j2日志框架的支持。

  • spring-boot-starter-jul:这个Starter提供了对java.util.logging日志框架的支持。

spring-boot-starter-logging依赖包含了Logback-spring的依赖,因此,如果想要在Spring Boot应用程序中使用Logback-spring作为日志框架,只需要在pom.xml文件中添加以下依赖即可:

<dependencies>
    <!-- 其他依赖 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-logging</artifactId>
    </dependency>
</dependencies>

 这将自动包含logback-classic作为默认的日志框架,并启用Spring Boot自动配置的默认日志记录方式。

3、添加logback-spring配置文件

在src/main/resources目录下创建一个名为logback-spring.xml或logback.xml的文件,并添加以下示例配置:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <appender name="consoleAppender" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
      <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
    </encoder>
  </appender>
  <logger name="com.example" level="DEBUG"/>
  <root level="INFO">
    <appender-ref ref="consoleAppender"/>
  </root>
</configuration>

上面的配置将定义一个名为consoleAppender的ConsoleAppender,用于将日志输出到控制台。logger元素定义了com.example包的日志级别为DEBUG,这意味着该包下的日志将会记录DEBUG及以上级别的日志。root元素定义了默认的日志级别为INFO,这意味着除com.example包以外的日志将会记录INFO及以上级别的日志,并将其输出到consoleAppender。

Spring Boot应用程序的默认日志级别是什么?

Spring Boot 应用程序的默认日志级别是 INFO。除了 DEBUG 级别及以下的日志信息外,所有的日志信息都会被记录。可以通过在 application.properties 或 application.yml 文件中设置 logging.level.root 属性来修改默认日志级别,例如设置为 DEBUG 级别:

logging.level.root=DEBUG

在 Spring Boot 中,可以使用 "root" 来设置全局的日志级别。

上述是给应用程序设置全局日志级别,单独给某路径下的类或某个类设置日志级别如下:

logging:
  level:
    com.demo: debug
    com.demo.controller.TestController: info

com.demo 是项目包路径,用于设置该路径下所有类的日志打印级别都是debug

com.demo.controller.TestController 是全类名,用于设置该类的日志打印级别为info,info以下的级别不会打印。

上述TestController类的日志打印级别设置重复了,最终结果是info级别。

应用程序连接数据库时使用Druid连接池,SQL语句的默认打印级别是什么?使用HikariCP连接池时,SQL语句的默认打印级别是什么?

Druid连接池的SQL语句默认打印级别是 DEBUG。这意味着,除非在应用程序中明确地将日志级别设置为 DEBUG 或 TRACE,否则记录不到SQL语句。

HikariCP连接池的SQL语句默认打印级别是 INFO。应用程序默认的打印级别是INFO,所以无需在应用程序中明确地设置日志级别也存在SQL打印日志。

上述Druid连接池、HikariCP连接池,到底什么是数据库连接池?为什么要用数据库连接池?

数据库连接池是一种用于管理数据库连接的技术,它可以优化应用程序与数据库之间的连接操作。在传统的数据库连接方式中,每个连接都需要建立一个物理连接,对于高并发的应用程序来说,这将会造成很大的开销,因为每个连接都需要花费时间和资源进行建立和关闭。

数据库连接池可以通过缓存已经创建的连接,当应用程序需要连接数据库时,直接从连接池中获取连接,而不是每次都新建连接。这样可以避免频繁的连接和关闭操作,降低连接的创建和关闭成本,提高应用程序的性能和可扩展性。

此外,连接池还可以通过控制连接的数量,防止过多的连接导致数据库服务器负载过高,从而保证数据库的稳定性和可靠性。

应用程序的线程访问一次数据库就要消耗掉数据库连接池中的一个连接,这样理解对吗?

是的,这个理解是正确的。在应用程序中,每个线程访问数据库时都需要从连接池中获取一个连接。如果连接池中的连接数已经达到了上限,那么新的线程将需要等待,直到有连接可用。一旦一个线程完成了对数据库的访问,它就会释放连接,以便其他线程可以使用它。因此,连接池中的连接数量是应用程序可以同时处理的数据库连接数的限制,过多或者过少都会对系统性能和稳定性产生影响。

详解lombak-spring配置文件

<!--输出到控制台-->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
        <pattern>${log.colorPattern}</pattern>
    </encoder>
    <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
        <level>DEBUG</level>
    </filter>
</appender>
<!--输出到文件-->
<appender name="file_info" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
        <fileNamePattern>${log.path}/info/info.%d{yyyy-MM-dd}.log</fileNamePattern>
        <MaxHistory>${log.maxHistory}</MaxHistory>
    </rollingPolicy>
    <encoder>
        <pattern>${log.pattern}</pattern>
    </encoder>
    <filter class="ch.qos.logback.classic.filter.LevelFilter">
        <level>INFO</level>
        <onMatch>ACCEPT</onMatch>
        <onMismatch>DENY</onMismatch>
    </filter>
</appender>
<appender name="file_error" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
        <fileNamePattern>${log.path}/error/error.%d{yyyy-MM-dd}.log</fileNamePattern>
    </rollingPolicy>
    <encoder>
        <pattern>${log.pattern}</pattern>
    </encoder>
    <filter class="ch.qos.logback.classic.filter.LevelFilter">
        <level>ERROR</level>
        <onMatch>ACCEPT</onMatch>
        <onMismatch>DENY</onMismatch>
    </filter>
</appender>
<root level="DEBUG">
    <appender-ref ref="console"/>
</root>
<root level="info">
    <appender-ref ref="file_info"/>
    <appender-ref ref="file_error"/>
</root>

其中定义了三个日志输出器(appender):控制台输出(console)、信息文件输出(file_info)和错误文件输出(file_error)。

在这个配置中,控制台输出(console)的级别设置为DEBUG,表示只输出DEBUG级别及以上的日志信息,低于DEBUG级别的日志信息都会被过滤掉。

信息文件输出(file_info)和错误文件输出(file_error)都定义了级别过滤器(LevelFilter),并且使用了不同的级别过滤器设置,分别过滤掉低于INFO级别和ERROR级别的日志信息。在LevelFilter中,设置了onMatchACCEPT,表示匹配的日志信息会被接受输出,而onMismatchDENEY,表示不匹配的日志信息将被拒绝输出。

最后,定义了两个根日志(root),一个是输出到控制台,另一个是输出到信息文件和错误文件。第一个根日志的级别为DEBUG,第二个根日志的级别为INFO,表示只有INFO级别及以上的日志信息才会被输出到信息文件和错误文件中。

如何日志轮换等策略来限制日志文件大小?

日志轮换(log rotation)是一种常见的日志管理策略,可以通过控制日志文件大小、数量和保留时间等方式来限制日志文件的大小,并确保日志文件不会无限增长。

Logback-spring提供了多种日志轮换策略,可以在logback-spring.xml或logback.xml中进行配置,以下是一些常用的策略示例:

  1. 按文件大小分割日志:
<appender name="rollingFileAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
  <file>/path/to/logs/app.log</file>
  <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
    <fileNamePattern>/path/to/logs/app.%d{yyyy-MM-dd}.log</fileNamePattern>
  </rollingPolicy>
  <encoder>
    <pattern>%date [%thread] %-5level %logger{36} - %msg%n</pattern>
  </encoder>
</appender>

上面的配置将使用TimeBasedRollingPolicy来按日期分割日志。fileNamePattern属性中的%d{yyyy-MM-dd}将会被替换为当前日期,以生成日志文件名。当日期变化时,将创建新的日志文件。

需要注意的是,日志轮换策略的具体配置取决于应用程序的需求和环境,需要根据实际情况进行调整。同时,为了确保日志轮换策略能够正常工作,应该定期检查日志文件的大小和数量,并进行必要的调整和维护。

日志过滤器 ThresholdFilter 和 LevelFilter 的区别?

ThresholdFilterLevelFilter都是Logback中常用的日志过滤器,用于过滤指定级别及以下的日志信息。

ThresholdFilter的作用是过滤掉低于指定级别的日志信息。例如,如果将ThresholdFilter设置为DEBUG级别,那么只有DEBUG级别及以上的日志信息会被输出,低于DEBUG级别的日志信息都会被过滤掉。

LevelFilter作用类似于ThresholdFilter,可以根据指定级别过滤日志信息。不同的是,LevelFilter可以设置onMatchonMismatch两个参数,分别表示在过滤匹配和不匹配时采取的处理方式。例如,可以将onMatch设置为DENY,表示匹配的日志信息将被拒绝输出,而将onMismatch设置为ACCEPT,表示不匹配的日志信息将被接受输出。

在实际使用中,ThresholdFilterLevelFilter可以根据需求选择使用。如果只需要根据指定级别过滤日志信息,可以使用ThresholdFilter;如果需要更加灵活的过滤控制,可以使用LevelFilter

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值