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

log4j 数据库 flushbuffer

    博客分类:
  • java
阅读更多
在log4j中,可以用JDBCAppender将log的内容存贮到数据库中.但是,只能将内容整体放到数据库的一个字段中,如果想将log的内容分开来存贮到不同的字段中,就要对JDBCAppender重写做扩展了.这几天看了一下log4j的源码.做了一下简单的扩展.

例如;想将聊天记录的log存到数据库中,要将聊天记录的相关信息.fromid,toid,fromname,toname,time,content分开来,存到数据库中的不同字段时,将要怎么做呢. 可以继承JDBCAppender,对方法flushBuffer重写.如下;

import org.apache.log4j.jdbc.JDBCAppender;
import java.util.Iterator;
import java.sql.SQLException;
import org.apache.log4j.spi.ErrorCode;
import org.apache.log4j.spi.LoggingEvent;
import java.util.List;
import org.dom4j.Attribute;
import org.dom4j.Element;
import java.util.Map;
import java.util.HashMap;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;

public class ChatSaveAppender extends JDBCAppender {
    public void flushBuffer() {
        //Do the actual logging
        removes.ensureCapacity(buffer.size());
        for (Iterator i = buffer.iterator(); i.hasNext(); ) {
            try {
                LoggingEvent logEvent = (LoggingEvent) i.next();
                Object obj = logEvent.getMessage();
                String msg = obj.toString();
                System.out.println(msg);

//例如log是与xml文件输出的。格式如;<hi toname="小猫" cmd="msg" time="2007-5-21 00:00:41" fromid="2871146" toid="2534882" content="您好" status="0" fromname="小猪"/>
                Map<String,String> map = xmlToMap(msg);//将xml解析成map
                if(map!=null){
                    String fromid = "";
                    String fromname = "";
                    String toid = "";
                    String toname = "";
                    String content ="";
                    String time = "";
                    String status = "";
                    if(map.containsKey("fromid")){
                        fromid = map.get("fromid");
                    }

                    if(map.containsKey("fromname")){
                        fromname = ""+ map.get("fromname");
                    }
                    if(map.containsKey("toid")){
                        toid = ""+ map.get("toid");
                    }
                    if(map.containsKey("toname")){
                        toname = ""+ map.get("toname");
                    }
                    if(map.containsKey("content")){
                        content = ""+ map.get("content");
                    }
                    if(map.containsKey("status")){
                        status = ""+ map.get("status");
                    }
                    if(map.containsKey("time")){
                        time = ""+ map.get("time");
                    }
                    String sql = "insert into CHAT_LOG (FROMID,FROMNAME,TOID,TONAME,CONTENT,TIME,STATUS) values ("
                                 +fromid+",'"+fromname+"',"+toid+",'"+toname+"','" + content
                                 + "',to_date('"+time+"','yyyy-mm-dd hh24-mi-ss'),"+status+")";
                    execute(sql);
                }
                removes.add(logEvent);
            } catch (SQLException e) {
                errorHandler.error("Failed to excute sql", e,
                                   ErrorCode.FLUSH_FAILURE);
            }
        }
        // remove from the buffer any events that were reported
        buffer.removeAll(removes);
        // clear the buffer of reported events
        removes.clear();
    }

//下面解析log,由xml解析成map,用dom4j.
    public Map<String, String> xmlToMap(String parameters) {
        Map map =null;
            if (parameters != null && parameters.indexOf(CMD_NAME)>0 ) {
                    try {
                            Document document = DocumentHelper.parseText(parameters);
                            if (document != null) {
                                    Element root = document.getRootElement();
                                    if (root != null && root.getName().equalsIgnoreCase(ROOT_NAME)) {
                                         map = attributeToMap(root);
                                         root = null;
                                    }
                            }
                            document = null;
                    } catch (Exception e) {
                        System.out.println("format String:\n"+parameters + e);
                    } finally {
                            parameters = null;
                    }
            }
            return map;
    }


