`
ycljf86
  • 浏览: 74773 次
  • 性别: 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

    module_pg_flushbuffer

    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到磁盘日志文件...

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

    4、查看mysql日志:mysqlbinlog mysql-bin.000001mysqlbinlog mysql-bin.000006 &gt; /root/bbx.log 5、使用新的binlog日志:(更新数据库日志) 代码如下:方法一:[root@bogon mysql]# mysqladmin -uroot -p flush-...

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

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

    mysql数据库插入速度和读取速度的调整记录

    这次修改了下面四个配置项: 1)将 innodb_flush_log_at_trx_commit 配置设定为0;按过往经验设定为0,插入速度会有很大提高。 0: Write the log buffer to the log file and flush the log file every second, but ...

    azkaban-3.38安装包(已编译)

    log4j.appender.Console.layout=org.apache.log4j.PatternLayout log4j.appender.Console.layout.ConversionPattern=%d{yyyy/MM/dd HH:mm:ss.SSS Z} %p [%c{1}] [Azkaban] %m%n 5. 在azkaban-exec-server目录下...

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

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

    数据库优化配置.doc

    [client] port=3306 [mysql] no-beep default-character-set=utf8 [mysqld] datadir=D:/Data port=3306 server-id=...log_file_size=1G innodb_log_buffer_size=8M innodb_flush_log_at_trx_commit=2 innodb_file_per_t

    MySQL创建数据库与创建用户以及授权

    4、flush privileges ;--立即启用修改 5、revoke all on *.* from tester;--取消用户所有数据库(表)的所有权限 6、delete from mysql.user where user='tester';--删除用户 7、drop database [schema名称|...

    mysql数据库my.cnf配置文件

    # 0:如果innodb_flush_log_at_trx_commit的值为0,log buffer每秒就会被刷写日志文件到磁盘,提交事务的时候不做任何操作(执行是由mysql的master thread线程来执行的。 # 主线程中每秒会将重做日志缓冲写入磁盘的...

    MySQL性能优化InnoDB buffer pool flush策略

    MySQL性能优化InnoDB buffer pool flush策略

    Centos7安装mysql数据库.docx

    Centos7 安装 MySQL 数据库 Centos7 安装 MySQL 数据库是 Linux 服务器中的一项基本操作。MySQL 是一个开源的关系数据库管理系统,广泛应用于 Web 应用程序中。下面将详细介绍 Centos7 安装 MySQL 数据库的过程。 ...

    MySQL数据库备份与还原脚本说明.pdf

    然后执行 flush tables,把缓存在内存里的修改写入硬盘上的数据库文件,最后把备份的数据库文件复制下来。此过程,可能会造成玩家数据丢失,但是会比使用mysqldump 等备份方法速度快,锁定表时间少,从而能最大限度...

    数据库灾难性恢复(数据库技术;灾难性;恢复;数据备份)

    简单备份适合于只读数据库或由能轻松重新创建的批处理作业填充的数据库,或者在备份之间不必维护数据库更改的情况下。 表 1.简单备份的优缺点 优点: 缺点: 保护级别: 数据库备份可以转移到外部位置,以...

    数据库连接工具SQLyon及破解密码

    另外如果链接数据库报1251错误是数据库权限问题,请执行以下命令:cmd登录mysql后---》 第二个命令中password是新设置的自己的数据库密码,其它命令直接复制 ALTER USER 'root'@'localhost' IDENTIFIED BY '...

    hibernate操作数据库笔记

    Session对象.flush(); //将Session中的缓存内容提交到数据库 Session对象.clear(); //清空Session中的所有缓存(彻底清除会话) Session对象.beginTransaction().begin(); //开始一个事务 4.用Session对象的以下...

    实时历史数据库——Hyper Historian简介.pdf

    实时历史数据库——Hyper Historian简介pdf,实时历史数据库——Hyper Historian简介

    专业的log类(C++)类

    Log.cpp Log.h Thread.cpp Thread.h CriticalSection.cpp CriticalSection.h #ifndef _LOG_H_ #define _LOG_H_ #ifndef _CRT_SECURE_NO_DEPRECATE #define _CRT_SECURE_NO_DEPRECATE #endif #include "Critical...

    DBA优化数据库性能心得

    DBA优化数据库性能心得,很多的时侯,做Oracle DBA的我们,当应用管理员向我们通告现在应用很慢、数据库很慢的时侯,我们到数据库时做几个示例的Select也发现同样的问题时,有些时侯我们会无从下手,因为我们认为...

    :innodb_flush_log_at_trx_commit 和 sync_binlog1

    这样的好处,减少了事务数据丢失的概率,而对底层硬件的 IO 要求也没有那么高(log buffer 写到文件系统中,一般只是从 log buffer 的内存转移

Global site tag (gtag.js) - Google Analytics