8

我想在 Java 中更改 log4j 的 htmllayout(第 5 列 - 时间、线程、级别、类别、消息)。

我的 log4j.properties 是:

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

我想更改“时间”列的名称并在那里显示当前时间。谁能帮我怎么做?

4

4 回答 4

7

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;  
}  

} 
于 2012-09-25T13:52:52.040 回答
1

创建扩展org.apache.log4j.HTMLLayout类并覆盖format方法的自定义布局。

您可以查看HTMLLayout 的代码如何格式化,并构建适合您需求的自己的版本。

于 2013-04-15T10:36:34.877 回答
1

该解决方案似乎缺少的部分是如何配置新扩展的HTMLLayout类,以便在通过电子邮件发送异常时获取并使用它。

我们的工作正常,我们只需要将这一行添加到我们的log4j.properties文件中。

log4j.appender.email.layout=com.<yourPackage>.utils.CustomizedHTMLLayout
于 2013-07-25T17:09:15.020 回答
0

在以下配置中配置您的布局

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        
于 2012-09-25T12:59:31.330 回答