Skip to content

tio-boot 整合 Logback ​

tio-boot 并未绑定任何特定的日志框架,而是使用 slf4j 作为日志门面。本文将介绍如何在开发 tio-boot 应用时集成 Logback 作为日志实现。

Logback ​

建议在开发 tio-boot 应用时使用 Logback 作为日志实现。以下是集成 Logback 的详细步骤:

1. 引入 Logback 依赖 ​

在项目的 pom.xml 文件中添加 Logback 依赖:

java 1.7

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

java 1.8

xml
<dependency>
  <groupId>org.slf4j</groupId>
  <artifactId>slf4j-api</artifactId>
  <version>2.0.1</version>
</dependency>

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

java 11

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

2. 配置 logback.xml ​

在项目的 resources 目录下创建 logback.xml 配置文件,内容如下:

xml
<?xml version="1.0" encoding="UTF-8" ?>
<configuration debug="false" xmlns="http://ch.qos.logback/xml/ns/logback" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://ch.qos.logback/xml/ns/logback https://raw.githubusercontent.com/enricopulatzo/logback-XSD/master/src/main/xsd/logback.xsd
http://ch.qos.logback/xml/ns/logback ">

  <!-- 定义日志文件的存储地址,避免在 Logback 的配置中使用相对路径 -->
  <property name="LOG_HOME" value="logs" />

  <!-- 格式化输出:%d 表示日期,[%thread] 输出线程名称,%-6level 表示日志级别占6个字符宽度,%logger{1}.%M:%L 表示类名、方法名和行号,%m 表示日志消息,%n 是换行符 -->
  <property name="CONSOLE_LOG_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-6level %logger{1}.%M:%L - %m%n" />

  <!-- 控制台输出 -->
  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
      <pattern>${CONSOLE_LOG_PATTERN}</pattern>
    </encoder>
  </appender>

  <!-- 按照每小时生成日志文件 -->
  <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
      <pattern>${CONSOLE_LOG_PATTERN}</pattern>
    </encoder>
    <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
      <!-- 日志文件输出的文件名,包含日期和小时 -->
      <fileNamePattern>${LOG_HOME}/log.%d{yyyyMMddHH}.%i.log</fileNamePattern>
      <!-- 日志文件保留天数 -->
      <maxHistory>180</maxHistory>
      <!-- 每个日志文件的最大大小 -->
      <maxFileSize>100MB</maxFileSize>
    </rollingPolicy>
  </appender>

  <!-- Spring 框架日志级别设置 -->
  <logger name="org.springframework" level="info" />

  <!-- Hibernate 日志级别设置,显示 SQL 语句和绑定参数 -->
  <logger name="org.hibernate.type.descriptor.sql.BasicBinder" level="TRACE" />
  <logger name="org.hibernate.type.descriptor.sql.BasicExtractor" level="DEBUG" />
  <logger name="org.hibernate.SQL" level="DEBUG" />
  <logger name="org.hibernate.engine.QueryParameters" level="DEBUG" />
  <logger name="org.hibernate.engine.query.HQLQueryPlan" level="DEBUG" />

  <!-- MyBatis 和 SQL 相关日志配置 -->
  <logger name="com.apache.ibatis" level="TRACE" />
  <logger name="java.sql.Connection" level="DEBUG" />
  <logger name="java.sql.Statement" level="DEBUG" />
  <logger name="java.sql.PreparedStatement" level="DEBUG" />

  <!-- 根日志记录器的日志级别和输出目标 -->
  <root level="info">
    <appender-ref ref="STDOUT" />
    <appender-ref ref="FILE" />
  </root>
</configuration>

日志输出示例 ​

控制台输出的日志示例如下:

2024-09-10 05:47:00.022 [tio-group-76] INFO  DefaultHttpRequestHandler.handler:232 - access:GET:/ok

生成的日志文件名称示例:

  • log.2024091006.0.log
  • log.2024091007.0.log

配置说明 ​

该配置文件基于 Logback 框架,包含了日志的输出格式、日志级别、日志文件的滚动策略以及特定模块的日志级别设置。以下是各部分的详细说明:

1. XML 声明 ​

xml
<?xml version="1.0" encoding="UTF-8" ?>

表示这是一个使用 UTF-8 编码的 XML 文档。

2. <configuration> 标签 ​

这是 Logback 配置文件的根元素,包含所有日志相关的配置。

  • debug="false":禁用调试模式。如果设为 true,Logback 将输出更多调试信息。
  • xmlns 和 xsi:schemaLocation:定义 Logback 的 XML 命名空间和模式文件的位置。

3. <property> 标签 ​

