如何用log4j在控制台输出Mybatis里的SQL语句

用log4j在控制台输出,在web.xml中配置log4j.properties的路径,properties文件 
log4j.rootLogger=DEBUG, Console
 
#Console
log4j.appender.Console=org.apache.log4j.ConsoleAppender
log4j.appender.Console.layout=org.apache.log4j.PatternLayout
log4j.appender.Console.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%n
 
log4j.logger.java.sql.ResultSet=INFO
log4j.logger.org.apache=INFO
log4j.logger.java.sql.Connection=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG
 
如果不想打印spring的DEBUG输出请把第一行的DEBUG改为INFO
<think>我们已经在之前的对话中讨论了如何使用Log4j2输出MyBatisSQL语句,现在用户再次明确询问在Spring Boot中集成MyBatis并使用Log4j2在控制台输出完整SQL语句的方法。根据引用内容,我们可以总结如下: 关键点: 1. 需要配置MyBatis使用Log4j2作为日志实现(log-impl)。 2. 需要设置MyBatis相关包的日志级别为DEBUG,以输出SQL语句。 3. 根据引用[1],如果将log-impl设置为StdOutImpl(标准输出),则SQL和结果都会打印到控制台。但我们这需要的是Log4j2,所以不使用StdOutImpl。 4. 引用[3]展示了使用Log4j2打印SQL的日志示例,其中包含了SQL语句和参数。 步骤: 1. 确保项目中使用了Log4j2作为日志框架(排除Spring Boot默认的Logback,并引入Log4j2)。 2. 配置MyBatis使用Log4j2的日志实现(log-impl)。 3. 设置日志级别,使得MyBatisSQL语句能够被输出(DEBUG级别)。 具体步骤: ### 1. 添加Log4j2依赖并排除Logback 在Spring Boot项目中,默认使用Logback,所以要使用Log4j2,需要排除Logback并引入Log4j2。 **Maven配置**(在pom.xml中): ```xml <dependencies> <!-- 排除Spring Boot默认的日志启动器 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-logging</artifactId> </exclusion> </exclusions> </dependency> <!-- 引入Log4j2 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-log4j2</artifactId> </dependency> <!-- 其他依赖,如MyBatis、MySQL等 --> </dependencies> ``` ### 2. 配置MyBatis使用Log4j2 在application.yml(或application.properties)中配置MyBatis的日志实现为Log4j2。 **application.yml配置**: ```yaml mybatis: configuration: log-impl: org.apache.ibatis.logging.log4j2.Log4j2Impl ``` 注意:这个配置会让MyBatis使用Log4j2来输出SQL日志。 ### 3. 配置Log4j2的日志级别 在Log4j2的配置文件(log4j2.xml或log4j2-spring.xml)中,设置MyBatis相关包的日志级别为DEBUG。 **log4j2.xml配置示例**: ```xml <?xml version="1.0" encoding="UTF-8"?> <Configuration status="WARN"> <Appenders> <Console name="Console" target="SYSTEM_OUT"> <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/> </Console> </Appenders> <Loggers> <!-- 设置MyBatis接口所在的包的日志级别为DEBUG --> <Logger name="com.example.mapper" level="DEBUG" additivity="false"> <AppenderRef ref="Console"/> </Logger> <!-- 也可以设置MyBatis核心包的日志级别,但通常我们只需要Mapper接口的DEBUG日志即可输出SQL --> <Root level="INFO"> <AppenderRef ref="Console"/> </Root> </Loggers> </Configuration> ``` 解释: - 上述配置中,我们将`com.example.mapper`(你的Mapper接口所在的包)的日志级别设置为DEBUG,这样在执行Mapper方法SQL语句就会被输出控制台。 - 如果你想要输出MyBatis核心包的日志(例如执行过程),可以设置`org.apache.ibatis`的日志级别为DEBUG,但通常我们只需要Mapper接口的DEBUG级别即可输出SQL。 ### 4. 验证 启动应用并执行数据库操作,控制台输出类似以下日志: ``` 2024-06-21 17:50:41.830 [main] DEBUG com.example.mapper.UserMapper.selectUser - ==> Preparing: select * from user where id = ? 2024-06-21 17:50:41.843 [main] DEBUG com.example.mapper.UserMapper.selectUser - ==> Parameters: 1(Integer) 2024-06-21 17:50:41.892 [main] DEBUG com.example.mapper.UserMapper.selectUser - <== Total: 1 ``` 这样,我们就实现了在控制台输出完整的SQL语句(包括参数)。 ### 注意事项 - 如果你想输出完整的可执行SQL(即参数值已经替换到SQL语句中),则需要额外的工具或配置。MyBatis默认日志不会直接输出替换后的SQL,而是分别输出SQL模板和参数。但我们可以通过第三方插件(如p6spy)来实现,或者使用MyBatis Plus自带的SQL分析插件(但这我们只讨论原生MyBatis)。 - 如果使用MyBatis Plus,它提供了`PerformanceInterceptor`等插件,但注意在最新版本中可能已被替代(如使用`MybatisPlusInterceptor`)。不过,这我们只关注原生MyBatis。 ### 引用说明 根据引用[1],如果配置`log-impl`为`StdOutImpl`,则会在控制台输出SQL和结果(但这是MyBatis自带的控制台输出,不是通过Log4j2)。而我们这使用的是`Log4j2Impl`,所以通过Log4j2配置输出控制台。引用[3]展示了使用Log4j2输出的日志示例,其中包含了SQL语句和参数,但没有将参数直接替换到SQL语句中(即仍然是分开显示的)[^3]。 §§生成相关问题§§ </think>### Spring Boot 集成 MyBatis 使用 Log4j2 输出完整 SQL 语句的方法 #### 一、核心配置步骤 1. **添加 Log4j2 依赖** 在 `pom.xml` 中排除默认日志框架,添加 Log4j2 依赖: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions> <!-- 排除默认日志 --> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-logging</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-log4j2</artifactId> </dependency> ``` 2. **配置 MyBatis 日志实现** 在 `application.yml` 中指定 MyBatis 使用 Log4j2: ```yaml mybatis: configuration: log-impl: org.apache.ibatis.logging.log4j2.Log4j2Impl # 关键配置 ``` 3. **设置日志级别** 启用 MyBatis 的 DEBUG 日志级别: ```yaml logging: level: org.apache.ibatis: DEBUG # MyBatis 核心日志 com.example.mapper: DEBUG # 替换为你的 Mapper 包路径 ``` 4. **Log4j2 配置文件 (`log4j2.xml`)** ```xml <?xml version="1.0" encoding="UTF-8"?> <Configuration status="WARN"> <Appenders> <Console name="Console" target="SYSTEM_OUT"> <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/> </Console> </Appenders> <Loggers> <!-- MyBatis SQL 输出 --> <Logger name="com.example.mapper" level="DEBUG" additivity="false"> <AppenderRef ref="Console"/> </Logger> <Root level="INFO"> <AppenderRef ref="Console"/> </Root> </Loggers> </Configuration> ``` #### 二、验证输出效果 执行查询后,控制台输出完整 SQL 信息: ```log 2024-06-21 10:30:25.456 [main] DEBUG com.example.mapper.UserMapper.selectById ==> Preparing: SELECT * FROM user WHERE id = ? 2024-06-21 10:30:25.458 [main] DEBUG com.example.mapper.UserMapper.selectById ==> Parameters: 123(Integer) 2024-06-21 10:30:25.465 [main] DEBUG com.example.mapper.UserMapper.selectById <== Total: 1 ``` #### 三、参数值替换说明 MyBatis 默认日志会分别显示: 1. `Preparing`: 带占位符的 SQL 模板 2. `Parameters`: 实际参数值 如需自动拼接完整 SQL(如 `SELECT * FROM user WHERE id = 123`),需借助第三方工具如 [p6spy](https://github.com/p6spy/p6spy),MyBatis 原生不支持直接输出拼接后的 SQL[^1][^3]。 #### 四、其他优化建议 1. **生产环境日志分离** 添加文件 Appender 单独存储 SQL 日志: ```xml <Appenders> <File name="SqlFile" fileName="logs/sql.log"> <PatternLayout pattern="%d{ISO8601} [%t] %m%n"/> </File> </Appenders> <Logger name="com.example.mapper" level="DEBUG"> <AppenderRef ref="SqlFile"/> </Logger> ``` 2. **敏感数据脱敏** 在 Log4j2 配置中过滤敏感字段: ```xml <Rewrite name="SensitiveFilter"> <PatternLayout pattern="%m%n"/> <Rules> <Mask name="hidePassword" pattern="(password=')([^']+)'" replacement="$1****"/> </Rules> </Rewrite> ``` > **注意**:DEBUG 级别日志会显著影响性能,生产环境建议仅在排查问题开启[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值