FormatHTMLLayout.java
import java.text.SimpleDateFormat;
import java.util.Date;
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;
public class FormatHTMLLayout extends HTMLLayout {
public FormatHTMLLayout() {
}
protected final int BUF_SIZE = 256;
protected final int MAX_CAPACITY = 1024;
// 设置前缀
static String TRACE_PREFIX = "
";
private StringBuffer sbuf = new StringBuffer(BUF_SIZE);
String title = "hello";
public static final String TITLE_OPTION = "Title";
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);sbuf.append("
");sbuf.append(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
.format(new Date()));
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("");
sbuf.append(Transform.escapeTags(String.valueOf(event.getLevel())));
sbuf.append("");
}
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);}
sbuf.append("
");sbuf.append(Transform.escapeTags(event.getRenderedMessage()));
sbuf.append("
" + Layout.LINE_SEP);sbuf.append("
" + Layout.LINE_SEP);if (event.getNDC() != null) {
sbuf.append("
"+ "style=\"font-size : xx-small;\" colspan=\"6\" "
+ "title=\"Nested Diagnostic Context\"> ");
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(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 headers.
*/
public String getHeader() {
StringBuffer sbuf = new StringBuffer();
sbuf
.append(""-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">"
+ Layout.LINE_SEP);
sbuf.append("" + Layout.LINE_SEP);
sbuf.append("
" + Layout.LINE_SEP);sbuf.append("
" + title + "" + Layout.LINE_SEP);sbuf.append("
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);sbuf.append("
级别" + Layout.LINE_SEP);if (locationInfo) {
sbuf.append("
所在行" + Layout.LINE_SEP);}
sbuf.append("
信息" + Layout.LINE_SEP);sbuf.append("
" + Layout.LINE_SEP);//sbuf.append("
" + Layout.LINE_SEP);
return sbuf.toString();
}
}
log4j.properties
log4j.rootLogger=DEBUG,A1,R
log4j.appender.A1=org.apache.log4j.ConsoleAppender
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss,SSS} [%c]-[%p] %m%n
log4j.appender.R=org.apache.log4j.RollingFileAppender
log4j.appender.R.File=sys_ztb_log.html
log4j.appender.R.MaxFileSize=4000KB
log4j.appender.R.layout=com.test.FormatHTMLLayout
#log4j.appender.R.layout=org.apache.log4j.HTMLLayout
#log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPatton=%d{yyyy-MM-dd HH:mm:ss,SSS} [%t] [%c] [%p] %m%n
test.java
public class Test {
private static Logger logger=Logger.getLogger(aa.class);
public static void main(String[] args) {
logger.debug("This is a debug method");
logger.info("This is indo method");
logger.error("This is error");
}
}
显示效果