用于定义可复用的变量,便于配置管理和维护。

  • LOG_HOME:定义日志文件的存储目录为 logs 目录。

  • CONSOLE_LOG_PATTERN:定义日志的输出格式,主要用于控制台和文件输出。

    • %d{yyyy-MM-dd HH:mm:ss.SSS}:日志的日期时间,精确到毫秒。
    • [%thread]:输出当前线程的名称。
    • %-6level:日志级别,左对齐,占 6 个字符宽度。
    • %logger{1}:输出日志发出者的名字,通常是类名,{1} 表示只显示最后一级包名或类名。
    • %M:输出日志方法的名称。
    • %L:输出日志所在的行号。
    • %m:输出日志内容。
    • %n:换行符。

4. 控制台输出 (<appender> 标签) ​

定义了控制台日志输出的配置:

xml
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
  <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
    <pattern>${CONSOLE_LOG_PATTERN}</pattern>
  </encoder>
</appender>
  • name="STDOUT":日志输出器的名称。
  • class="ch.qos.logback.core.ConsoleAppender":指定为控制台输出器。
  • <encoder>:定义日志的编码器,使用 PatternLayoutEncoder 并应用前面定义的日志格式。

5. 文件输出 (<appender> 标签) ​

定义了日志文件的输出配置,使用滚动策略:

xml
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
  <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
    <pattern>${CONSOLE_LOG_PATTERN}</pattern>
  </encoder>
  <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
    <fileNamePattern>${LOG_HOME}/log.%d{yyyyMMddHH}.%i.log</fileNamePattern>
    <maxHistory>180</maxHistory>
    <maxFileSize>100MB</maxFileSize>
  </rollingPolicy>
</appender>
  • name="FILE":日志输出器的名称。
  • class="ch.qos.logback.core.rolling.RollingFileAppender":指定为文件输出器,并使用滚动策略。
  • <rollingPolicy>:定义基于时间和文件大小的滚动策略。
    • fileNamePattern:日志文件的命名规则,格式为 log.日期小时.序号.log,每小时生成一个新文件。
    • maxHistory:日志文件保留的最大天数,此处为 180 天。
    • maxFileSize:每个日志文件的最大大小,此处为 100MB。

6. Spring 和 Hibernate 特定模块的日志级别设置 ​

针对特定模块调整日志级别,便于调试:

  • Spring 框架:

    xml
    <logger name="org.springframework" level="info" />

    设置 Spring 框架的日志级别为 info。

  • Hibernate:

    xml
    <logger name="org.hibernate.type.descriptor.sql.BasicBinder" level="TRACE" />
    <logger name="org.hibernate.type.descriptor.sql.BasicExtractor" level="DEBUG" />
    <logger name="org.hibernate.SQL" level="DEBUG" />
    <logger name="org.hibernate.engine.QueryParameters" level="DEBUG" />
    <logger name="org.hibernate.engine.query.HQLQueryPlan" level="DEBUG" />

    设置 Hibernate 的特定日志类的日志级别,用于显示 SQL 语句和查询参数。

7. MyBatis 和 SQL 相关日志配置 ​

针对 MyBatis 和 SQL 连接相关类设置日志级别:

xml
<logger name="com.apache.ibatis" level="TRACE" />
<logger name="java.sql.Connection" level="DEBUG" />
<logger name="java.sql.Statement" level="DEBUG" />
<logger name="java.sql.PreparedStatement" level="DEBUG" />
  • com.apache.ibatis:MyBatis 框架的日志级别设置为 TRACE。
  • java.sql.Connection、java.sql.Statement、java.sql.PreparedStatement:数据库连接和 SQL 语句执行的日志级别设置为 DEBUG,用于调试 SQL 执行的详细信息。

8. 根日志记录器 (<root> 标签) ​

定义根日志记录器的日志级别和输出目标:

xml
<root level="info">
  <appender-ref ref="STDOUT" />
  <appender-ref ref="FILE" />
</root>
  • level="info":设置根日志记录器的默认日志级别为 info,即只输出 info 及以上级别的日志(如 warn、error)。
  • <appender-ref ref="STDOUT" />:将日志输出到控制台。
  • <appender-ref ref="FILE" />:将日志输出到文件。

总结 ​

  • 输出方式:该配置实现了日志的控制台和文件双重输出。
  • 滚动策略:日志文件按小时滚动,每个文件最大为 100MB,日志文件保留 180 天。
  • 输出格式:通过 CONSOLE_LOG_PATTERN 统一定义日志输出格式,包括日期、线程、日志级别、类名、方法名、行号和日志内容。
  • 模块级别设置:针对 Spring、Hibernate、MyBatis 等特定模块,调整了日志输出级别,以便更好地调试和监控应用。

通过上述配置,tio-boot 应用能够高效、灵活地管理日志输出,满足开发和运维的需求。

MIT Licensed