java 解析数据库日志文件,解析日志文件插入数据库(Java怎么设计可以获得高性能)...

解析日志文件插入数据库(Java如何设计可以获得高性能)

日志文件格式如下:

2007-12-25 08:55:17,421 INFO com.footmark.b2bifq.util.B2BIFQHandler - *** Session request started ***

2007-12-25 08:55:17,437 INFO com.footmark.b2bifq.util.B2BIFQHandler - *** Session request started ***

2007-12-25 08:55:45,046 INFO com.footmark.b2bifq.util.B2BIFQHandler - *** Session response ended ***

2007-12-25 08:55:46,796 INFO com.footmark.b2bifq.util.B2BIFQHandler - *** Session response ended ***

每一行对应数据库的一条记录,因为每天会产生上万条日志记录,怎样设计才能获得高性能.如果读一条,插入一条的话,速度太慢了.

请各位指点迷津,有没有别的好的设计(高性能)或用有的框架.谢谢

1 楼

duooluu

2008-03-10

同问,用户一天产生10G左右的日志文件

要求入库,头大了

2 楼

crofton

2008-03-10

为何要插入数据库?

3 楼

neuzhujf

2008-03-10

可以用异步的log,就是把log输出交给其他线程来做,log4j有这样的功能。

要不做个缓存,比如把1000条log数据放到list中,然后一次DB连接,把所有的纪录插入到DB中。

上面两个方法可以结合

4 楼

二十一

2008-03-10

mq也可以实现啊,反正就是异步了

5 楼

huanglppp

2008-03-11

夜间了,只是想,性能上能有很大的突破,能否给出实例

6 楼

LifeFree

2008-03-11

log4j本身就支持写入数据库中,只是一个配置的问题。

关键是有必要把大把大把的数据写入数据库吗?

7 楼

idragon

2008-03-11

Log4J本身支持将日志异步写入数据库。参考SpringSide的文章:http://wiki.springside.org.cn/display/springside/Log4j

8 楼

pickerel

2008-03-11

一天上万条的数据量一点也不大啊。

10G倒是不小。

如果不要求实时的化,用数据库本身的导入解决方案吧,比如mysql用LOAD DATA(应该用jdbc也能调用的),效率很高的,不过10G的文件的话还是建议文件分割之后再LOAD,表也不要设置索引什么的以提高导入效率,如果记录数太多,建议分表存储。

如果不用数据库本省的解决方案,那可以用jdbc的executeBatch,当然效率也不见得能提供很多,使用jdbc的时候注意:

1.不用在操作过程频繁打开关闭连接,一个连接开了,尽量就一直用下去。

2.去除表索引。

3.多线程处理,每个线程用单独的数据库连接。

4.分表或者多个线程同时向多个数据库服务器插入,以后再想办法合并处理。

9 楼

helloboy9527

2008-03-12

perl,awk,load data,这种数据量还不算大,亿条日志都不成问题。

10 楼

dennis_zane

2008-03-12

一万条?这个数据量根本谈不上大,用perl或者直接awk搞个shell脚本,弄到crontab里每天晚上跑就不就完了,这种活java干起来烦

11 楼

pig345

2008-03-14

典型的系统维护任务,unix/linux下脚本该干的活儿。

12 楼

小蚯蚓

2008-03-14

想问一下楼主,将日志插到数据库的主要目的是什么?

如果是转化为相应的业务日志,提供给用户查询,那么就需要即时插到数据库,而不能缓存到一定量,一次性插入

现在我们的项目用的是AOP截取日志,扩展了JDBCAppender用连接池插入到数据库。

13 楼

duooluu

2008-03-17

与log4j无关了,日志是别的系统生成的

如果是自己的系统入库那就修改一下代码也不麻烦啊

问题可以简化成:给你一个10G的有一定格式的文件,怎样高效地提取每一行有用的数据然后入库

14 楼

leoyu

2008-03-18

class="org.apache.log4j.jdbc.JDBCAppender">

value="jdbc:mysql://192.168.0.14/ispc?useUnicode=true&characterEncoding=UTF-8" />

value="INSERT INTO log (level,msg,datetime) VALUES ( '%p', '%m','%d{yyyy-MM-dd HH:mm:ss}')" />

其中就是指定多少条缓冲日志写进数据库的,,比如你可以设置100条进数据库

15 楼

Sam1860

2008-03-18

个人觉得log4j写数据库对业务一点价值都没有,log4是整条信息作为一个字段插入,这样的信息查询不方便

有业务价值的log都应该自己定制数据表来插数据

16 楼

neuzhujf

2008-03-18

Sam1860 写道

个人觉得log4j写数据库对业务一点价值都没有,log4是整条信息作为一个字段插入,这样的信息查询不方便

有业务价值的log都应该自己定制数据表来插数据

可以扩展org.apache.log4j.AppenderSkeleton,实现自己的用于写DB的Appender

配置文件如下:

value="INSERT INTO log_tbl

VALUES (

TO_DATE('%d{yyyy-MM-dd HH:mm:ss}', 'YYYY-MM-DD HH24:MI:SS'),

'%t', '%-5p', '%m' )" />

17 楼

Sam1860

2008-03-18

neuzhujf 写道

Sam1860 写道

个人觉得log4j写数据库对业务一点价值都没有,log4是整条信息作为一个字段插入,这样的信息查询不方便

有业务价值的log都应该自己定制数据表来插数据

可以扩展org.apache.log4j.AppenderSkeleton,实现自己的用于写DB的Appender

配置文件如下:

value="INSERT INTO log_tbl

VALUES (

TO_DATE('%d{yyyy-MM-dd HH:mm:ss}', 'YYYY-MM-DD HH24:MI:SS'),

'%t', '%-5p', '%m' )" />

看不出你自己实现的这个appender跟默认的有什么区别。还是不能把业务信息分离。

假设在登陆接口中,要把登陆失败的人的ID,IP写入数据库, log4j能做吗?

// logger.warn(??);//你的方法中这里应该怎样写??

logger.warn(ID + "," + IP)//这样??,插进数据库时怎样把ID, IP分别插进2个字段?

自己写的appender再怎么改也只能拿个%m 啊

log4j中有个MDC也许可以做到分开插,但写一个LOG麻烦多少倍,倒不如自己插数据表

MDC.put("ID", ID);

MDC.put("IP", IP);

logger.warn("login failed");

18 楼

huanglppp

2008-04-26

日志插入数据库的话是为了方便维护人员来维护....可以直接从数据库查询,而不用去分析log日志了

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值