|
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的那个接口了.要加几个字段,可以根据自己需要再扩展
|