2019-12-18-扒开hibernate日志这层外衣

概述

为什么扒人家衣服

奇怪,hibernate是谁?人家又是谁,到底扒谁的衣服,我懵了……

咳咳,请忽略上面的一段话,正经起来了。

由于博主公司的项目用的是jpa,而jpa的实现用的是hibernate,对于hibernate输出日志这一块,感觉特别的好奇。不知道你也好奇嘛?

我们是一般都会配置,类似于下面这样的。show-sql:这个配置是为了打印sql日志的,那么关于这个配置你了解的有多少呢?且听我一一道来

1
2
3
jpa:
database: MYSQL
show-sql: true

历程

首先呢,配置了show-sql=true的时候打印的日志格式是这样的:

1
Hibernate: select * from 表名;

看起来这个输出语句也不是一个日志?那我们是不是可以肯定,这就是一个Java的输出语句?
有没有搞错啊,你是不是吓了一跳??
口说无凭,我们得看一下hibernate的底层实现源码。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class SqlStatementLogger {
private static final Logger LOG = CoreLogging.logger("org.hibernate.SQL");
private boolean logToStdout;
public SqlStatementLogger(boolean logToStdout, boolean format) {
this.logToStdout = logToStdout;
this.format = format;
}
// 省略了很多方法,这是最核心的
public void logStatement(String statement, Formatter formatter) {
if(format) {
if(logToStdout || LOG.isDebugEnabled()){
statement = formatter.format(statement);
}
}
LOG.debug(statement);
if(logToStdout){
System.out.println( "Hibernate: " + statement );
}
}
}

可以看到这里System.out.println( "Hibernate: " + statement );
确实是Java的输出语句输出的,哈哈哈,
前面还有一句LOG.debug( statement );意思就是你如果日志的输出级别是debug?那么会输出两遍同样的日志,哈哈哈?
事实证明,确实是如此的,不信你可以试试。
而这个logToStdout参数,会在构造的时候被传入进来。
示例:在类JdbcServicesImpl

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@Override
public void configure(Map configValues) {
this.jdbcEnvironment = serviceRegistry.getService( JdbcEnvironment.class );
assert jdbcEnvironment != null : "JdbcEnvironment was not found!";

this.multiTenancyStrategy = MultiTenancyStrategy.determineMultiTenancyStrategy( configValues );

final boolean showSQL = ConfigurationHelper.getBoolean( Environment.SHOW_SQL, configValues, false );
final boolean formatSQL = ConfigurationHelper.getBoolean( Environment.FORMAT_SQL, configValues, false );

// 关键代码,这里也就是传入我们的show-sql的参数配置
this.sqlStatementLogger = new SqlStatementLogger( showSQL, formatSQL );

resultSetWrapper = new ResultSetWrapperImpl( serviceRegistry );
}

总结

默认的show-sql参数都是false。

show-sql参数配置的是控制台输出,跟日志级别没关系,如果你觉得烦,那我也没办法,除非你能改源码。

over~谢谢大家。

-------------本文结束 感谢您的阅读-------------
湖南有北 wechat
扫码进群哦~~
你可以对我打赏哦