`
huanglppp
  • 浏览: 64683 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

解析日志文件插入数据库(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 ***
   


   每一行对应数据库的一条记录,因为每天会产生上万条日志记录,怎样设计才能获得高性能.如果读一条,插入一条的话,速度太慢了.
   请各位指点迷津,有没有别的好的设计(高性能)或用有的框架.谢谢
分享到:
评论
18 楼 huanglppp 2008-04-26  
日志插入数据库的话是为了方便维护人员来维护....可以直接从数据库查询,而不用去分析log日志了
17 楼 Sam1860 2008-03-18  
neuzhujf 写道
Sam1860 写道
个人觉得log4j写数据库对业务一点价值都没有,log4是整条信息作为一个字段插入,这样的信息查询不方便
有业务价值的log都应该自己定制数据表来插数据


可以扩展org.apache.log4j.AppenderSkeleton,实现自己的用于写DB的Appender
配置文件如下:
        <writer name="db" class="DBWriter">
            <formatter name="pattern" class="PatternFormatter">
               <param name="pattern" 
                      value="INSERT INTO log_tbl 
                             VALUES (
                               TO_DATE('%d{yyyy-MM-dd HH:mm:ss}', 'YYYY-MM-DD HH24:MI:SS'), 
                               '%t', '%-5p', '%m' )" />
            </formatter>
            <param name="resource-ref" value="java:comp/env/jdbc/datasource" />
        </writer>



看不出你自己实现的这个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");
16 楼 neuzhujf 2008-03-18  
Sam1860 写道
个人觉得log4j写数据库对业务一点价值都没有,log4是整条信息作为一个字段插入,这样的信息查询不方便
有业务价值的log都应该自己定制数据表来插数据


可以扩展org.apache.log4j.AppenderSkeleton,实现自己的用于写DB的Appender
配置文件如下:
        <writer name="db" class="DBWriter">
            <formatter name="pattern" class="PatternFormatter">
               <param name="pattern" 
                      value="INSERT INTO log_tbl 
                             VALUES (
                               TO_DATE('%d{yyyy-MM-dd HH:mm:ss}', 'YYYY-MM-DD HH24:MI:SS'), 
                               '%t', '%-5p', '%m' )" />
            </formatter>
            <param name="resource-ref" value="java:comp/env/jdbc/datasource" />
        </writer>


15 楼 Sam1860 2008-03-18  
个人觉得log4j写数据库对业务一点价值都没有,log4是整条信息作为一个字段插入,这样的信息查询不方便
有业务价值的log都应该自己定制数据表来插数据
14 楼 leoyu 2008-03-18  
<appender name="database"
class="org.apache.log4j.jdbc.JDBCAppender">
<param name="BufferSize" value="5" />
<param name="Driver" value="com.mysql.jdbc.Driver" />
<param name="URL"
value="jdbc:mysql://192.168.0.14/ispc?useUnicode=true&amp;characterEncoding=UTF-8" />
<param name="User" value="root" />
<param name="Password" value="admin" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern"
value="INSERT INTO log (level,msg,datetime) VALUES ( '%p', '%m','%d{yyyy-MM-dd HH:mm:ss}')" />
</layout>
<filter class="org.apache.log4j.varia.LevelRangeFilter">
<param name="levelMin" value="WARN" />
<param name="levelMax" value="WARN" />
<param name="acceptOnMatch" value="false" />
</filter>
</appender>

其中 <param name="BufferSize" value="5" />就是指定多少条缓冲日志写进数据库的,,比如你可以设置100条进数据库
13 楼 duooluu 2008-03-17  
与log4j无关了,日志是别的系统生成的
如果是自己的系统入库那就修改一下代码也不麻烦啊
问题可以简化成:给你一个10G的有一定格式的文件,怎样高效地提取每一行有用的数据然后入库
12 楼 小蚯蚓 2008-03-14  
想问一下楼主,将日志插到数据库的主要目的是什么?
如果是转化为相应的业务日志,提供给用户查询,那么就需要即时插到数据库,而不能缓存到一定量,一次性插入
现在我们的项目用的是AOP截取日志,扩展了JDBCAppender用连接池插入到数据库。
11 楼 pig345 2008-03-14  
典型的系统维护任务,unix/linux下脚本该干的活儿。
10 楼 dennis_zane 2008-03-12  
一万条?这个数据量根本谈不上大,用perl或者直接awk搞个shell脚本,弄到crontab里每天晚上跑就不就完了,这种活java干起来烦
9 楼 helloboy9527 2008-03-12  
perl,awk,load data,这种数据量还不算大,亿条日志都不成问题。
8 楼 pickerel 2008-03-11  
一天上万条的数据量一点也不大啊。

10G倒是不小。

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

如果不用数据库本省的解决方案,那可以用jdbc的executeBatch,当然效率也不见得能提供很多,使用jdbc的时候注意:
1.不用在操作过程频繁打开关闭连接,一个连接开了,尽量就一直用下去。
2.去除表索引。
3.多线程处理,每个线程用单独的数据库连接。
4.分表或者多个线程同时向多个数据库服务器插入,以后再想办法合并处理。
7 楼 idragon 2008-03-11  
Log4J本身支持将日志异步写入数据库。参考SpringSide的文章:http://wiki.springside.org.cn/display/springside/Log4j
6 楼 LifeFree 2008-03-11  
log4j本身就支持写入数据库中,只是一个配置的问题。
关键是有必要把大把大把的数据写入数据库吗?
5 楼 huanglppp 2008-03-11  
夜间了,只是想,性能上能有很大的突破,能否给出实例
4 楼 二十一 2008-03-10  
mq也可以实现啊,反正就是异步了
3 楼 neuzhujf 2008-03-10  
可以用异步的log,就是把log输出交给其他线程来做,log4j有这样的功能。
要不做个缓存,比如把1000条log数据放到list中,然后一次DB连接,把所有的纪录插入到DB中。

上面两个方法可以结合
2 楼 crofton 2008-03-10  
为何要插入数据库?
1 楼 duooluu 2008-03-10  
同问,用户一天产生10G左右的日志文件
要求入库,头大了

相关推荐

    java数据库设计技巧

    - **存储设备**:选择高性能的存储设备,如SSD固态硬盘,可以显著提升I/O性能。 - **内存配置**:增加服务器内存可以减少磁盘I/O操作,提高查询速度。 2. **操作系统设置**: - **文件系统**:选用适合数据库...

    数据库日志操作相关信息

    - **性能优化**:通过分析日志,可以发现数据库的瓶颈,优化查询性能。 2. **日志类型**: - **重做日志(Redo Log)**:记录事务的修改操作,用于在系统崩溃后重新执行这些操作以恢复数据。 - **回滚日志(Undo...

    基于java开发的、高性能的、基于解析mysql row base binlog技术实现.zip

    Java开发的MySQL Row Base Binlog技术实现是一种高效的数据同步和备份解决方案,它通过解析MySQL的日志格式,特别是Row Format的binlog(二进制日志),来实现实时的数据复制和处理。以下是对这一技术的详细说明: ...

    java数据库连接池.rar

    Druid支持SQL解析,可以统计SQL执行的耗时,帮助优化数据库性能。此外,Druid还有防止SQL注入的功能,增强了系统的安全性。 JDBC模板(JdbcTemplate)是Spring框架的一部分,它为JDBC操作提供了简单的抽象和统一的...

    SpringBootMybatis+poi+Thymeleaf实现excel文件数据导入到数据库以及从数据库将数据导出成excel.zip

    在本项目中,"SpringBootMybatis+poi+Thymeleaf实现excel文件数据导入到数据库以及从数据库将数据导出成excel.zip",我们主要关注的是如何利用Java技术栈来处理Excel文件,并与数据库进行交互。以下是相关知识点的...

    针对timesten 内存数据库的java开发手册【pdf】

    了解如何监控Timesten数据库的性能和活动,以及如何配置和解析日志文件,对于诊断问题和优化系统至关重要。 总之,《针对Timesten内存数据库的Java开发手册》是一本全面的指南,涵盖了从基本的数据库连接到高级的...

    Java数据库手工和execl导入操作

    在程序中,开发者需要解析Excel文件,将每一行数据转换为数据库的插入语句,然后执行这些语句。 为了提高效率,可以使用批处理操作,即将多条SQL插入语句组合在一起,然后一次性执行。这在处理大量数据时能显著减少...

    SpringBoot使用mybatis批量新增500万数据到mysql数据库Demo

    - **禁用日志**:在执行大量数据操作时,关闭Mybatis的日志输出可以显著提升性能。 - **使用PreparedStatement**:预编译的SQL语句,可以减少SQL解析时间,提高效率。 - **数据库配置**:调整MySQL的配置,如增大...

    Java面试解析总结:Java+Redis+数据库+解决方案+分布式...docx

    ### Java面试解析总结 #### 数据库篇 - **事务四大特性(ACID)**:事务在数据库操作中扮演着至关重要的角色,确保数据的一致性和完整性。ACID特性包括: - **原子性(Atomicity)**:表示事务中的所有操作要么...

    boot项目审计日志功能ideal源码

    Spring Boot作为流行的Java微服务框架,结合MySQL数据库,可以构建出高效的审计日志功能。本篇将深入探讨"boot项目审计日志功能ideal源码",并解析其中的关键技术和实现方式。 首先,审计日志的主要目的是记录系统...

    java的Logback日志框架jar包

    Logback是作为log4j的替代品设计的,它提供了更高的性能和更多的特性。这个压缩包包含了Logback框架的核心组件以及相关的依赖。 1. **logback-core-1.2.3.jar**: 这是Logback框架的基础模块,它包含了日志处理的...

    第五章 Java代码解析shape压缩包上传

    综上所述,"第五章 Java代码解析shape压缩包上传"是一个涵盖文件操作、数据库交互、数据解析、多线程、异常处理、日志记录和性能优化等多个方面的综合性编程任务。理解并熟练掌握这些知识点,对提升Java开发者处理...

    人力资源管理系统(JAVA源码+数据库sql+论文)

    【标题解析】 "人力资源管理系统"是一个...这个资源包对于学习Java Web开发、人力资源管理系统的实现,或是数据库设计和管理都具有很高的参考价值。通过研究源码和论文,可以深入了解实际项目中的开发流程和技术应用。

    java性能优化集锦

    二、Java高性能系统常见设计与优化 这部分资料可能涵盖系统架构设计、网络优化、数据库优化等方面,包括但不限于: 1. **负载均衡**:通过负载均衡器分散请求,提高系统可用性和响应速度。 2. **缓存策略**:使用...

    java高并发秒杀系统

    在构建Java高并发秒杀系统时,我们通常会利用一系列技术和设计原则来确保系统的稳定性和高效性。这个系统采用的技术栈包括SpringMVC、Maven、MySQL以及Spring和MyBatis,这些都是Java开发中的核心组件。 **...

    Java读取XML文件内容存储到MySQL

    在Java中,我们可以使用DOM、SAX或StaX等API来解析XML文件。这里以常用的DOM解析为例,使用`javax.xml.parsers.DocumentBuilderFactory`和`org.w3c.dom.Document`进行解析。 ```java import javax.xml.parsers....

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

    MySQL是一种广泛使用的开源关系型数据库管理系统,具有高性能、高可靠性以及易于维护的特点。在Android应用中,通常通过远程服务器来连接MySQL,而不是直接在设备上运行数据库。连接过程涉及设置服务器地址、数据库...

    Java_Apache Doris是一个易于使用的高性能和统一的分析数据库.zip

    Java_Apache Doris是一个专为在线分析处理(OLAP)设计的易用性高、性能卓越且统一的分析数据库。它旨在提供快速的数据查询能力,以支持业务决策和数据科学应用。Apache Doris的核心特性包括列式存储、快速查询、...

    Druid数据库连接池

    Druid是阿里巴巴开源的一款高性能、高质量的Java数据库连接池组件,它的全称是Druid Data Source。作为一个优秀的数据库连接池,Druid提供了许多强大的功能,如监控、SQL解析、参数绑定优化等,为开发人员提供了一套...

    基于java与阿里云RDS数据库对于天天基金网上的基金公告进行爬取与查询.zip

    其次,阿里云RDS是一种云托管的数据库服务,提供高性能、高可用性和易于管理的MySQL、PostgreSQL或SQL Server数据库实例。开发者将爬取到的基金公告数据存储在RDS中,便于后续的查询和分析。在实际操作中,开发者...

Global site tag (gtag.js) - Google Analytics