log4j 自定义存储到数据库中

来源:互联网 发布:神作剧情av番号 知乎 编辑:程序博客网 时间:2024/06/06 18:19

log4j写数据库,如果用hiberate,struts等,会写入很多没用的信息,而且通常只能写入五个字段,对用户来说没什么意义,如果用来记录用户登录,操作等的记录,一个message字段是不够的.

       这里,我在log4j里加了两个字段user ,type(当然你可以再加几个)用来记录用户登录,操作.下面是扩展类.

import org.apache.log4j.jdbc.JDBCAppender;
import java.sql.SQLException;
import java.util.Iterator;

import org.apache.log4j.Logger;
import org.apache.log4j.spi.ErrorCode;
import org.apache.log4j.spi.LoggingEvent;

public class ExtendsLog4j extends JDBCAppender {
public String FormatSql(String s)
        {
        
                int i = 0,j=0,k=0;
                String s1="",s2="",s3="",s4="",s5="",s6="",s7="";

//                获取类型这个值
                if (s.indexOf("type=")<0   || s.indexOf("XML")>0)  
                {
                        return "";
                }
                try{
                        
//                        取出MESSAGE
                        
                        i = s.indexOf(")");
                        j = s.indexOf("(",i);
                        s1 =s.substring(0,j+1);
                        k = s.indexOf(",",j);
                        s5 = s.substring(j+3,k-1);  //s5存放MESSAGE  
                        s7=s5.replaceAll("'","");
                

                        j = s7.indexOf("type=");
                        if (j<0)
                                return s;
                        k =  s7.indexOf(" ");
                        s3 = s7.substring(j+5,k);   //s3存放TYPE
                        
                        //type一定要的,user有可能为空
                        
                        j = s7.indexOf("user=");
                        if ( j>0 )
                        {
                                k = s7.indexOf(" ",j);
                                s4 = s7.substring(j+5,k);  //s4存放user
                                s6 = s7.substring(k,s5.length()); //s6存放MESSAGE
                        }
                        else
                        {
                                s4="";
                                s6 = s7.substring(k,s5.length());
                        }
                        s = s.replaceFirst(s5,s3);
                        s = s.replaceFirst(s5,s4);
                        s = s.replaceFirst(s5,s6);
                }
                catch(Exception e )
                {
                        return "";
                }
                return s;
        }
        
        
        public void flushBuffer() {
                
        
                //Do the actual logging
                removes.ensureCapacity(buffer.size());
                for (Iterator i = buffer.iterator(); i.hasNext();) {
                        try {
                                LoggingEvent logEvent = (LoggingEvent)i.next();
                                
                                String sql = getLogStatement(logEvent);
                                
                                sql = FormatSql(sql);
                                
                                if (!sql.equals(""))  
                                {
                                        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();
        }
        
        public static void main(String[] args) {
                // TODO Auto-generated method stub
                ExtendsLog4j extendsLog4j = new ExtendsLog4j();
                
                Logger logger = Logger.getLogger("this.getMessage()");
                logger.info("uuuuuuuuuuuuuuuuu");  //不会插入数据库的
                     logger.info("type=sfdf user=pp jjjjjjjjjjjjjjjjj"); //写入数据库 ,users可以不写.

        }
        
}


log4j文件

log4j.rootLogger=INFO, A1,A2

# A1 is set to be a ConsoleAppender which outputs to System.out.
log4j.appender.A1=org.apache.log4j.ConsoleAppender

# A1 uses PatternLayout.
log4j.appender.A1.layout=org.apache.log4j.PatternLayout

# The conversion pattern uses format specifiers. You might want to
# change the pattern an watch the output format change.
log4j.appender.A1.layout.ConversionPattern=%-4r %-5p [%t] %37c %3x - %m%n
#11? ??A2??????
log4j.appender.A2 = ExtendsLog4j
log4j.appender.A2.BufferSize = 1
log4j.appender.A2.Driver = oracle.jdbc.driver.OracleDriver
log4j.appender.A2.URL = jdbc:oracle:thin:@192.68.69.61:1521:www
log4j.appender.A2.User = qyhl
log4j.appender.A2.Password = qyhl
log4j.appender.A2.layout = org.apache.log4j.PatternLayout
log4j.appender.A2.layout.ConversionPattern = INSERT INTO log4j (type,username,createDate, thread, priority, category, message) values( '%m','%m',Sysdate, '%t', '%-5p', '%c', '%m')


现在写数据库,继承的是ExtendsLog4j类,不是JDBC的那个接口了.要加几个字段,可以根据自己需要再扩展
原创粉丝点击