log4j输出到文件和数据库控制台的实现就不说了,这里提供两种实例的配置,一种是输出为文件的(每天输出一个文件),一种为输出到数据库的配置。
1、输出到文件:Properties代码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'.html'yout=com.surfilter.bt.util.FormatHTMLLayoutlog4j.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'.html'yout=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 yout;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 er;public class FormatHTMLLayout extends HTMLLayout {public FormatHTMLLayout() {}protected final int BUF_SIZE = 256;protected final int MAX_CAPACITY = 1024;static String TRACE_PREFIX = "<br> ";// 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 <b>Title</b>.*/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 + "<tr>" + Layout.LINE_SEP);/* sbuf.append("<td>");sbuf.append(String.valueOf(i));sbuf.append("</td>" + Layout.LINE_SEP);*/sbuf.append("<td>");sbuf.append(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(newjava.util.Date()));sbuf.append("</td>" + Layout.LINE_SEP);/* String escapedThread = Transform.escapeTags(event.getThreadName());sbuf.append("<td title=\"" + escapedThread + " thread\">");sbuf.append(escapedThread);sbuf.append("</td>" + Layout.LINE_SEP);*/sbuf.append("<td title=\"级别\">");if (event.getLevel().equals(Level.FATAL)) {sbuf.append("<font color=\"#339933\">");sbuf.append(Transform.escapeTags(String.valueOf(event.getLevel())));sbuf.append("</font>");} else if (event.getLevel().isGreaterOrEqual(Level.WARN)) {sbuf.append("<font color=\"#993300\"><strong>");sbuf.append(Transform.escapeTags(String.valueOf(event.getLevel())));sbuf.append("</strong></font>");} else {sbuf.append(Transform.escapeTags(String.valueOf(event.getLevel())));}sbuf.append("</td>" + Layout.LINE_SEP);/* String escapedLogger = Transform.escapeTags(event.getLoggerName().substring(event.getLoggerName().lastIndexOf(".") ));sbuf.append("<td title=\"类名\">");sbuf.append(escapedLogger);sbuf.append("</td>" + Layout.LINE_SEP);*/if (locationInfo) {LocationInfo locInfo = event.getLocationInformation();sbuf.append("<td title=\"行号\">");sbuf.append(Transform.escapeTags(locInfo.getFileName()));sbuf.append(':');sbuf.append(locInfo.getLineNumber());sbuf.append("</td>" + Layout.LINE_SEP);}Map session = ActionContext.getContext().getSession();if(session!=null){User user = (User) session.get(ER_IN_SESSION);sbuf.append("<td>"+user.getName()+"</td>");}else{sbuf.append("<td> </td>");}sbuf.append("<td title=\"日志信息\">");sbuf.append(Transform.escapeTags(event.getRenderedMessage()));sbuf.append("</td>" + Layout.LINE_SEP);sbuf.append("</tr>" + Layout.LINE_SEP);if (event.getNDC() != null) {sbuf.append("<tr><td bgcolor=\"#EEEEEE\" style=\"font-size : xx-small;\" colspan=\"6\" title=\"Nested Diagnostic Context\">");sbuf.append("NDC: " + Transform.escapeTags(event.getNDC()));sbuf.append("</td></tr>" + Layout.LINE_SEP);}String[] s = event.getThrowableStrRep();if (s != null) {sbuf.append("<tr><td bgcolor=\"#993300\" style=\"color:White; font-size : xx-small;\" colspan=\"4\">");appendThrowableAsHTML(s, sbuf);sbuf.append("</td></tr>" + 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(s[0]));sbuf.append(Layout.LINE_SEP);for (int i = 1; i < len; i++) {sbuf.append(TRACE_PREFIX);sbuf.append(Transform.escapeTags(s[i]));sbuf.append(Layout.LINE_SEP);}}}/*** Returns appropriate HTML headers.*/public String getHeader() {StringBuffer sbuf = new StringBuffer();sbuf.append("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"/TR/html4/loose.dtd\">" + Layout.LINE_SEP);sbuf.append("<html>" + Layout.LINE_SEP);sbuf.append("<head>" + Layout.LINE_SEP);// sbuf.append("<meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">");sbuf.append("<title>" + title + "</title>" + Layout.LINE_SEP);sbuf.append("<style type=\"text/css\">" + Layout.LINE_SEP);sbuf.append("<!--" + Layout.LINE_SEP);sbuf.append("body, table {font-family: '宋体',arial,sans-serif; font-size: 12px;}" + Layout.LINE_SEP);sbuf.append("th {background: #336699; color: #FFFFFF; text-align: left;}" + Layout.LINE_SEP);sbuf.append("-->" + Layout.LINE_SEP);sbuf.append("</style>" + Layout.LINE_SEP);sbuf.append("</head>" + Layout.LINE_SEP);sbuf.append("<body bgcolor=\"#FFFFFF\" topmargin=\"6\" leftmargin=\"6\">" + Layout.LINE_SEP);// sbuf.append("<hr size=\"1\" noshade>" + Layout.LINE_SEP);// sbuf.append("Log session start time " + new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format(new java.util.Date()) + "<br>" + Layout.LINE_SEP);// sbuf.append("<p>" + Layout.LINE_SEP);sbuf.append("<table cellspacing=\"0\" cellpadding=\"4\" border=\"1\" bordercolor=\"#224466\" width=\"100%\">" + Layout.LINE_SEP);sbuf.append("<tr>" + Layout.LINE_SEP);// sbuf.append("<th>序列</th>" + Layout.LINE_SEP);sbuf.append("<th>执行时间</th>" + Layout.LINE_SEP);sbuf.append("<th>级别</th>" + Layout.LINE_SEP);// sbuf.append("<th>所在类</th>" + Layout.LINE_SEP);if (locationInfo) {sbuf.append("<th>所在行</th>" + Layout.LINE_SEP);}sbuf.append("<th>操作人</th>");sbuf.append("<th>信息</th>" + Layout.LINE_SEP);sbuf.append("</tr>" + Layout.LINE_SEP);sbuf.append("<br></br>" + Layout.LINE_SEP);return sbuf.toString();}}import java.text.SimpleDateFormat;import java.util.Map;import org.apache.log4j.HTMLLayout;import yout;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 er;public class FormatHTMLLayout extends HTMLLayout {public FormatHTMLLayout() {}protected final int BUF_SIZE = 256;protected final int MAX_CAPACITY = 1024;static String TRACE_PREFIX = "<br> ";// 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 <b>Title</b>.*/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 + "<tr>" + Layout.LINE_SEP);/* sbuf.append("<td>");sbuf.append(String.valueOf(i));sbuf.append("</td>" + Layout.LINE_SEP);*/sbuf.append("<td>");sbuf.append(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new java.util.Date()));sbuf.append("</td>" + Layout.LINE_SEP);/* String escapedThread = Transform.escapeTags(event.getThreadName());sbuf.append("<td title=\"" + escapedThread + " thread\">");sbuf.append(escapedThread);sbuf.append("</td>" + Layout.LINE_SEP);*/sbuf.append("<td title=\"级别\">");if (event.getLevel().equals(Level.FATAL)) {sbuf.append("<font color=\"#339933\">");sbuf.append(Transform.escapeTags(String.valueOf(event.getLevel())));sbuf.append("</font>");} else if (event.getLevel().isGreaterOrEqual(Level.WARN)) {sbuf.append("<font color=\"#993300\"><strong>");sbuf.append(Transform.escapeTags(String.valueOf(event.getLevel())));sbuf.append("</strong></font>");} else {sbuf.append(Transform.escapeTags(String.valueOf(event.getLevel())));}sbuf.append("</td>" + Layout.LINE_SEP);/* String escapedLogger = Transform.escapeTags(event.getLoggerName().substring(event.getLoggerName().lastIndexOf(".") ));sbuf.append("<td title=\"类名\">");sbuf.append(escapedLogger);sbuf.append("</td>" + Layout.LINE_SEP);*/if (locationInfo) {LocationInfo locInfo = event.getLocationInformation();sbuf.append("<td title=\"行号\">");sbuf.append(Transform.escapeTags(locInfo.getFileName()));sbuf.append(':');sbuf.append(locInfo.getLineNumber());sbuf.append("</td>" + Layout.LINE_SEP);}Map session = ActionContext.getContext().getSession();if(session!=null){User user = (User) session.get(ER_IN_SESSION);sbuf.append("<td>"+user.getName()+"</td>");}else{sbuf.append("<td> </td>");}sbuf.append("<td title=\"日志信息\">");sbuf.append(Transform.escapeTags(event.getRenderedMessage()));sbuf.append("</td>" + Layout.LINE_SEP);sbuf.append("</tr>" + Layout.LINE_SEP);if (event.getNDC() != null) {sbuf.append("<tr><td bgcolor=\"#EEEEEE\" style=\"font-size : xx-small;\" colspan=\"6\" title=\"Nested Diagnostic Context\">");sbuf.append("NDC: " + Transform.escapeTags(event.getNDC()));sbuf.append("</td></tr>" + Layout.LINE_SEP);}String[] s = event.getThrowableStrRep();if (s != null) {sbuf.append("<tr><td bgcolor=\"#993300\" style=\"color:White; font-size : xx-small;\" colspan=\"4\">");appendThrowableAsHTML(s, sbuf);sbuf.append("</td></tr>" + 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(s[0]));sbuf.append(Layout.LINE_SEP);for (int i = 1; i < len; i++) {sbuf.append(TRACE_PREFIX);sbuf.append(Transform.escapeTags(s[i]));sbuf.append(Layout.LINE_SEP);}}}/*** Returns appropriate HTML headers.*/public String getHeader() {StringBuffer sbuf = new StringBuffer();sbuf.append("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"/TR/html4/loose.dtd\">" + Layout.LINE_SEP);sbuf.append("<html>" + Layout.LINE_SEP);sbuf.append("<head>" + Layout.LINE_SEP);// sbuf.append("<meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">");sbuf.append("<title>" + title + "</title>" + Layout.LINE_SEP);sbuf.append("<style type=\"text/css\">" + Layout.LINE_SEP);sbuf.append("<!--" + Layout.LINE_SEP);sbuf.append("body, table {font-family: '宋体',arial,sans-serif; font-size: 12px;}" + Layout.LINE_SEP);sbuf.append("th {background: #336699; color: #FFFFFF; text-align: left;}" + Layout.LINE_SEP);sbuf.append("-->" + Layout.LINE_SEP);sbuf.append("</style>" + Layout.LINE_SEP);sbuf.append("</head>" + Layout.LINE_SEP);sbuf.append("<body bgcolor=\"#FFFFFF\" topmargin=\"6\" leftmargin=\"6\">" + Layout.LINE_SEP);// sbuf.append("<hr size=\"1\" noshade>" + Layout.LINE_SEP);// sbuf.append("Log session start time " + new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format(new java.util.Date()) + "<br>" + Layout.LINE_SEP);// sbuf.append("<p>" + Layout.LINE_SEP);sbuf.append("<table cellspacing=\"0\" cellpadding=\"4\" border=\"1\" bordercolor=\"#224466\" width=\"100%\">" + Layout.LINE_SEP);sbuf.append("<tr>" + Layout.LINE_SEP);// sbuf.append("<th>序列</th>" + Layout.LINE_SEP);sbuf.append("<th>执行时间</th>" + Layout.LINE_SEP);sbuf.append("<th>级别</th>" + Layout.LINE_SEP);// sbuf.append("<th>所在类</th>" + Layout.LINE_SEP);if (locationInfo) {sbuf.append("<th>所在行</th>" + Layout.LINE_SEP);}sbuf.append("<th>操作人</th>");sbuf.append("<th>信息</th>" + Layout.LINE_SEP);sbuf.append("</tr>" + Layout.LINE_SEP);sbuf.append("<br></br>" + Layout.LINE_SEP);return sbuf.toString();}}注,上面输出里包含了从当前session里取到的用户信息,只需要重写getHeader,format,appendThrowableAsHTML三个方法就可以了。