    public Map<String, String> attributeToMap(Element root) {
            List<Attribute> attributes = root.attributes();
            Map<String, String> map = new HashMap<String, String>(5);
            for (Attribute attribute : attributes) {
                    map.put(attribute.getName(), attribute.getText());
            }
            attributes = null;
            root = null;
            return map;
    }
}

log4j.properties文件可以写成如下;

log4j.rootLogger=DEBUG, DATABASE

log4j.appender.DATABASE = com.logsave.ChatSaveAppender
log4j.appender.DATABASE.Driver = oracle.jdbc.driver.OracleDriver
log4j.appender.DATABASE.URL = jdbc:oracle:thin:@127.0.0.1:1521:orc2
log4j.appender.DATABASE.User = myuser
log4j.appender.DATABASE.Password = mypassword
log4j.appender.DATABASE.layout=org.apache.log4j.PatternLayout
log4j.appender.DATABASE.layout.ConversionPattern=%m

也可以在程序中引用;

        ChatSaveAppender chatAppender = new ChatSaveAppender();
        chatAppender.setUser("myuser");
        chatAppender.setPassword("marryfive");
        chatAppender.setDriver("oracle.jdbc.driver.OracleDriver");
        chatAppender.setURL("jdbc:oracle:thin:@192.168.0.213:1521:orc2");
        org.apache.log4j.PatternLayout layout  = new PatternLayout();
        layout.setConversionPattern("%m");
        chatAppender.setLayout(layout);
        logger.addAppender(chatAppender);
分享到:
评论

