how to change the htmllayout in log4j

≡放荡痞女 提交于 2019-12-30 06:21:29

问题


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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!