问题
i want to change the htmllayout (the 5 column - Time, Thread, Level, Category, Message) of log4j in Java.
my log4j.properties is:
log4j.rootLogger=DEBUG, Console, File
log4j.appender.Console=org.apache.log4j.ConsoleAppender
log4j.appender.File=org.apache.log4j.FileAppender
log4j.appender.File.File =${logfilename}
log4j.appender.Console.layout=org.apache.log4j.PatternLayout
log4j.appender.Console.layout.ConversionPattern=%d [%t] %-5p %c %x - %m%n
log4j.appender.File.layout=org.apache.log4j.PatternLayout
log4j.appender.File.layout=org.apache.log4j.HTMLLayout
log4j.appender.FILE.layout.Title=HTML Layout Example
log4j.appender.File.layout.ConversionPattern=%d [%t] %-5p %c %x - %m%n
#[%d{MMM dd HH:mm:ss}] %-5p (%F:%L) - %m%n
log4j.appender.File.Threshold=INFO
log4j.appender.Console.Threshold=DEBUG
i want to change the name of the "TIME" coloumn and to show there the current time. Could anyone help me how to do it?
回答1:
I found a solution, which works.
package com.mypackage;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.log4j.spi.LoggingEvent;
/**
* This HTML Log Formatter is a simple replacement for the standard Log4J HTMLLayout formatter and
* replaces the default timestamp (milliseconds, relative to the start of the log) with a more readable
* timestamp (an example of the default format is 2008-11-21-18:35:21.472-0800).
* */
public class MyLayout
extends org.apache.log4j.HTMLLayout
{
// RegEx pattern looks for <tr> <td> nnn...nnn </td> (all whitespace ignored)
private static final String rxTimestamp = "\\s*<\\s*tr\\s*>\\s*<\\s*td\\s*>\\s*(\\d*)\\s*<\\s*/td\\s*>";
//* The timestamp format. The format can be overriden by including the following
* property in the Log4J configuration file:
*
* log4j.appender.<category>.layout.TimestampFormat
*
* using the same format string as would be specified with SimpleDateFormat.
*
*/
private String timestampFormat = "yyyy-MM-dd-HH:mm:ss.SZ"; // Default format. Example: 2008-11-21-18:35:21.472-0800
private SimpleDateFormat sdf = new SimpleDateFormat(timestampFormat);
public MyLayout()
{
super();
}
/** Override HTMLLayout's format() method */
public String format(LoggingEvent event)
{
String record = super.format(event); // Get the log record in the default HTMLLayout format.
Pattern pattern = Pattern.compile(rxTimestamp); // RegEx to find the default timestamp
Matcher matcher = pattern.matcher(record);
if (!matcher.find()) // If default timestamp cannot be found,
{
return record; // Just return the unmodified log record.
}
StringBuffer buffer = new StringBuffer(record);
buffer.replace(matcher.start(1), // Replace the default timestamp with one formatted as desired.
matcher.end(1),
sdf.format(new Date(event.timeStamp)));
return buffer.toString(); // Return the log record with the desired timestamp format.
}
/** Setter for timestamp format. Called if log4j.appender.<category>.layout.TimestampFormat property is specfied */
public void setTimestampFormat(String format)
{
this.timestampFormat = format;
this.sdf = new SimpleDateFormat(format); // Use the format specified by the TimestampFormat property
}
/** Getter for timestamp format being used. */
public String getTimestampFormat()
{
return this.timestampFormat;
}
}
回答2:
Create a custom layout that extends org.apache.log4j.HTMLLayout class and overwrite the format method.
You can look at how formatting is the code of HTMLLayout and build your own version that suits your needs.
回答3:
The piece that seemed to be missing from this solution is how to configure your newly extended HTMLLayout class so that it gets picked up and used when the exceptions are emailed.
Ours is working and we just needed this one liner added to our log4j.properties file.
log4j.appender.email.layout=com.<yourPackage>.utils.CustomizedHTMLLayout
回答4:
Configure your layout in below configuration
Log4j.rootLogger=DEBUG
log4j.appender.FileAppender =org.apache.log4j.FileAppender
log4j.appender.FileAppender.File= C:\test.html
log4j.appender.FileAppender.layout=org.apache.log4j.HTMLLayout
log4j.logger.<your packge>=FileAppender
来源:https://stackoverflow.com/questions/12583374/how-to-change-the-htmllayout-in-log4j