Log4j的html输出格式:HTMLLayout 类重写,根据自身需要输出不同列

import java.text.SimpleDateFormat;   
  
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 = "<br>    ";   
  
    private StringBuffer sbuf = new StringBuffer(BUF_SIZE);   
       
    String title="??2???";   
  
    /**  
     * 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 default   
    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 + "<tr>" + 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);   
  
        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("<font color=\"green\">");   
            sbuf.append(Transform.escapeTags(String.valueOf(event.getLevel())));   
            sbuf.append("</font>");   
        }   
        sbuf.append("</td>" + Layout.LINE_SEP);   
           
   if (locationInfo) {   
            LocationInfo locInfo = event.getLocationInformation();   
            sbuf.append("<td title=\"?o?">");  
            sbuf.append(Transform.escapeTags(locInfo.getFileName()));  
            sbuf.append(':');  
            sbuf.append(locInfo.getLineNumber());  
            sbuf.append("</td>" + Layout.LINE_SEP);  
        }  
             
          
        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\" \"http://www.w3.org/TR/html4/loose.dtd\">" + Layout.LINE_SEP);   
        sbuf.append("<html>" + Layout.LINE_SEP);   
        sbuf.append("<head>" + Layout.LINE_SEP);   
    
        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("<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>??±?h>" + Layout.LINE_SEP);   
      
        if (locationInfo) {   
            sbuf.append("<th>???</th>" + Layout.LINE_SEP);   
        }   
   
        sbuf.append("<th>х?</th>" + Layout.LINE_SEP);   
        sbuf.append("</tr>" + Layout.LINE_SEP);   
        sbuf.append("<br></br>" + Layout.LINE_SEP);   
        return sbuf.toString();   
    }   
  
}  


配置文件:

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.MaxBackupIndex=1
log4j.appender.R.layout=com.dcsoft.ztb.util.FormatHTMLLayout
#log4j.appender.R.layout=org.apache.log4j.HTMLLayout
#log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} [%t] [%c] [%p] - %m%n

运行效果:



参考资料:http://blog.163.com/chenluyu0910@126/blog/static/99042293201121051050/?suggestedreading



  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Logback 可以通过配置文件logback.xml)来配置日志系统的行为,下面针对配置文件不同部分进行详细分析。 1. 配置根节点(configuration) 配置根节点包含了整个配置文件的属性和设置,如 debug 属性、上下文名称、日志输出级别等。例如: ```xml <configuration debug="true" scan="true" scanPeriod="30 seconds"> <contextName>myapp</contextName> <property name="logPath" value="/logs"/> <property name="logFile" value="myapp.log"/> <statusListener class="ch.qos.logback.core.status.OnConsoleStatusListener" /> <jmxConfigurator /> <shutdownHook /> <include resource="logback-include.xml" /> <logger name="com.example" level="DEBUG" /> <root level="INFO"> <appender-ref ref="CONSOLE" /> <appender-ref ref="FILE" /> </root> </configuration> ``` 在这个例子中,配置了 debug 属性为 true,表示启用调试模式;scan 属性为 true,表示启用自动配置文件扫描模式;scanPeriod 属性为 30 秒,表示每隔 30 秒重新扫描一次配置文件。contextName 指定了上下文名称,property 定义了日志文件的路径和名称。statusListener、jmxConfigurator、shutdownHook、include 均为可选设置。 2. 配置日志记录器(logger) 在 Logback 中,通过日志记录器(Logger)来记录日志信息。可以为每个或包设置不同的日志级别,以控制日志输出的详细程度。例如: ```xml <logger name="com.example.MyClass" level="DEBUG" /> ``` 上述配置表示,com.example.MyClass 的日志级别为 DEBUG,即只输出 DEBUG 级别及以上的日志信息。如果不指定 level 属性,则默认为 root 节点的级别。 3. 配置日志输出器(appender) 日志输出器(Appender)用于将日志信息输出到指定的目标,如控制台、文件、数据库等。Logback 提供了多种输出器,如 ConsoleAppender、FileAppender、RollingFileAppender 等。例如: ```xml <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>%d [%thread] %-5level %logger{35} - %msg%n</pattern> </encoder> </appender> ``` 上述配置表示,定义了一个名为 CONSOLE 的控制台输出器,使用 ConsoleAppender 实现。encoder 配置了输出格式模板,%d 表示日期时间,%thread 表示线程名,%-5level 表示日志级别(长度为 5),%logger{35} 表示 Logger 名称(长度为 35),%msg 表示日志信息,%n 表示换行符。 4. 配置日志格式化器(layout) 日志格式化器(Layout)用于格式化日志信息,使其易于阅读和理解。Logback 提供了多种格式化器,如 PatternLayoutHTMLLayout、XMLLayout 等。例如: ```xml <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>${logPath}/${logFile}</file> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>${logPath}/${logFile}.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern> <maxHistory>30</maxHistory> </rollingPolicy> <encoder> <pattern>%d [%thread] %-5level %logger{35} - %msg%n</pattern> </encoder> </appender> ``` 上述配置表示,定义了一个名为 FILE 的文件输出器,使用 RollingFileAppender 实现。file 属性指定了日志文件的路径和名称,rollingPolicy 配置了按时间滚动的策略,fileNamePattern 指定了滚动后的文件名格式,maxHistory 指定了最多保留的历史文件数。encoder 配置了输出格式模板,与前面的例子相同。 5. 配置日志过滤器(filter) 日志过滤器(Filter)用于过滤和控制日志信息的输出。可以根据不同的条件对日志信息进行过滤,如根据日志级别、Logger 名称、线程名称等。例如: ```xml <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>${logPath}/${logFile}</file> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>${logPath}/${logFile}.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern> <maxHistory>30</maxHistory> </rollingPolicy> <encoder> <pattern>%d [%thread] %-5level %logger{35} - %msg%n</pattern> </encoder> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>WARN</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> </appender> ``` 上述配置表示,定义了一个名为 FILE 的文件输出器,使用 RollingFileAppender 实现。filter 配置了一个 LevelFilter 过滤器,只保留 WARN 级别及以上的日志信息,onMatch 和 onMismatch 分别表示匹配和不匹配时的处理方式。 以上就是 Logback 配置文件的主要部分分析,通过配置根节点、日志记录器、日志输出器、日志格式化器和日志过滤器等组件,可以实现灵活、高效的日志记录功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值