Mybatis 日志配置

2023-12-29 19:41:23

要查看MyBatis的日志语句,您可以在一个包、一个完全限定的映射器类名、一个命名空间或一个完全限定的语句名称上启用日志记录。

再次强调,如何做这取决于所使用的日志实现。我们将展示如何在SLF4J(Logback)中进行配置。配置日志服务只需添加一个或多个额外的配置文件(例如logback.xml),有时还需要添加一个新的JAR文件。以下示例配置将使用SLF4J(Logback)作为提供程序配置完整的日志服务。有2个步骤。

第一步: 添加 SLF4J 和 Logback JAR包

由于我们使用SLF4J(Logback),我们需要确保它的JAR文件对我们的应用程序可用。要使用SLF4J(Logback),您需要将JAR文件添加到应用程序的类路径中。

对于Web或企业应用程序,您可以将logback-classic.jar、logback-core.jar和slf4j-api.jar添加到您的WEB-INF/lib目录中,或者对于独立应用程序,您可以直接将其添加到JVM的-classpath启动参数中。

如果您使用Maven,您可以通过在pom.xml文件中添加以下设置来下载JAR文件。

<dependency>
  <groupId>ch.qos.logback</groupId>
  <artifactId>logback-classic</artifactId>
  <version>1.x.x</version>
</dependency>
第二步: 配置 Logback

配置Logback非常简单。假设您想要启用这个Mapper的日志:

package org.mybatis.example;
public interface BlogMapper {
  @Select("SELECT * FROM blog WHERE id = #{id}")
  Blog selectBlog(int id);
}

?创建一个名为logback.xml的文件,内容如下,并将其放置在类路径中:

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

  <appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
      <pattern>%5level [%thread] - %msg%n</pattern>
    </encoder>
  </appender>

  <logger name="org.mybatis.example.BlogMapper">
    <level value="trace"/>
  </logger>
  <root level="error">
    <appender-ref ref="stdout"/>
  </root>

</configuration>

上述文件将导致SLF4J(Logback)对org.mybatis.example.BlogMapper进行详细的日志记录,并对应用程序的其他类仅报告错误。

如果您想在更细的级别上调整日志记录,可以仅针对特定的语句而不是整个映射器文件开启日志记录。以下代码可仅为selectBlog语句启用日志记录:

<logger name="org.mybatis.example.BlogMapper.selectBlog">
  <level value="trace"/>
</logger>

相反地,您可能希望为一组映射器启用日志记录。在这种情况下,您应该将包含映射器的根包添加为一个记录器:

<logger name="org.mybatis.example">
  <level value="trace"/>
</logger>

有些查询可能返回大量的结果集。在这种情况下,您可能只想看到SQL语句而不是结果。为了实现这个目的,SQL语句被记录在DEBUG级别(JDK日志中的FINE级别),结果被记录在TRACE级别(JDK日志中的FINER级别)。因此,如果您只想看到语句而不是结果,请将日志级别设置为DEBUG。

<logger name="org.mybatis.example">
  <level value="debug"/>
</logger>

如果您没有使用映射器接口,而是使用类似这样的映射器XML文件,该怎么办呢?

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.mybatis.example.BlogMapper">
  <select id="selectBlog" resultType="Blog">
    select * from Blog where id = #{id}
  </select>
</mapper>

在这种情况下,您可以通过添加一个与命名空间相对应的记录器来为整个XML文件启用日志记录,示例如下:

<logger name="org.mybatis.example.BlogMapper">
  <level value="trace"/>
</logger>
或者针对特定语句进行配置:
<logger name="org.mybatis.example.BlogMapper.selectBlog">
  <level value="trace"/>
</logger>

是的,正如您可能已经注意到的那样,在配置映射器接口或XML映射器文件的日志记录时没有任何区别。

注意:如果您正在使用SLF4J或Log4j 2,MyBatis将使用标记MYBATIS来调用它。

配置Log4j 2的例子
<!-- pom.xml -->
<dependency>
  <groupId>org.apache.logging.log4j</groupId>
  <artifactId>log4j-core</artifactId>
  <version>2.x.x</version>
</dependency>
<!-- log4j2.xml -->
<?xml version="1.0" encoding="UTF-8"?>
<Configuration xmlns="http://logging.apache.org/log4j/2.0/config">

  <Appenders>
    <Console name="stdout" target="SYSTEM_OUT">
      <PatternLayout pattern="%5level [%t] - %msg%n"/>
    </Console>
  </Appenders>

  <Loggers>
    <Logger name="org.mybatis.example.BlogMapper" level="trace"/>
    <Root level="error" >
      <AppenderRef ref="stdout"/>
    </Root>
  </Loggers>

</Configuration>
配置Log4j的例子
<!-- pom.xml -->
<dependency>
  <groupId>log4j</groupId>
  <artifactId>log4j</artifactId>
  <version>1.2.17</version>
</dependency>
# log4j.properties
log4j.rootLogger=ERROR, stdout

log4j.logger.org.mybatis.example.BlogMapper=TRACE

log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
配置 JDK logging的例子
# logging.properties
handlers=java.util.logging.ConsoleHandler
.level=SEVERE

org.mybatis.example.BlogMapper=FINER

java.util.logging.ConsoleHandler.level=ALL
java.util.logging.ConsoleHandler.formatter=java.util.logging.SimpleFormatter
java.util.logging.SimpleFormatter.format=%1$tT.%1$tL %4$s %3$s - %5$s%6$s%n

?

文章来源:https://blog.csdn.net/hay23455/article/details/135295818
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。