日志

tio-boot 并未与任何特定日志框架绑定,使用的是 slf4j 作为日志门面。

logback

笔者建议在开发 tio-boot 应用时使用 logback 作为日志实现,以下是其使用方法:

1. 引入 logback 依赖

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

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

2. 配置 logback.xml

在项目的 resources 目录下创建 logback.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表示日期,%-6level:日志级别从左显示6个字符宽度,%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" />
  <!-- show parameters for hibernate sql 专为 Hibernate 定制 -->
  <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" />

  <!--myibatis log configure -->
  <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  c.l.t.b.h.h.DefaultHttpRequestHandler.handler:232 - access:GET:/ok

生成的日志文件如下

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

配置说明:

配置文件是基于 Logback 框架的日志配置,包含了日志的输出格式、日志级别、日志文件的滚动策略以及特定模块的日志级别设置。下面详细解释每个部分的作用:

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

这是 XML 文件的声明,表示这个文件是以 UTF-8 编码的 XML 文档。

2. <configuration> 标签

这是 Logback 配置文件的根元素,包含了所有日志相关的配置。debug="false"表示禁用调试模式,如果将其设为true,Logback 将会输出更多的调试信息。

  • xmlnsxsi:schemaLocation 定义了 Logback 的 XML 命名空间和模式文件的引用。

3. <property> 标签

<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> 标签)

这个部分定义了控制台输出日志的配置:

  • <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">: 定义了一个名称为STDOUT的控制台日志输出器。
  • <encoder>: 定义了日志的编码器,这里使用 PatternLayoutEncoder,并引用前面定义的日志格式 CONSOLE_LOG_PATTERN
  • <pattern>: 指定日志的输出格式。

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

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

  • <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">: 定义了一个名称为FILE的日志输出器,输出日志到文件,并使用滚动策略。
  • <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">: 定义了一个基于文件大小和时间的滚动策略。
    • <fileNamePattern>: 定义日志文件的命名规则,日志文件的格式为 log.日期小时.序号.log,每小时生成一个新文件。
    • <maxHistory>: 定义日志文件保留的最大天数,这里为 180 天。
    • <maxFileSize>: 定义每个日志文件的最大大小,这里为 100MB。

6. SpringHibernate 特定模块的日志级别设置

这部分专门为 Spring 和 Hibernate 模块定制了日志级别,用于调试 SQL 语句和查询参数。

  • org.springframework: 设置 Spring 框架的日志级别为info
  • org.hibernate: 为 Hibernate 的特定日志类设置了不同的日志级别,比如 SQL 语句日志为DEBUG,查询参数为DEBUG,SQL 绑定参数为TRACE等。

7. MyBatis 和 SQL 相关日志配置

这部分为 MyBatis 和 SQL 连接相关类设置了日志级别。

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

8. <root> 标签

<root>标签定义了根日志记录器的日志级别和输出目标:

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

总结:

  • 这个配置文件实现了日志的控制台和文件输出,并根据不同模块(如 Spring、Hibernate、MyBatis)的需要,调整了日志的输出级别。
  • 日志文件按小时滚动,每个文件最大为 100MB,日志文件保留 180 天。
  • 日志的输出格式通过CONSOLE_LOG_PATTERN统一定义,包括了日期、线程、日志级别、类名、方法名、行号和日志内容。