log4j日志保存数据库
1、不使用数据源
<appender name="DB_INFO" class="org.apache.log4j.jdbc.JDBCAppender"> <param name="Threshold" value="INFO"/> <param name="BufferSize" value="1"/> <param name="URL" value="jdbc:oracle:thin:@192.168.100.231:1522:mpptest"/> <param name="driver" value="oracle.jdbc.driver.OracleDriver"/> <param name="user" value="gmcc"/> <param name="password" value="skywin"/> <param name="sql" value="INSERT INTO RE_GLOBAL_LOG(currtime,currthread,currlevel,currcode,currmsg) VALUES ('%d{yyyy-MM-dd HH:mm:ss}', '%t', '%p', '%l', '%m')"/>
2、使用数据源jndi
扩展JDBCAppender
package com.trunkbow.ecode.log; import java.sql.Connection; import java.sql.SQLException; import javax.naming.Context; import javax.naming.InitialContext; import javax.naming.NamingException; import javax.sql.DataSource; import org.apache.log4j.jdbc.JDBCAppender; /** * log4j基于jndi数据源的Appender。 * @author wangjintao */ public class WebDSAppender extends JDBCAppender{ /** * jndi的标示 */ private String jndi; /** * 获取jndi查找标示 * @return */ public String getJndi() { return jndi; } private DataSource ds; /** * 设定jndi查找标示 * @param jndi */ public void setJndi(String jndi) { this.jndi = jndi; } /** * 返回数据库连接,如果能找到jndi数据源就返回从jndi数据源里获得的连接,否则直接返回连接 */ @Override protected Connection getConnection() throws SQLException { if(null==ds){ Context initContext; try { initContext = new InitialContext(); ds=(DataSource) initContext.lookup(jndi); } catch (NamingException e) { } } if (null!=ds) { Connection conn=ds.getConnection(); if (null!=conn) { return conn; } } return super.getConnection(); } /** * 关闭连接,如果不实现数据库连接就不释放。 */ @Override protected void closeConnection(Connection con) { try { if(null!=ds&&con!=null&&!con.isClosed()){ con.close(); } } catch (SQLException e) { e.printStackTrace(); } } }
配置log4j
<appender name="operation" class="com.trunkbow.ecode.log.WebDSAppender"> <param name="jndi" value="java:comp/env/jdbc/ecode"/> <param name="driver" value="oracle.jdbc.OracleDriver"/> <param name="URL" value="jdbc:oracle:thin:@195.203.56.36:1521:orcl"/> <param name="user" value="kcgl"/> <param name="password" value="kcgl"/> <param name="sql" value="INSERT INTO BASE_LOG_OPERATION(DBID,SESSION_ID,USER_ID,USER_NAME,ACCOUNT,DIRECT_IP,REAL_IP,CREATE_TIME,"LEVEL",CLASS_LOCATION,METHOD_LOCATION,LINE_LOCATION,CONTENT)VALUES(BASE_LOG_OPERATION_DBID_SEQ.NEXTVAL,'%X{sessionId}','%X{userId}','%X{userName}','%X{account}','%X{directIp}','%X{realIp}',TO_DATE('%d{yyyy-MM-dd HH:mm:ss}','YYYY-MM-DD HH24:MI:SS'),'%p','%c','%M','%L','%m')"/> </appender>