log4j输出到文件和数据库_第1页
log4j输出到文件和数据库_第2页
log4j输出到文件和数据库_第3页
log4j输出到文件和数据库_第4页
log4j输出到文件和数据库_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

log4j 输出到文件和数据库控制台的实现就不说了,这里提供两种实例的配置,一种是输出为文件的(每天输出一个文件) ,一种为输出到数据库的配置。1、输出到文件:Properties 代码 log4j.rootCategory=WARN, CONSOLE, FILE .surfilter.bt=FATAL,TOFILE log4j.appender.TOFILE=org.apache.log4j.DailyRollingFileAppender log4j.appender.TOFILE.Threshold=FATAL log4j.appender.TOFILE.File=E:/javascpace/bt/logs/union.html log4j.appender.TOFILE.Append=true log4j.appender.TOFILE.ImmediateFlush=true log4j.appender.TOFILE.DatePattern=.yyyy-MM-dd.html log4j.appender.TOFILE.layout=com.surfilter.bt.util.FormatHTMLLayout log4j.rootCategory=WARN, CONSOLE, FILE.surfilter.bt=FATAL,TOFILElog4j.appender.TOFILE=org.apache.log4j.DailyRollingFileAppenderlog4j.appender.TOFILE.Threshold=FATALlog4j.appender.TOFILE.File=E:/javascpace/bt/logs/union.htmllog4j.appender.TOFILE.Append=truelog4j.appender.TOFILE.ImmediateFlush=truelog4j.appender.TOFILE.DatePattern=.yyyy-MM-dd.htmllog4j.appender.TOFILE.layout=com.surfilter.bt.util.FormatHTMLLayout 这里的 com.surfilter.bt.util.FormatHTMLLayout 是重写了 log4j 提供的 HTMLLayout 类,具体代码如下:Java 代码 import java.text.SimpleDateFormat; import java.util.Map; import org.apache.log4j.HTMLLayout; import org.apache.log4j.Layout; import org.apache.log4j.Level; import org.apache.log4j.helpers.Transform; import org.apache.log4j.spi.LocationInfo; import org.apache.log4j.spi.LoggingEvent; import com.opensymphony.xwork2.ActionContext; import com.surfilter.core.Constants; import com.surfilter.security.domain.User; public class FormatHTMLLayout extends HTMLLayout public FormatHTMLLayout() protected final int BUF_SIZE = 256; protected final int MAX_CAPACITY = 1024; static String TRACE_PREFIX = “ “; / output buffer appended to when format() is invoked private StringBuffer sbuf = new StringBuffer(BUF_SIZE); String title=“系统操作日志 “; /* * A string constant used in naming the option for setting the the HTML * document title. Current value of this string constant is Title. */ public static final String TITLE_OPTION = “Title“; / Print no location info by default boolean locationInfo = true; public String format(LoggingEvent event) if (sbuf.capacity() MAX_CAPACITY) sbuf = new StringBuffer(BUF_SIZE); else sbuf.setLength(0); sbuf.append(Layout.LINE_SEP + “ + Layout.LINE_SEP); /* sbuf.append(“); sbuf.append(String.valueOf(i); sbuf.append(“ + Layout.LINE_SEP); */ sbuf.append(“); sbuf.append(new SimpleDateFormat(“yyyy-MM-dd HH:mm:ss“).format(new java.util.Date(); sbuf.append(“ + Layout.LINE_SEP); /* String escapedThread = Transform.escapeTags(event.getThreadName(); sbuf.append(“); sbuf.append(escapedThread); sbuf.append(“ + Layout.LINE_SEP); */ sbuf.append(“); if (event.getLevel().equals(Level.FATAL) sbuf.append(“); sbuf.append(Transform.escapeTags(String.valueOf(event.getLevel(); sbuf.append(“); else if (event.getLevel().isGreaterOrEqual(Level.WARN) sbuf.append(“); sbuf.append(Transform.escapeTags(String.valueOf(event.getLevel(); sbuf.append(“); else sbuf.append(Transform.escapeTags(String.valueOf(event.getLevel(); sbuf.append(“ + Layout.LINE_SEP); /* String escapedLogger = Transform.escapeTags(event.getLoggerName().substring(event.getLoggerName().lastIndexOf(“.“); sbuf.append(“); sbuf.append(escapedLogger); sbuf.append(“ + Layout.LINE_SEP); */ if (locationInfo) LocationInfo locInfo = event.getLocationInformation(); sbuf.append(“); sbuf.append(Transform.escapeTags(locInfo.getFileName(); sbuf.append(:); sbuf.append(locInfo.getLineNumber(); sbuf.append(“ + Layout.LINE_SEP); Map session = ActionContext.getContext().getSession(); if(session!=null) User user = (User) session.get(Constants.USER_IN_SESSION); sbuf.append(“+user.getName()+“); else sbuf.append(“ “); sbuf.append(“); sbuf.append(Transform.escapeTags(event.getRenderedMessage(); sbuf.append(“ + Layout.LINE_SEP); sbuf.append(“ + Layout.LINE_SEP); if (event.getNDC() != null) sbuf.append(“); sbuf.append(“NDC: “ + Transform.escapeTags(event.getNDC(); sbuf.append(“ + Layout.LINE_SEP); String s = event.getThrowableStrRep(); if (s != null) sbuf.append(“); appendThrowableAsHTML(s, sbuf); sbuf.append(“ + Layout.LINE_SEP); return sbuf.toString(); private void appendThrowableAsHTML(String s, StringBuffer sbuf) if (s != null) int len = s.length; if (len = 0) return; sbuf.append(Transform.escapeTags(s0); sbuf.append(Layout.LINE_SEP); for (int i = 1; i “ + Layout.LINE_SEP); sbuf.append(“ + Layout.LINE_SEP); sbuf.append(“ + Layout.LINE_SEP); / sbuf.append(“); sbuf.append(“ + title + “ + Layout.LINE_SEP); sbuf.append(“ + Layout.LINE_SEP); sbuf.append(“ + Layout.LINE_SEP); sbuf.append(“ + Layout.LINE_SEP); sbuf.append(“ + Layout.LINE_SEP); sbuf.append(“ + Layout.LINE_SEP); / sbuf.append(“ + Layout.LINE_SEP); / sbuf.append(“Log session start time “ + new SimpleDateFormat(“yyyy-MM-dd hh:mm:ss“).format(new java.util.Date() + “ + Layout.LINE_SEP); / sbuf.append(“ + Layout.LINE_SEP); sbuf.append(“ + Layout.LINE_SEP); sbuf.append(“ + Layout.LINE_SEP); / sbuf.append(“序列“ + Layout.LINE_SEP); sbuf.append(“执行时间 “ + Layout.LINE_SEP); sbuf.append(“级别 “ + Layout.LINE_SEP); / sbuf.append(“所在类“ + Layout.LINE_SEP); if (locationInfo) sbuf.append(“所在行“ + Layout.LINE_SEP); sbuf.append(“操作人 “); sbuf.append(“信息 “ + Layout.LINE_SEP); sbuf.append(“ + Layout.LINE_SEP); sbuf.append(“ + Layout.LINE_SEP); return sbuf.toString(); import java.text.SimpleDateFormat;import java.util.Map;import org.apache.log4j.HTMLLayout;import org.apache.log4j.Layout;import org.apache.log4j.Level;import org.apache.log4j.helpers.Transform;import org.apache.log4j.spi.LocationInfo;import org.apache.log4j.spi.LoggingEvent;import com.opensymphony.xwork2.ActionContext;import com.surfilter.core.Constants;import com.surfilter.security.domain.User;public class FormatHTMLLayout extends HTMLLayout public FormatHTMLLayout() protected final int BUF_SIZE = 256;protected final int MAX_CAPACITY = 1024;static String TRACE_PREFIX = “ “;/ output buffer appended to when format() is invokedprivate StringBuffer sbuf = new StringBuffer(BUF_SIZE);String title=“系统操作日志 “;/* A string constant used in naming the option for setting the the HTML* document title. Current value of this string constant is Title.*/public static final String TITLE_OPTION = “Title“;/ Print no location info by defaultboolean locationInfo = true;public String format(LoggingEvent event) if (sbuf.capacity() MAX_CAPACITY) sbuf = new StringBuffer(BUF_SIZE); else sbuf.setLength(0);sbuf.append(Layout.LINE_SEP + “ + Layout.LINE_SEP);/* sbuf.append(“);sbuf.append(String.valueOf(i);sbuf.append(“ + Layout.LINE_SEP);*/sbuf.append(“);sbuf.append(new SimpleDateFormat(“yyyy-MM-dd HH:mm:ss“).format(new java.util.Date();sbuf.append(“ + Layout.LINE_SEP);/* String escapedThread = Transform.escapeTags(event.getThreadName();sbuf.append(“);sbuf.append(escapedThread);sbuf.append(“ + Layout.LINE_SEP);*/sbuf.append(“);if (event.getLevel().equals(Level.FATAL) sbuf.append(“);sbuf.append(Transform.escapeTags(String.valueOf(event.getLevel();sbuf.append(“); else if (event.getLevel().isGreaterOrEqual(Level.WARN) sbuf.append(“);sbuf.append(Transform.escapeTags(String.valueOf(event.getLevel();sbuf.append(“); else sbuf.append(Transform.escapeTags(String.valueOf(event.getLevel();sbuf.append(“ + Layout.LINE_SEP);/* String escapedLogger = Transform.escapeTags(event.getLoggerName().substring(event.getLoggerName().lastIndexOf(“.“);sbuf.append(“);sbuf.append(escapedLogger);sbuf.append(“ + Layout.LINE_SEP);*/if (locationInfo) LocationInfo locInfo = event.getLocationInformation();sbuf.append(“);sbuf.append(Transform.escapeTags(locInfo.getFileName();sbuf.append(:);sbuf.append(locInfo.getLineNumber();sbuf.append(“ + Layout.LINE_SEP);Map session = ActionContext.getContext().getSession();if(session!=null)User user = (User) session.get(Constants.USER_IN_SESSION);sbuf.append(“+user.getName()+“);elsesbuf.append(“ “);sbuf.append(“);sbuf.append(Transform.escapeTags(event.getRenderedMessage();sbuf.append(“ + Layout.LINE_SEP);sbuf.append(“ + Layout.LINE_SEP);if (event.getNDC() != null) sbuf.append(“);sbuf.append(“NDC: “ + Transform.escapeTags(event.getNDC();sbuf.append(“ + Layout.LINE_SEP);String s = event.getThrowableStrRep();if (s != null) sbuf.append(“);appendThrowableAsHTML(s, sbuf);sbuf.append(“ + Layout.LINE_SEP);return sbuf.toString();private void appendThrowableAsHTML(String s, StringBuffer sbuf) if (s != null) int len = s.length;if (len = 0)return;sbuf.append(Transform.escapeTags(s0);sbuf.append(Layout.LINE_SEP);for (int i = 1; i “ + Layout.LINE_SEP);sbuf.append(“ + Layout.LINE_SEP);sbuf.append(“ + Layout.LINE_SEP);/ sbuf.append(“);sbuf.append(“ + title + “ + Layout.LINE_SEP);sbuf.append(“ + Layout.LINE_SEP);sbuf.append(“ + Layout.LINE_SEP);sbuf.append(“ + Layout.LINE_SEP);sbuf.append(“ + Layout.LINE_SEP);sbuf.append(“ + Layout.LINE_SEP);/ sbuf.append(“ + Layout.LINE_SEP);/ sbuf.append(“Log session start time “ + new SimpleDateFormat(“yyyy-MM-dd hh:mm:ss“).format(new java.util.Date() + “ + Layout.LINE_SEP);/ sbuf.append(“ + Layout.LINE_SEP);sbuf.append(“ + Layout.LINE_SEP);sbuf.append(“ + Layout.LINE_SEP);/ sbuf.append(“序列 “ + Layout.LINE_SEP);sbuf.append(“执行时间 “ + Layout.LINE_SEP);sbuf.append(“级别 “ + Layout.LINE_SEP);/ sbuf.append(“所在类 “ + Layout.LINE_SEP);if (locationInfo) sbuf.append(“所在行“ + Layout.LINE_SEP);sbuf.append(“操作人 “);sbuf.append(“信息 “ + Layout.LINE_SEP);sbuf.append(“ + Layout.LINE_SEP);sbuf.append(“ + Layout.LINE_SEP);return sbuf.toString();注,上面输出里包含了从当前 session 里取到的用户信息,只需要重写getHeader,format,appendThrowableAsHTML 三个方法就可以了。LoggingEvent 提供的方法可以获取各种日志信息。 2、输入到数据库,现在配置是将日志信息同时输出到文件和数据库Properties 代码 log4j.rootCategory=WARN, CONSOLE, FILE .surfilter.bt=FATAL,TOFILE,JDBC log4j.appender.TOFILE=org.apache.log4j.DailyRollingFileAppender log4j.appender.TOFILE.Threshold=FATAL log4j.appender.TOFILE.File=E:/javascpace/bt/logs/union.html log4j.appender.TOFILE.Append=true log4j.appender.TOFILE.ImmediateFlush=true log4j.appender.TOFILE.DatePattern=.yyyy-MM-dd.html log4j.appender.TOFILE.layout=com.surfilter.bt.util.FormatHTMLLayout log4j.rootCategory=WARN, CONSOLE, FILE.surfilter.bt=FATAL,TOFILE,JDBClog4j.appender.TOFILE=org.apache.log4j.DailyRollingFileAppenderlog4j.appender.TOFILE.Threshold=FATALlog4j.appender.TOFILE.File=E:/javascpace/bt/logs/union.htmllog4j.appender.TOFILE.Append=truelog4j.appender.TOFILE.ImmediateFlush=truelog4j.appender.TOFILE.DatePattern=.yyyy-MM-dd.htmllog4j.appender.TOFILE.layout=com.surfilter.bt.util.FormatHTMLLayoutProperties 代码 log4j.appender.JDBC=org.apache.log4j.jdbc.JDBCAppender #log4j.appender.JDBC=com.surfilter.bt.util.Log4jToDBAppender log4j.appender.JDBC.Threshold=FATAL log4j.appender.JDBC.URL=jdbc:oracle:thin::1521:orcl log4j.appender.JDBC.driver=oracle.jdbc.driver.OracleDriver log4j.appender.JDBC.user=db_user log4j.appender.JDBC.password=db_password log4j.appender.JDBC.sql=insert into sys_log(id,loginid,PRIORITY,LOGDATE,CLASS,METHOD,MSG) values (seq_sys_log.nextval,0,%p,%dyyyy-MM-dd HH:mm:ss,%c1,%-10.50l,%m) log4j.appender.JDBC.layout=org.apache.log4j.PatternLayout log4j.appender.JDBC=org.apache.log4j.jdbc.JDBCAppender#log4j.appender.JDBC=com.surfilter.bt.util.Log4jToDBAppender log4j.appender.JDBC.Threshold=FATALlog4j.appender.JDBC.URL=jdbc:oracle:thin::1521:orcllog4j.appender.JDBC.driver=oracle.jdbc.driver.OracleDriverlog4j.appender.JDBC.user=db_userlog4j.appender.JDBC.password=db_passwordlog4j.appender.JDBC.sql=insert into sys_log(id,loginid,PRIORITY,LOGDATE,CLASS,METHOD,MSG) values (seq_sys_log.nextval,0,%p,%dyyyy-MM-dd HH:mm:ss,%c1,%-10.50l,%m)log4j.appender.JDBC.layout=org.apache.log4j.PatternLayout 以上配置将会同时输出到文件和数据库,注意这里有一行注释掉的实现com.surfilter.bt.util.Log4jToDBAppender,如果你要使用连接池可以继承 JDBCAppender 重写实现,下面是 JDBCAppender 的实现源码,可以从 log4j 官网上 down 到:Java 代码 package org.apache.log4j.jdbc; import org.apache.log4j.spi.*; import org.apache.log4j.PatternLayout; import java.util.ArrayList; import java.util.Iterator; import java.sql.DriverManager; import java.sql.Connection; import java.sql.Statement; import java.sql.SQLException; public class JDBCAppender extends org.apache.log4j.AppenderSkeleton implements org.apache.log4j.Appender protected String databaseURL = “jdbc:odbc:myDB“; protected String databaseUser = “me“; protected String databasePassword = “mypassword“; protected Connection connection = null; protected String sqlStatement = “; protected int bufferSize = 1; protected ArrayList buffer; protected ArrayList removes; public JDBCAppender() super(); buffer = new ArrayList(bufferSize); removes = new ArrayList(bufferSize); public void append(LoggingEvent event) buffer.add(event); if (buffer.size() = bufferSize) flushBuffer(); protected String getLogStatement(LoggingEvent event) return getLayout().format(event); protected void execute(String sql) throws SQLException Connection con = null; Statement stmt = null; try con = getConnection(); stmt = con.createStatement(); stmt.executeUpdate(sql); catch (SQLException e) if (stmt != null) stmt.close(); throw e; stmt.close(); closeConnection(con); /System.out.println(“Execute: “ + sql); protected void closeConnection(Connection con) protected Connection getConnection() throws SQLException if (!DriverManager.getDrivers().hasMoreElements() setDriver(“sun.jdbc.odbc.JdbcOdbcDriver“); if (connection = null) connection = DriverManager.getConnection(databaseURL, databaseUser, databasePassword); return connection; public void close() flushBuffer(); try if (connection != null catch (SQLException e) errorHandler.error(“Error closing connection“, e, ErrorCode.GENERIC_FAILURE); this.closed = true; 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); 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 void finalize() close(); public boolean requiresLayout() return true; public void setSql(String s) sqlStatement = s; if (getLayout() = null) this.setLayout(new PatternLayout(s); else (PatternLayout)getLayout().setConversionPattern(s); public String getSql() return sqlStatement; public void setUser(String user) databaseUser = user; public void setURL(String url) databaseURL = url; public void setPassword(String password) databasePassword = password; public void setBufferSize(int newBufferSize) bufferSize = newBufferSize; buffer.ensureCapacity(bufferSize); removes.ensureCapacity(bufferSize); public String getUser() return databaseUser; public String getURL() return databaseURL; public String getPassword() return databasePassword; public int getBufferSize() return bufferSize; public void setDriver(String driverClass) try Class.forName(driverClass); catch (Exception e) errorHandler.error(“Failed to load driver“, e, ErrorCode.GENERIC_FAILURE); package org.apache.log4j.jdbc;import org.apache.log4j.spi.*;import org.apache.log4j.PatternLayout;import java.util.ArrayList;import java.util.Iterator;import java.sql.DriverManager;import java.sql.Connection;import java.sql.Statement;import java.sql.SQLException;public class JDBCAppender extends org.apache.log4j.AppenderSkeletonimplements org.apache.log4j.Appender protected String databaseURL = “jdbc:odbc:myDB“;protected String databaseUser = “me“;protected String databasePassword = “mypassword“;protected Connection connection = null;protected String sqlStatement = “;protected int bufferSize = 1;protected ArrayList buffer;protected ArrayList removes;public JDBCAppender() super();buffer = new ArrayList(bufferSize);removes = new ArrayList(bufferSize);public void append(LoggingEvent event) buffer.add(event);if (buffer.size() = bufferSize)flushBuffer();protected String getLogStatement(LoggingEvent event) return getLayout().format(event);protected void execute(String sql) throws SQLException Connection con = null;Statement stmt = null;try con = getConnection();stmt = con.createStatement();stmt.executeUpdate(sql); catch (SQLException e) if (stmt != null)stmt.close();throw e;stmt.close();closeConnection(con);/System.out.println(“Execute: “ + sql);protected void closeConnection(Connection con) protected Connection getConnection() throws SQLException if (!DriverManager.getDrivers().hasMoreElements()setDriver(“sun.jdbc.odbc.JdbcOdbcDriver“);if (connection = null) connection = DriverManager.getConnection(databaseURL, databaseUser,databasePassword);return connection;public void close()flushBuffer();try if (connection != null catch (SQLException e) errorHandler.error(“Error closing connection“, e, ErrorCode.G

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论