使用log4j把日志信息保存到数据库
谁知道这个错怎么解决啊? 展开
log4j 包里面有一个 SQL 的 appender ,但我知道以前的版本中有bug,因为它生成 SQL 时用的是 createStatement 拼接字符串而不是 PreparedStatement ,因此当消息内容中有单引号或特殊符号时 SQL 都有语法错误执行不成功。
你需要自己扩展一下它提供自己的 SQLAppender 来做这件事。在网上搜索一个像 decompiler 这样的 Java 反编译器或从 Apache 网站去下载 log4j 源码来看一下 SQL appender 是怎么样的,我们改写它把这个 bug 解决了就可以用了。
如果你打算用 ODBC 数据源而不是 JDBC 来做,你需要确保你的 JRE 是 Oracle / Sun 提供的,因为像 IBM 的 JRE 就没有自带 ODBC 驱动程序,或者你自己去手工下载第三方的 ODBC 驱动程序。
从你的错误消息说 数据源找不到,对比下面这个图片,你没有设置它的 driver 参数,左边所有以 set 开头的方法就是表示你在 log4j.properties 文件中可以给它设置的参数,比如,setPassword 表示这个 JDBC Appender 有一个属性 password。
log4j.appender.mySQLAppender.password = 密码
log4j.appender.mySQLAppender.user = 用户名
。。。 其它 set 方法对应的属性列举在这里。。。
依此类推。
我们需要纠正的 bug 在这里面,你需要提供自己的类继承原来的 JDBCAppender 把这个 statement 改成 PreparedStatement 来访问数据库,就是需要 stmt.setString(1, myMsg); 这种,而不是直接拼接字符串的。
看了它的 JDBCAppender.execute 方法就知道这里有一个 bug:
2023-08-15 广告
首先你这个思路有问题,日志别保存进数据库,因为这会增加非常多的插入操作,严重影响性能。
如果你非要保存进数据库,我给你提供一种解决方案:你可以利用Timer类计时,在每天的某个时段将log4j所产生的日志文件存入数据库。这样其实也挺多余,如果你希望做的是在客户端或者浏览器(我不知道你做的是什么项目)查看日志文件,可以通过服务器去读取本地的日志文件(我没记错的话,log4j日志文件命名都是按照固定名字+日期来命名),然后处理一下再显示到客户端或者浏览器。
先不管性能问题,我就是想把日志信息存储起来,至于以什么方式存储比较好,我现在不管,就是使用log4j 把日志信息存储到mysql数据库日志表中,谁有例子,或者存储到文件都行。有例子的请发一个链接,真的谢谢了