log 4 jdbcログフレームワーク


ここで皆さんが使用しているibatis,hibernate,spring jdbcのsqlログ情報には、プレースホルダとパラメータが別々に印刷されているという欠点があります.sqlをPLSQL Developerクライアントにコピーして直接実行するには、自分でsqlをパッチワークする必要があります.log 4 jdbcはjdbc層のログフレームワークであり、プレースホルダとパラメータをすべて統合して表示することができ、PLSQL Developerなどのクライアントでsqlを直接コピーして直接実行し、デバッグ速度を速めることができる.
一.簡単な説明:
1.log 4 jdbcを使用しない前のsql表示:
 
select username,password from bitth_date > ? and age < ? and username = ? 

 2.log 4 jdbcを使用するとsqlが表示されます.
 
 
select username,password from bitth_date > to_date(‘2010-11-11’,’yyyy-mm-dd’) and age < 20 and username = ‘qq2008’ {executed in 2 msec} 

これにより、上のsqlをPLSQLで直接コピーすることができる.最後の{executed in 2 msec}はSQL実行時間である.mysqlの場合、ログ情報はto_に表示されません.date()
 
二.log 4 jdbc使用:
 
1.spring xml構成(処理が必要なdataSource接続をブロック)
 
<bean id="log4jdbcInterceptor" class="net.sf.log4jdbc.DataSourceSpyInterceptor" />
	<bean id="dataSourceLog4jdbcAutoProxyCreator" class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
		<property name="interceptorNames">
			<list>
				<value>log4jdbcInterceptor</value>
			</list>
		</property>
		<property name="beanNames">
			<list>
				<value>dataSource</value>
			</list>
		</property>
	</bean>

DataSourceSpyInterceptorはブロッキングクラスで、拡張は主にAOPを使用する方法です.具体的なソースは次のとおりです.
 
/**       */
public class DataSourceSpyInterceptor implements MethodInterceptor
{
	private RdbmsSpecifics rdbmsSpecifics = null;

	private RdbmsSpecifics getRdbmsSpecifics(Connection conn)
	{
		if (this.rdbmsSpecifics == null)
			this.rdbmsSpecifics = DriverSpy.getRdbmsSpecifics(conn);

		return this.rdbmsSpecifics;
	}

	public Object invoke(MethodInvocation invocation) throws Throwable
	{
		Object result = invocation.proceed();
		if (SpyLogFactory.getSpyLogDelegator().isJdbcLoggingEnabled() && (result instanceof Connection))
		{
			Connection conn = (Connection)result;
			return new ConnectionSpy(conn, getRdbmsSpecifics(conn));
		}

		return result;
	}
}

MySql日付処理:
 
 
class MySqlRdbmsSpecifics extends RdbmsSpecifics
{
	MySqlRdbmsSpecifics()
	{
		super();
	}

	String formatParameterObject(Object object)
	{
		if (object instanceof java.sql.Time)
		{
			return "'" + new SimpleDateFormat("HH:mm:ss").format(object) + "'";
		}
		else if (object instanceof java.sql.Date)
		{
			return "'" + new SimpleDateFormat("yyyy-MM-dd").format(object) + "'";
		}
		else if (object instanceof java.util.Date) // (includes java.sql.Timestamp)
		{
			return "'" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(object) + "'";
		}
		else
		{
			return super.formatParameterObject(object);
		}
	}
}

Oracle日付処理
 
 
 
class OracleRdbmsSpecifics extends RdbmsSpecifics
{
	OracleRdbmsSpecifics()
	{
		super();
	}

	String formatParameterObject(Object object)
	{
		if (object instanceof Timestamp)
		{
			return "to_timestamp('" + new SimpleDateFormat("MM/dd/yyyy HH:mm:ss.SSS").format(object) + "', 'mm/dd/yyyy hh24:mi:ss.ff3')";
		}
		else if (object instanceof Date)
		{
			return "to_date('" + new SimpleDateFormat("MM/dd/yyyy HH:mm:ss").format(object) + "', 'mm/dd/yyyy hh24:mi:ss')";
		}
		else
		{
			return super.formatParameterObject(object);
		}
	}
}

2.log4j.properties構成:
 
 
log4j.rootLogger=INFO,stdout,R_ERROR
log4j.logger.asyncAppenders=INFO,stdout,logfileWarn

log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=[%p] [%d{yyyy-MM-dd HH:mm:ss}] [%c:%L] - %m%n

#log4jdbc config
log4j.logger.jdbc.sqlonly=OFF
log4j.logger.jdbc.sqltiming=INFO
log4j.logger.jdbc.audit=OFF
log4j.logger.jdbc.resultset=OFF
log4j.logger.jdbc.connection=OFF

#log4jdbc config end

log4j.logger.org.springframework.beans.factory.support.DefaultListableBeanFactory=ERROR,logfileWarn
log4j.logger.org.springframework.web.servlet.DispatcherServlet=ERROR,logfileWarn
log4j.logger.org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping=ERROR,logfileWarn
log4j.logger.com.shareinfo=DEBUG,logfileWarn

#hibernate
log4j.logger.org.hibernate.SQL=DEBUG
log4j.logger.org.hibernate.type=ERROR

#mybatis
log4j.logger.com.ibatis=DEBUG
log4j.logger.org.apache.ibatis.jdbc.ScriptRunner=DEBUG
log4j.logger.org.mybatis.spring=INFO
log4j.logger.org.apache.ibatis=DEBUG,stdout

log4j.appender.logfileWarn=org.apache.log4j.DailyRollingFileAppender
log4j.appender.logfileWarn.File=${catalina.base}/logs/warn.log
log4j.appender.logfileWarn.DatePattern='.'yyyy-MM-dd-HH
log4j.appender.logfileWarn.layout=com.netflix.logging.log4jAdapter.NFPatternLayout
log4j.appender.logfileWarn.Append=true
log4j.appender.logfileWarn.layout.ConversionPattern=[%p -> %c:%L] %d{yyyy-MM-dd HH:mm:ss} %m%n
log4j.appender.logfileWarn.Threshold=DEBUG

log4j.appender.R_ERROR=org.apache.log4j.DailyRollingFileAppender
log4j.appender.R_ERROR.Threshold=ERROR
log4j.appender.R_ERROR.File=${catalina.base}/logs/error.log
log4j.appender.R_ERROR.Append=true
log4j.appender.R_ERROR.DatePattern='.'yyyy-MM-dd
log4j.appender.R_ERROR.layout=com.netflix.logging.log4jAdapter.NFPatternLayout
log4j.appender.R_ERROR.layout.ConversionPattern=[%p -> %c:%L] %d{yyyy-MM-dd HH:mm:ss} %m%n

log4j.logger.java.sql.Connection=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG
log4j.logger.java.sql.ResultSet=DEBUG

(ログ情報がすべてoffの場合、log 4 jdbcは有効にならないため、パフォーマンスに影響はありません)log 4 jdbcはslf 4 jログフレームワークに依存する必要があります
 
その他の処理および構成プロパティは添付ファイルを参照してください.