001/** 002 * Logback: the reliable, generic, fast and flexible logging framework. 003 * Copyright (C) 1999-2015, QOS.ch. All rights reserved. 004 * 005 * This program and the accompanying materials are dual-licensed under 006 * either the terms of the Eclipse Public License v1.0 as published by 007 * the Eclipse Foundation 008 * 009 * or (per the licensee's choosing) 010 * 011 * under the terms of the GNU Lesser General Public License version 2.1 012 * as published by the Free Software Foundation. 013 */ 014package ch.qos.logback.access.html; 015 016import static ch.qos.logback.core.CoreConstants.LINE_SEPARATOR; 017 018import java.util.Map; 019 020import ch.qos.logback.access.PatternLayout; 021import ch.qos.logback.access.spi.IAccessEvent; 022import ch.qos.logback.core.html.HTMLLayoutBase; 023import ch.qos.logback.core.pattern.Converter; 024 025/** 026 * 027 * HTMLLayout outputs events in an HTML table. 028 * <p> 029 * The content of the table columns are specified using a conversion pattern. 030 * See {@link ch.qos.logback.access.PatternLayout} for documentation on the 031 * available patterns. 032 * <p> 033 * For more information about this layout, please refer to the online manual at 034 * http://logback.qos.ch/manual/layouts.html#AccessHTMLLayout 035 * 036 * 037 * @author Ceki Gülcü 038 * @author Sébastien Pennec 039 */ 040public class HTMLLayout extends HTMLLayoutBase<IAccessEvent> { 041 042 /** 043 * Default pattern string for log output. 044 */ 045 static final String DEFAULT_CONVERSION_PATTERN = "%h%l%u%t%r%s%b"; 046 047 /** 048 * Constructs a PatternLayout using the DEFAULT_LAYOUT_PATTERN. 049 * 050 */ 051 public HTMLLayout() { 052 pattern = DEFAULT_CONVERSION_PATTERN; 053 cssBuilder = new DefaultCssBuilder(); 054 } 055 056 @Override 057 protected Map<String, String> getDefaultConverterMap() { 058 return PatternLayout.defaultConverterMap; 059 } 060 061 @Override 062 public String doLayout(IAccessEvent event) { 063 StringBuilder buf = new StringBuilder(); 064 startNewTableIfLimitReached(buf); 065 066 boolean odd = true; 067 if (((counter++) & 1) == 0) { 068 odd = false; 069 } 070 071 buf.append(LINE_SEPARATOR); 072 buf.append("<tr class=\""); 073 if (odd) { 074 buf.append(" odd\">"); 075 } else { 076 buf.append(" even\">"); 077 } 078 buf.append(LINE_SEPARATOR); 079 080 Converter<IAccessEvent> c = head; 081 while (c != null) { 082 appendEventToBuffer(buf, c, event); 083 c = c.getNext(); 084 } 085 buf.append("</tr>"); 086 buf.append(LINE_SEPARATOR); 087 088 return buf.toString(); 089 } 090 091 private void appendEventToBuffer(StringBuilder buf, Converter<IAccessEvent> c, IAccessEvent event) { 092 buf.append("<td class=\""); 093 buf.append(computeConverterName(c)); 094 buf.append("\">"); 095 c.write(buf, event); 096 buf.append("</td>"); 097 buf.append(LINE_SEPARATOR); 098 } 099}