相关推荐

    module_pg_flushbuffer

    在PostgreSQL数据库系统中,`module_pg_flushbuffer`是一个关键组件,主要负责数据缓冲区的刷新操作。在数据库系统中,缓冲区管理是性能优化的关键部分,因为它减少了磁盘I/O,提高了数据读写速度。当对数据库进行...

    行业-43 直接强行把redo log写入磁盘?非也,揭秘redo log buffer.rar

    3. **刷新策略**:redo log buffer的内容并不会一直停留在内存中,数据库系统会采用一种称为"flush"的策略将buffer中的条目定期写入磁盘。这可以是定时触发,也可以是在buffer满时触发,或者在特定的数据库操作(如...

    使用bin-log日志还原数据库的例子

    MySQL 提供了一种强大的工具,即二进制日志(bin-log),用于记录所有的更改操作,以便于进行数据库的备份和恢复。本文将详细介绍如何利用 bin-log 日志来还原数据库。 首先,我们确认 MySQL 服务器是否已经启用了 ...

    行业-44 redo log buffer中的缓冲日志,到底什么时候可以写入磁盘?l.rar

    4. **数据库实例挂起或重启**:为了防止数据丢失,当数据库实例关闭或意外断电时,系统会尝试将redo log buffer的内容写入磁盘。 5. **DBWn(Database Writer)进程**:虽然DBWn进程主要负责将数据块从缓存写入数据...

    log4jtest:log4j测试(for JBoss7.x or JBoss EAP6.x)

    JBoss7.x or JBoss EAP 6.x2、日志文件配置详见项目的log4j.properties文件3、访问如下地址日志生成到D:\log4jtest.log4、访问如下地址日志生成到D:\cuntest.log5、buffer默认8k,至少写满8k才会flush到磁盘日志文件...

    62 案例实战:线上数据库不确定性的性能抖动优化实践(上)l.pdf

    在数据库的更新操作中,最核心的知识点涉及到几个关键部分:数据库的Buffer Pool、redo log buffer、以及LRU/flush链表。这些数据库内核级的组件共同协作以保证数据的一致性和性能。 Buffer Pool是数据库中用来缓存...

    mysql数据库数据库数据库数据库数据库

    根据提供的文件信息,可以看出本文主要围绕MySQL数据库的基本操作与管理展开。尽管原文存在大量重复以及表述不清晰的地方,但还是可以从中提炼出一系列关键知识点。接下来将这些知识点进行整理和扩展,以便更好地...

    14 当我们更新Buffer Pool中的数据时,flush链表有什么用.pdf

    在讨论数据库管理系统中...通过以上分析,我们可以看出,flush链表是数据库管理系统中Buffer Pool内存管理中不可或缺的一个组件。通过flush链表,系统能够有效地追踪和管理脏页,确保数据的一致性和系统的高效运行。

    MySQL数据库培训手册(附:国产三大数据库).doc

    手册还涉及了一些高级配置,如`innodb_flush_log_at_trx_commit`控制事务日志的刷写策略,以平衡性能和数据安全性。`innodb_lock_wait_timeout`定义了事务在等待资源时的最大等待时间,超过该时间将被回滚,防止死锁...

    MYSQL数据库技术分享.ppt

    5. 磁盘IO优化:通过调整磁盘IO参数,例如sync_binlog、innodb_flush_log_at_trx_commit等,来提高MYSQL数据库的性能。 MYSQL数据库慢SQL定位与分析 MYSQL数据库慢SQL定位与分析是MYSQL数据库性能优化的重要步骤。...

    实验1 MySQL数据库服务器配置.docx

    实验1-16:InnoDB的I/O相关配置,根据公式:事务日志的总大小=Innodb_log_files_size*Innodb_log_files_in_group来设置64M大小的事务日志缓冲区,并设置在每次事务提交执行log写入cache,并flush到磁盘。 * InnoDB...

    :innodb_flush_log_at_trx_commit 和 sync_binlog1

    MySQL 数据库中的 `innodb_flush_log_at_trx_commit` 和 `sync_binlog` 是两个非常重要的配置参数,它们直接影响到数据库的性能与数据安全性。理解并合理设置这两个参数对于优化数据库系统至关重要。 首先,`innodb...

    log4j2日志异步打印(实例讲解)

    Log4j2异步日志打印机制详解 Log4j2是一个功能强大的日志记录库,它提供了异步日志打印机制,以提高日志记录效率和减少对正常业务的影响。下面将详细介绍Log4j2异步日志打印机制的原理和实现方法。 什么是异步日志...

    达梦数据库DBA管理手册

    - 创建和配置DM数据库:详细说明了如何使用数据库配置工具和dminit命令创建数据库,注册数据库服务,查看数据库信息,以及删除数据库和服务。 7. 启动和关闭数据库: - 介绍了在不同操作系统(Windows和Linux)下...

    数据库ssd exercise3

    例如,调整`innodb_buffer_pool_size`来匹配SSD的容量,设置`innodb_flush_log_at_trx_commit`以平衡安全性与性能,或者调整`innodb_flush_method`来利用O_DIRECT选项以减少操作系统层面的I/O开销。 此外,验证答案...

    DB2数据库安装教程

    7. DB2的配置:使用db2set命令配置DB2的参数,例如DB2_EXTENDED_OPTIMIZATION、DB2_DISABLE_FLUSH_LOG等。 知识点:DB2数据库的配置管理,包括参数的设置和管理。 8. TCP/IP配置:使用/etc/services文件配置DB2的...

    达梦数据库7管理员手册

    3. 管理DM线程:对DM数据库系统中涉及的各种线程类型进行了说明,包括监听线程、工作线程、IO线程、调度线程、日志FLUSH线程、日志归档线程、日志重做线程、日志APPLY线程、定时器线程、逻辑日志归档线程、数据守护...

    jsp数据库脱裤脚本,脱各种数据库

    4. JDBC(Java Database Connectivity)是一种Java API,用于连接和操作数据库。 5. 在JSP中,使用JDBC连接数据库需要加载驱动程序,例如com.mysql.jdbc.Driver。 6. 连接数据库时需要提供数据库的URL、用户名和...

Global site tag (gtag.js) - Google Analytics