使用log4j把日志信息保存到数据库

java.sql.SQLException:[Microsoft][ODBC驱动程序管理器]未发现数据源名称并且未指定默认驱动程序谁知道这个错怎么解决啊?... java.sql.SQLException: [Microsoft][ODBC 驱动程序管理器] 未发现数据源名称并且未指定默认驱动程序
谁知道这个错怎么解决啊?
展开
 我来答
jamxval
2014-11-14 · TA获得超过6822个赞
知道大有可为答主
回答量:4308
采纳率:82%
帮助的人:1437万
展开全部

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 广告
通常情况下,我们会按照结构模型把系统产生的数据分为三种类型:结构化数据、半结构化数据和非结构化数据。结构化数据,即行数据,是存储在数据库里,可以用二维表结构来逻辑表达实现的数据。最常见的就是数字数据和文本数据,它们可以某种标准格式存在于文件... 点击进入详情页
本回答由光点科技提供
手机用户95298
2014-11-14 · TA获得超过130个赞
知道答主
回答量:125
采纳率:0%
帮助的人:188万
展开全部
你的意思是每产生一条日志就写入数据库?

首先你这个思路有问题,日志别保存进数据库,因为这会增加非常多的插入操作,严重影响性能。
如果你非要保存进数据库,我给你提供一种解决方案:你可以利用Timer类计时,在每天的某个时段将log4j所产生的日志文件存入数据库。这样其实也挺多余,如果你希望做的是在客户端或者浏览器(我不知道你做的是什么项目)查看日志文件,可以通过服务器去读取本地的日志文件(我没记错的话,log4j日志文件命名都是按照固定名字+日期来命名),然后处理一下再显示到客户端或者浏览器。
追问
先不管性能问题,我就是想把日志信息存储起来,至于以什么方式存储比较好,我现在不管,就是使用log4j 把日志信息存储到mysql数据库日志表中,谁有例子,或者存储到文件都行。有例子的请发一个链接,真的谢谢了
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式