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=100logback配置:
<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走多远?我想说,别人能走多远,我同样能!没有终点!
相关推荐
本项目是一款以Java语言为核心的log4jdbc设计与应用源码,共包含46个文件,涵盖21个Java源文件、5个属性文件、4个XML配置文件、3个Shell脚本文件,以及少量其他支持文件,如编辑器配置、Git忽略规则、Markdown文档和...
3. **多种协议支持**:除了LDAP和RMI,Log4j还支持其他协议,如JMS、JDBC等,这意味着攻击者有更多方式来触发远程代码执行。 **应对措施与修复** 为防范Log4j漏洞,开发者和管理员可以采取以下措施: 1. **升级到...
4. **初始化和关闭**:覆盖`activateOptions()`方法,这是Log4j在解析配置文件后调用的,用于完成Appender的初始化。同时,为了资源的释放和清理,实现`close()`方法。 5. **注册Appender**:在Log4j的配置文件(如...
总结起来,"Oracle JDBC讲义例子"将涵盖Oracle JDBC驱动的安装、配置、连接建立、SQL执行、事务管理、批处理、源码解析以及相关工具的使用等方面,为开发者提供全面的Oracle数据库操作指南。通过深入学习和实践,...
标题 "c3p0+log4j+jdom" 涉及到三个主要的Java库:C3P0,Log4j和JDOM。这些工具在IT领域中扮演着重要的角色,尤其在Java应用程序开发中。 C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和...
可以使用标准的日志框架如Log4j或SLF4J来实现。 4. **性能分析**:计算SQL语句的执行时间,分析慢查询,识别性能瓶颈。这可能涉及到时间戳记录和比较,以及可能的统计分析。 5. **配置集成**:P6Spy的配置通常在`...
Java中的JDBC(Java Database Connectivity)是用于与各种数据库交互的标准接口,而Druid则是一个优秀的JDBC组件,它在数据库连接池管理、性能监控、SQL解析等方面具有出色的表现。本篇文章将深入探讨Druid的核心...
源码中会包含处理XMPP协议解析和发送的相关类和模块。 2. **Java技术栈**:Openfire是用Java语言开发的,因此理解Java基础和Java网络编程是必要的。源码中会涉及到多线程、Socket编程、XML处理、数据库交互等内容。...
总之,使用Java开发Windows日志获取源码是一项技术性强、实用价值高的任务。通过理解Windows日志系统,合理运用Java的JNA库,以及灵活的数据库操作,我们可以构建出高效、灵活的日志处理工具。这不仅可以提高运维...
"基于Java的源码-M-LOG Java搭建的博客系统"这个标题表明这是一个使用Java编程语言开发的博客系统源代码。M-LOG可能是这个博客系统的名称,它展示了如何利用Java技术来构建一个完整的Web应用。这里的关键词是“Java...
4. **源码解析**: - `README.md`可能包含了关于如何编译、运行和测试源代码的指南。 - `加入数据库mysql实现android注册登陆功能的客户端服务器源码与解析.zip`是主要的源代码文件,解压后会包含服务器端和客户端...
1. 数据库操作:Jsa4j可能包含了对常见数据库如MySQL、Oracle、SQL Server等的支持,通过封装JDBC接口,提供统一的数据访问API,简化了数据库的CRUD(创建、读取、更新、删除)操作。这包括连接管理、事务处理、SQL...
4. `log4j-1.2.16.jar`:Log4j 是一个广泛使用的日志记录框架,MyBatis 可以通过 Log4j 记录执行的 SQL 语句和其他相关信息,便于调试和性能分析。 5. `mybatis-3.1.1-sources.jar`:提供了 MyBatis 源代码,开发者...
10. **日志和监控**:ActiveMQ使用了Log4j进行日志记录,并提供了监控工具,源码中可以了解如何设置和使用这些监控机制。 通过深入研究ActiveMQ 5的Java源码,开发者可以更好地理解消息中间件的工作机制,这对于...
13. **日志记录**:如Log4j或SLF4J用于记录程序运行信息,源码中会有关于日志配置和调用的例子。 14. **国际化与本地化**:Java提供了对多语言支持的机制,源码中可能有i18n的实现。 15. **Maven或Gradle**:构建...
- **日志记录**:利用如Log4j或SLF4J的日志框架记录抓取过程中的信息,便于调试和监控。 8. **并发与多线程**: - **并行抓取**:为了提高效率,可以开启多个线程同时抓取不同的URL,但要注意防止对服务器造成过...
6. **log4j-1.2.14.jar**:这是一个流行的Java日志框架,用于记录和控制应用程序的日志输出。在Impala的环境中,它用于记录各种操作和错误信息。 7. **libthrift-0.9.0.jar**:Apache Thrift是一种软件框架,用于...
--演示了如何在Spring Boot里面使用日志配置,以及logback,log4j2等日志的使用 23 Spring Boot 监控和度量47:09 --Spring Boot内置的监控点、自定义的监控状况检查、自定义度量统计,输出等等 24 Spring Boot ...
1. EXT-JS4:EXT-JS是一个强大的JavaScript库,用于构建富客户端的Web应用程序。EXT-JS4是其第四代版本,提供了丰富的UI组件和数据绑定功能。在这个后台管理系统中,EXT-JS4可能用于构建用户界面,如表格、表单、...
- 配置Log4j的log4j.properties或log4j.xml文件,定义日志输出级别、格式和位置。 7. **文件结构**:在“model”子目录中,通常包含项目中的实体类(Entity),这些类对应数据库中的表,用于封装数据。例如,User....