`

log4jdbc源码解析(1)

阅读更多

        log4jdbc是用来记录数据库sql的jar包。需要与log类.jar一起使用。之前我们公司使用的是log4j。但是据说log4j有性能问题。最后我们换用了现在比较流行的logback日志框架。但是,中间需要用适配的jar包,所以组合为log4jdbc+log4j-over-slfj+logback。

一、如何配置

    数据库连接配置修改如下:

 

#driver需要配置为适配的log4jdbc的驱动类
dataSource.driverClass=net.sf.log4jdbc.sql.jdbcapi.DriverSpy

#jdbcUrl需要增加前面的head:jdbc\:log4
dataSource.jdbcUrl=jdbc\:log4jdbc\:jtds\:sybase\://ip\:port/db;charset\=UTF-8;appname\=appname;

 

    log4jdbc特有的配置-log4jdbc.log4j2.properties:

 

#配置真实的数据库驱动
log4jdbc.drivers=net.sourceforge.jtds.jdbc.Driver
#
log4jdbc.dump.fulldebugstacktrace=false
#配置为需要记录的包或类匹配路径
log4jdbc.debug.stack.prefix=
#sql的最大占行长度
log4jdbc.dump.sql.maxlinelength=150
#spy日志处理类
log4jdbc.spylogdelegator.name=net.sf.log4jdbc.log.slf4j.Slf4jSpyLogDelegator
#warn级别的日志,时间耗时超过配置值的会打印出来
log4jdbc.sqltiming.warn.threshold=100 
    logback配置:
<appender name="jdbcfile"
		class="ch.qos.logback.core.rolling.RollingFileAppender">
		<File>${baseHome}/${appname}_jdbc_${ip}_${port}.log</File>
		<encoder>
			<pattern>%d{yyyy-MM-dd HH:mm:ss} [%-5level] [%-5thread] %logger{20} -
				%msg%n</pattern>
		</encoder>
		<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
			<level>warn</level>
		</filter>
		<append>true</append>
		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
			<fileNamePattern>${baseHome}/${appname}_jdbc_${ip}_${port}.%d{yyyy-MM-dd}(%i).log</fileNamePattern>
			<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
			     <maxFileSize>200MB</maxFileSize>
			</timeBasedFileNamingAndTriggeringPolicy>
		</rollingPolicy>
	</appender>

	<logger name="jdbc.sqltiming" level="warn" additivity="false">
		<appender-ref ref="jdbcfile" />
	</logger>
 二、源码跟踪

    首先,我们先看看代理的驱动类--net.sf.log4jdbc.sql.jdbcapi.DriverSpy

  1.为什么jdbcUrl需要增加前面的head:jdbc\:log4?

 

	/**
	 * A <code>String</code> representing the prefix of URL 
	 * to use log4jdbc. 
	 */
	static final private String log4jdbcUrlPrefix = "jdbc:log4";
        /**
	 * Get the actual URL that the real driver expects 
	 * (strip off <code>#log4jdbcUrlPrefix</code> from <code>url</code>).
	 * 
	 * @param url 	A <code>String</code> corresponding to a JDBC url for log4jdbc. 
	 * @return 		A <code>String</code> representing url 
	 * 				with <code>#log4jdbcUrlPrefix</code> stripped off. 
	 */
	private String getRealUrl(String url)
	{
		return url.substring(log4jdbcUrlPrefix.length());
	}
 2.log4jdbc.log4j.properties只有这几个属性吗?

 不止呢@~@

//你可以知道的远不止这些
public final class Properties 
{
	private static volatile SpyLogDelegator log;

	/**
	 * A <code>String</code> representing the name of the class implementing 
	 * <code>SpyLogDelegator</code> to use. It is used by {@link SpyLogFactory} 
	 * to determine which class to load. 
	 * Default is <code>net.sf.log4jdbc.log4j2.Log4j2SpyLogDelegator</code> 
	 * 
	 * @see SpyLogFactory
	 */
	static final String SpyLogDelegatorName;	//这里就先列一个想看的自己看看properties
   
       /**
	 * Static initializer. 
	 */
	static 
	{
        //first we init the logger
		log = null;
		
		//then we need the properties to define which logger to use
		java.util.Properties props = getProperties();
		SpyLogDelegatorName = props.getProperty("log4jdbc.spylogdelegator.name");//。。。。。
          }
          
private static java.util.Properties getProperties()
	{
		java.util.Properties props = new java.util.Properties(System.getProperties());
    	//try to get the properties file.
    	//default name is log4jdbc.log4j2.properties
    	//check first if an alternative name has been provided in the System properties
    	String propertyFile = props.getProperty("log4jdbc.log4j2.properties.file", 
    			"/log4jdbc.log4j2.properties");
		if (log != null) {
		    log.debug("Trying to use properties file " + propertyFile);
		}
    	InputStream propStream = Properties.class.getResourceAsStream(propertyFile);
    	if (propStream != null) {
    		try {
    			props.load(propStream);
    		} catch (IOException e) {
    			if (log != null) {
    			    log.debug("Error when loading log4jdbc.log4j2.properties from classpath: " + 
    			        e.getMessage());
    			}
    		} finally {
    			try {
    				propStream.close();
    			} catch (IOException e) {
    				if (log != null) {
    				    log.debug("Error when closing log4jdbc.log4j2.properties file" + 
    			            e.getMessage());
    				}
    			}
    		}
    		if (log != null) {
    		    log.debug("log4jdbc.logj2.properties loaded from classpath");
    		}
    	} else {
    		if (log != null) {
    		    log.debug("log4jdbc.logj2.properties not found in classpath. Using System properties.");
    		}
    	}
    	return props;
	}
 }
 3.是哪调用的log4jdbc的connect方法呢?

 

    java.sql.DriverManager的getConnection方法

 

                try {
                    println("    trying " + aDriver.driver.getClass().getName());
                    Connection con = aDriver.driver.connect(url, info);
                    if (con != null) {
                        // Success!
                        println("getConnection returning " + aDriver.driver.getClass().getName());
                        return (con);
                    }
                } catch (SQLException ex) {
                    if (reason == null) {
                        reason = ex;
                    }
                }
 4.什么时候记录的日志的?

 

 这些都是检测的sql_spy类:

 

public boolean execute(String sql, String[] columnNames) throws SQLException
	{
		String methodCall = "execute(" + sql + ", " + columnNames + ")";
		this.sql = sql;
		reportStatementSql(sql, methodCall); //这个地方开始调用Slf4jSpyLogDelegator
		long tstart = System.currentTimeMillis();
		try
		{
			boolean result = realStatement.execute(sql, columnNames);
			reportStatementSqlTiming(System.currentTimeMillis() - tstart, sql, methodCall);//2
			return reportReturn(methodCall, result);//3
		}
		catch (SQLException s)
		{
			reportException(methodCall, s, sql, System.currentTimeMillis() - tstart);
			throw s;
		}
	}
 以下是打印sql的处理类,如果你想按照你的标准或是日志级别分配的话,你可以实现接口SpyLogDelegator:

 

 

 以上是我的全部内容。我是游走在IT届的小女子,有人问你想在IT走多远?我想说,别人能走多远,我同样能!没有终点!

   

    

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

       

 

  • 大小: 35.7 KB
  • 大小: 133.2 KB
分享到:
评论
1 楼 beanFactory 2016-12-12  
  

相关推荐

    log4j远程执行漏洞,测试源码

    3. **多种协议支持**:除了LDAP和RMI,Log4j还支持其他协议,如JMS、JDBC等,这意味着攻击者有更多方式来触发远程代码执行。 **应对措施与修复** 为防范Log4j漏洞,开发者和管理员可以采取以下措施: 1. **升级到...

    (转)如何自建appender扩展Log4j框架

    4. **初始化和关闭**:覆盖`activateOptions()`方法,这是Log4j在解析配置文件后调用的,用于完成Appender的初始化。同时,为了资源的释放和清理,实现`close()`方法。 5. **注册Appender**:在Log4j的配置文件(如...

    oracle_jdbc_讲义例子

    总结起来,"Oracle JDBC讲义例子"将涵盖Oracle JDBC驱动的安装、配置、连接建立、SQL执行、事务管理、批处理、源码解析以及相关工具的使用等方面,为开发者提供全面的Oracle数据库操作指南。通过深入学习和实践,...

    c3p0+log4j+jdom

    标题 "c3p0+log4j+jdom" 涉及到三个主要的Java库:C3P0,Log4j和JDOM。这些工具在IT领域中扮演着重要的角色,尤其在Java应用程序开发中。 C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和...

    Java源码之JDBC 连接池、监控组件 Druid

    Java中的JDBC(Java Database Connectivity)是用于与各种数据库交互的标准接口,而Druid则是一个优秀的JDBC组件,它在数据库连接池管理、性能监控、SQL解析等方面具有出色的表现。本篇文章将深入探讨Druid的核心...

    openfire4.2.3源码

    源码中会包含处理XMPP协议解析和发送的相关类和模块。 2. **Java技术栈**:Openfire是用Java语言开发的,因此理解Java基础和Java网络编程是必要的。源码中会涉及到多线程、Socket编程、XML处理、数据库交互等内容。...

    自己开发的Windows日志获取源码

    总之,使用Java开发Windows日志获取源码是一项技术性强、实用价值高的任务。通过理解Windows日志系统,合理运用Java的JNA库,以及灵活的数据库操作,我们可以构建出高效、灵活的日志处理工具。这不仅可以提高运维...

    基于Java的源码-M-LOG Java搭建的博客系统.zip

    "基于Java的源码-M-LOG Java搭建的博客系统"这个标题表明这是一个使用Java编程语言开发的博客系统源代码。M-LOG可能是这个博客系统的名称,它展示了如何利用Java技术来构建一个完整的Web应用。这里的关键词是“Java...

    加入数据库mysql实现android注册登陆功能的客户端服务器源码与解析

    4. **源码解析**: - `README.md`可能包含了关于如何编译、运行和测试源代码的指南。 - `加入数据库mysql实现android注册登陆功能的客户端服务器源码与解析.zip`是主要的源代码文件,解压后会包含服务器端和客户端...

    java源码:通用数据底层 Jsa4j.zip

    1. 数据库操作:Jsa4j可能包含了对常见数据库如MySQL、Oracle、SQL Server等的支持,通过封装JDBC接口,提供统一的数据访问API,简化了数据库的CRUD(创建、读取、更新、删除)操作。这包括连接管理、事务处理、SQL...

    mybatis增删改查基础jar包

    4. `log4j-1.2.16.jar`:Log4j 是一个广泛使用的日志记录框架,MyBatis 可以通过 Log4j 记录执行的 SQL 语句和其他相关信息,便于调试和性能分析。 5. `mybatis-3.1.1-sources.jar`:提供了 MyBatis 源代码,开发者...

    ActiveMQ 5 java 源码

    10. **日志和监控**:ActiveMQ使用了Log4j进行日志记录,并提供了监控工具,源码中可以了解如何设置和使用这些监控机制。 通过深入研究ActiveMQ 5的Java源码,开发者可以更好地理解消息中间件的工作机制,这对于...

    java项目经典源码

    13. **日志记录**:如Log4j或SLF4J用于记录程序运行信息,源码中会有关于日志配置和调用的例子。 14. **国际化与本地化**:Java提供了对多语言支持的机制,源码中可能有i18n的实现。 15. **Maven或Gradle**:构建...

    WebMagic抓取CSDN博客通过JDBC保存到数据库中去

    - **日志记录**:利用如Log4j或SLF4J的日志框架记录抓取过程中的信息,便于调试和监控。 8. **并发与多线程**: - **并行抓取**:为了提高效率,可以开启多个线程同时抓取不同的URL,但要注意防止对服务器造成过...

    Cloudera_ImpalaJDBC4_2.5.28.1047.zip

    6. **log4j-1.2.14.jar**:这是一个流行的Java日志框架,用于记录和控制应用程序的日志输出。在Impala的环境中,它用于记录各种操作和错误信息。 7. **libthrift-0.9.0.jar**:Apache Thrift是一种软件框架,用于...

    Spring Boot实战与原理分析视频课程包含14-18

    --演示了如何在Spring Boot里面使用日志配置,以及logback,log4j2等日志的使用 23 Spring Boot 监控和度量47:09 --Spring Boot内置的监控点、自定义的监控状况检查、自定义度量统计,输出等等 24 Spring Boot ...

    最新Java后台管理系统(ext-js4,Hibernate 4,Spring mvc3)

    1. EXT-JS4:EXT-JS是一个强大的JavaScript库,用于构建富客户端的Web应用程序。EXT-JS4是其第四代版本,提供了丰富的UI组件和数据绑定功能。在这个后台管理系统中,EXT-JS4可能用于构建用户界面,如表格、表单、...

    maven+ssm框架demo

    - 配置Log4j的log4j.properties或log4j.xml文件,定义日志输出级别、格式和位置。 7. **文件结构**:在“model”子目录中,通常包含项目中的实体类(Entity),这些类对应数据库中的表,用于封装数据。例如,User....

    springMVC+mybatis+mysql项目源码

    【SpringMVC+MyBatis+MySQL项目源码解析】 在现代Web开发中,SpringMVC、MyBatis和MySQL的组合是常见的技术栈,它们各自承担着不同的职责,共同构建了一个高效、灵活的后端架构。SpringMVC作为Spring框架的一部分,...

    java聊天室源码

    【Java聊天室源码解析】 Java聊天室源码是一个典型的多用户实时通信系统,它基于Java编程语言,展示了网络编程、并发处理以及IO流等核心Java技术的应用。在这个项目中,用户可以实现实时的文字交流,是学习和理解...

Global site tag (gtag.js) - Google Analytics