java - MyBatis log4j 配置仅记录映射器 XML 中的 SQL 名称,而不记录 SQL

标签 java logging log4j mybatis

当我在 log4j.properties 中设置以下属性时,

log4j.logger.package.mapper=DEBUG

MyBatis 会将作业委托(delegate)给 log4j,而 log4j 将在日志中打印整个 SQL 语句。 有没有办法只记录 SQL 语句的名称(XML 中的 id ,如果使用注释完成,它与 JAVA 中的映射器函数名称相匹配)?

例如。如果通过 XML 完成,我在映射器中的选择查询如下所示:

<select id="selectPerson" parameterType="int" ....

然后我只想记录selectPerson。当前正在记录它,但它还包括带有所有参数值的 SQL 语句。我只想隐藏日志中实际的 SQL 查询。

最佳答案

MyBatis 的日志记录实现没有隐藏 SQL 的选项,但是,可以使用自定义 interceptor 来实现它。 .
假设您使用的是最新版本的 MyBatis,这里是一个示例实现。

package pkg;

import org.apache.ibatis.executor.Executor;
import org.apache.ibatis.mapping.MappedStatement;
import org.apache.ibatis.plugin.Interceptor;
import org.apache.ibatis.plugin.Intercepts;
import org.apache.ibatis.plugin.Invocation;
import org.apache.ibatis.plugin.Signature;
import org.apache.ibatis.session.ResultHandler;
import org.apache.ibatis.session.RowBounds;
import org.apache.log4j.Logger;

@Intercepts({
  @Signature(
      type = Executor.class, 
      method = "update", 
      args = { MappedStatement.class, Object.class }),
  @Signature(
      type = Executor.class, 
      method = "query", 
      args = { MappedStatement.class, Object.class,
        RowBounds.class, ResultHandler.class })
})
public class LogStatementIdInterceptor implements Interceptor {
  private static final Logger logger = Logger.getLogger(LogStatementInterceptor.class);
  @Override
  public Object intercept(Invocation invocation) throws Throwable {
    MappedStatement ms = (MappedStatement) invocation.getArgs()[0];
    logger.debug(ms.getId());
    return invocation.proceed();
  }
}

要注册拦截器,请将以下条目添加到 XML 配置文件中。

<plugins>
  <plugin interceptor="pkg.LogStatementIdInterceptor" />
</plugins>

使用 Java 配置,将拦截器的实例传递给 org.apache.ibatis.session.Configuration#addInterceptor() .

log4j.properties中...

log4j.logger.pkg.LogStatementIdInterceptor=DEBUG

关于java - MyBatis log4j 配置仅记录映射器 XML 中的 SQL 名称,而不记录 SQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59077138/

相关文章:

java - 首先使用哪个context.xml

java.lang.UnsatisfiedLinkError : Native method not found: 错误

azure - 在 Key Vault 上设置日志记录时出错日志类别 'AuditEvents' 不可用

scala - sbt:抑制标准输出中的日志前缀

java - SLF4J 的 NoSuchMethodError

java - 使用 Spring MVC 管理 REST 响应

java - 将 boolean 数组从 C 返回到 Java

java - 如何在 SLF4J-simple 的 simplelogger.properties 中为不同的包设置日志记录级别

使用 log4j 的 Hadoop Yarn 任务级日志记录

java - 将 exe 移动到 Windows 服务 - 停止创建日志文件