log4j打印mybatis执行sql,将占位符换成真实的参数输出
背景:
- <span style="white-space:pre;"> </span><!-- log4j 日志 -->
- <dependency>
- <groupId>log4j</groupId>
- <artifactId>log4j</artifactId>
- <version>${log4j-version}</version>
- </dependency>
- <span style="white-space:pre;"> </span><settings>
- <setting name="logImpl" value="LOG4J" />
- </settings>
3、添加logj4j.properties文件
- #logFile
- log4j.rootLogger=DEBUG,Console
- #Console
- log4j.appender.Console=org.apache.log4j.ConsoleAppender
- log4j.appender.console.Threshold=INFO
- log4j.appender.console.ImmediateFlush=true
- log4j.appender.Console.Target=System.out
- log4j.appender.Console.layout=org.apache.log4j.PatternLayout
- log4j.appender.Console.layout.ConversionPattern=%-5p %d{yyyy-MM-dd HH:mm:ss}[%t] %l: %x%m%n
- # 日志文件(logFile)
- log4j.appender.logFile=org.apache.log4j.FileAppender
- log4j.appender.logFile.Threshold=DEBUG
- # 立即输出
- #log4j.appender.logFile.ImmediateFlush=true
- #log4j.appender.logFile.Append=true
- #log4j.appender.logFile.File=D:/logs/log.log4j
- #log4j.appender.logFile.layout=org.apache.log4j.PatternLayout
- #log4j.appender.logFile.layout.ConversionPattern=%-5p %d{yyyy-MM-dd HH:mm:ss}[%t] %l: %x%m%n
- log4j.logger.org.apache=ERROR
- log4j.logger.org.mybatis=ERROR
- log4j.logger.org.springframework=ERROR
- #这个需要
- log4j.logger.log4jdbc.debug=ERROR
- log4j.logger.jdbc.audit=ERROR
- log4j.logger.jdbc.resultset=ERROR
- #这个打印SQL语句非常重要
- log4j.logger.jdbc.sqlonly=DEBUG
- log4j.logger.jdbc.sqltiming=ERROR
- log4j.logger.jdbc.connection=FATAL
4、测试结果
- ==> Preparing: select u.id as id ,u.name as name , u.pwd as pwd from user u where u.pwd = ? and u.id = ?;
- ==> Parameters: 123(String), 1(String)
- <== Total: 0
显然:参数和sql是分离的,现在要实现将参数嵌套进sql中,实现上面的想法
- protected void debug(String text, boolean input) {
- if (statementLog.isDebugEnabled()) {
- statementLog.debug(prefix(input) + text);
- }
- }
目前的这个是BaseJdbcLogger.debug的源码,其中(text:是需要打印的文本,input:表示前面的“==>”的方向)
- /* 打印的sql */
- private static String sql = "";
- protected void debug(String text, boolean input) {
- text = text.trim();
- if (statementLog.isDebugEnabled()) {
- if(text.startsWith("Preparing:")){
- sql = text.substring(text.indexOf(":")+1);
- return ;
- }
- if(text.startsWith("Parameters:")){
- String temp = text.substring(text.indexOf(":")+1);
- String[] split = temp.split(",");
- if(split != null & split.length > 0){
- for (String string2 : split) {
- String s = string2.trim();
- sql = sql.replaceFirst("\\?", s.substring(0, s.indexOf("(")));
- }
- }
- text = "Preparing:"+ sql ;
- sql = "";
- }
- statementLog.debug(prefix(input) + text);
- }
- }
最终输出结果:
- ==> Preparing: select u.id as id ,u.name as name , u.pwd as pwd from user u where u.pwd = 123 and u.id = 1;
- <== Total: 0
到到最终目的
log4j打印mybatis执行sql,将占位符换成真实的参数输出的更多相关文章
- mybatis + log4j 打印mybatis的sql
项目中使用log4j管理日志,同时使用了mybatis 在log4j中rootLogger级别是info的情况下正常是不会打印sql出来的,这个时候设置如下: log4j.rootLogger=inf ...
- log4j打印MyBatis的sql语句配置
log4j.rootLogger=DEBUG,stdout log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender. ...
- log4j打印mybatis sql语句
Mybatis默认使用有slf4j 必须加上依赖 <dependency> <groupId>org.slf4j</groupId> <artifactId& ...
- linux 的sed命令解释 sed ':t;N;s/\n/,/;b t' 将换行符换成逗号
linux 的sed命令解释 sed ':t;N;s/\n/,/;b t' 将换行符换成逗号 实现的功能是吧换行符换成逗号了,自己试验过. 求解释,:t N b t 都是什么意思??? :t 定义la ...
- log4j配置打印mybatis的sql到控制台(复制)
log4j.rootLogger=DEBUG, stdout log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender ...
- Mybatis执行SQL的流程
前篇:Mybatis初始化过程 SqlSession : SqlSession是一个接口,它有两个实现类:DefaultSqlSession (默认)和 SqlSessionManager (弃用,不 ...
- Mybatis执行sql(insert、update、delete)返回值问题
数据库:Mysql 在使用mybatis的过程中对执行sql的返回值产生疑问,顺手记录一下. 结论: insert: 插入n条记录,返回影响行数n.(n>=1,n为0时实际为插入失败) up ...
- 在mybatis执行SQL语句之前进行拦击处理
转载自:http://blog.csdn.net/hfmbook/article/details/41985853 比较适用于在分页时候进行拦截.对分页的SQL语句通过封装处理,处理成不同的分页sql ...
- 如何让SpringBoot工程在log/控制台中实时打印MyBatis执行的SQL语句
工程下载:https://files.cnblogs.com/files/xiandedanteng/gatling20200429-4.zip 其实就是一句话设置的事情,实现步骤: 在applica ...
随机推荐
- 15.并发容器之ConcurrentLinkedQueue
1.ConcurrentLinkedQueue简介 在单线程编程中我们会经常用到一些集合类,比如ArrayList,HashMap等,但是这些类都不是线程安全的类.在面试中也经常会有一些考点,比如Ar ...
- @Primary-在spring中常被忽视的注解
在spring 中使用注解,常使用@Autowired, 默认是根据类型Type来自动注入的.但有些特殊情况,对同一个接口,可能会有几种不同的实现类,而默认只会采取其中一种的情况下 @Primary ...
- Vlmcsd(KMS)激活服务器程序
1.下载vlmcsd程序 2-1.虚拟机版本: 新建Linux虚拟机,硬件仅保留内存(最小14MB,推荐16MB).处理器(1个1核心).软盘(指向floppy144.flp).网络适配器(桥接模式) ...
- day32 Python与金融量化分析(二)
第一部分:金融与量化投资 股票: 股票是股份公司发给出资人的一种凭证,股票的持有者就是股份公司的股东. 股票的面值与市值 面值表示票面金额 市值表示市场价值 上市/IPO: 企业通过证券交易所公开向社 ...
- Ansible 小手册系列 三(命令介绍)
仅仅只是介绍,可以选择跳过 ansible ansible是指令核心部分,其主要用于执行ad-hoc命令,即单条命令.默认后面需要跟主机和选项部分,默认不指定模块时,使用的是command模块. Us ...
- 023——VUE中数据排序sort() / 数据反转 reverse() 的使用
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- C++高级编程2. 静态动态链接库
C++高级编程2. 静态动态链接库20131018 1.动态链接库和静态链接库的区别: 静态链接库就是把lib文件中用到的函数代码直接连接进目标程序,程序运行的时候不在需要其他的库文件:动态链接库是把 ...
- git clone 提示输入git@xxx的密码
如下: suse:~/ecox # git clone git@vcs.in.ww-it.cn:ecox/ecox.git 正克隆到 'ecox'... git@vcs.in.ww-it.cn's p ...
- Linux:wc命令详解
wc 用来计算数字 利用wc指令我们可以计算文件的Byte数.字数或是列数,若不指定文件名称,或是所给予的文件名为“-”,则wc指令会从标准输入设备读取数据. 语法 wc(选项)(参数) 选项 -c或 ...
- 使用jQuery操作DOM(1)
1.常见方法 css(“属性”,”属性值”); //设置单个样式 css({属性1:属性值1,属性2:属性值3...}); //设置多个样式 addClass(“样式名”); //追加单个样式 add ...