View Javadoc

1   /**
2    * Logback: the generic, reliable, fast and flexible logging framework.
3    * 
4    * Copyright (C) 2000-2008, QOS.ch
5    * 
6    * This library is free software, you can redistribute it and/or modify it under
7    * the terms of the GNU Lesser General Public License as published by the Free
8    * Software Foundation.
9    */
10  package ch.qos.logback.access;
11  
12  import java.util.HashMap;
13  import java.util.Map;
14  
15  import ch.qos.logback.access.pattern.ContentLengthConverter;
16  import ch.qos.logback.access.pattern.DateConverter;
17  import ch.qos.logback.access.pattern.EnsureLineSeparation;
18  import ch.qos.logback.access.pattern.FullRequestConverter;
19  import ch.qos.logback.access.pattern.FullResponseConverter;
20  import ch.qos.logback.access.pattern.LineSeparatorConverter;
21  import ch.qos.logback.access.pattern.LocalIPAddressConverter;
22  import ch.qos.logback.access.pattern.LocalPortConverter;
23  import ch.qos.logback.access.pattern.NAConverter;
24  import ch.qos.logback.access.pattern.RemoteHostConverter;
25  import ch.qos.logback.access.pattern.RemoteIPAddressConverter;
26  import ch.qos.logback.access.pattern.RemoteUserConverter;
27  import ch.qos.logback.access.pattern.RequestAttributeConverter;
28  import ch.qos.logback.access.pattern.RequestContentConverter;
29  import ch.qos.logback.access.pattern.RequestCookieConverter;
30  import ch.qos.logback.access.pattern.RequestHeaderConverter;
31  import ch.qos.logback.access.pattern.RequestMethodConverter;
32  import ch.qos.logback.access.pattern.RequestParameterConverter;
33  import ch.qos.logback.access.pattern.RequestProtocolConverter;
34  import ch.qos.logback.access.pattern.RequestURIConverter;
35  import ch.qos.logback.access.pattern.RequestURLConverter;
36  import ch.qos.logback.access.pattern.ResponseContentConverter;
37  import ch.qos.logback.access.pattern.ResponseHeaderConverter;
38  import ch.qos.logback.access.pattern.ServerNameConverter;
39  import ch.qos.logback.access.pattern.StatusCodeConverter;
40  import ch.qos.logback.access.spi.AccessEvent;
41  import ch.qos.logback.core.pattern.PatternLayoutBase;
42  
43  /**
44   * <p>
45   * This class is a module-specific implementation of
46   * {@link ch.qos.logback.classic.PatternLayout} to allow http-specific patterns
47   * to be used. The <code>ch.qos.logback.access.PatternLayout</code> provides a
48   * way to format the logging output that is just as easy and flexible as the
49   * usual <code>PatternLayout</code>.
50   * </p>
51   * <p>
52   * For more information about this layout, please refer to the online manual at
53   * http://logback.qos.ch/manual/layouts.html#AccessPatternLayout
54   * 
55   * @author Ceki G&uuml;lc&uuml;
56   * @author S&eacute;bastien Pennec
57   */
58  public class PatternLayout extends PatternLayoutBase<AccessEvent> {
59  
60    public static final Map<String, String> defaultConverterMap = new HashMap<String, String>();
61  
62    public static String CLF_PATTERN = "%h %l %u %t \"%r\" %s %b";
63    public static String CLF_PATTERN_NAME = "common";
64    public static String CLF_PATTERN_NAME_2 = "clf";
65    public static String COMBINED_PATTERN = "%h %l %u %t \"%r\" %s %b \"%i{Referer}\" \"%i{User-Agent}\"";
66    public static String COMBINED_PATTERN_NAME = "combined";
67  
68    static {
69  
70      defaultConverterMap.put("a", RemoteIPAddressConverter.class.getName());
71      defaultConverterMap.put("remoteIP", RemoteIPAddressConverter.class
72          .getName());
73  
74      defaultConverterMap.put("A", LocalIPAddressConverter.class.getName());
75      defaultConverterMap.put("localIP", LocalIPAddressConverter.class.getName());
76  
77      defaultConverterMap.put("b", ContentLengthConverter.class.getName());
78      defaultConverterMap.put("B", ContentLengthConverter.class.getName());
79      defaultConverterMap
80          .put("bytesSent", ContentLengthConverter.class.getName());
81  
82      defaultConverterMap.put("h", RemoteHostConverter.class.getName());
83      defaultConverterMap.put("clientHost", RemoteHostConverter.class.getName());
84  
85      defaultConverterMap.put("H", RequestProtocolConverter.class.getName());
86      defaultConverterMap.put("protocol", RequestProtocolConverter.class
87          .getName());
88  
89      defaultConverterMap.put("i", RequestHeaderConverter.class.getName());
90      defaultConverterMap.put("header", RequestHeaderConverter.class.getName());
91  
92      defaultConverterMap.put("l", NAConverter.class.getName());
93  
94      defaultConverterMap.put("m", RequestMethodConverter.class.getName());
95      defaultConverterMap.put("requestMethod", RequestMethodConverter.class
96          .getName());
97  
98      defaultConverterMap.put("r", RequestURLConverter.class.getName());
99      defaultConverterMap.put("requestURL", RequestURLConverter.class.getName());
100 
101     defaultConverterMap.put("s", StatusCodeConverter.class.getName());
102     defaultConverterMap.put("statusCode", StatusCodeConverter.class.getName());
103 
104     defaultConverterMap.put("t", DateConverter.class.getName());
105     defaultConverterMap.put("date", DateConverter.class.getName());
106 
107     defaultConverterMap.put("u", RemoteUserConverter.class.getName());
108     defaultConverterMap.put("user", RemoteUserConverter.class.getName());
109 
110     defaultConverterMap.put("U", RequestURIConverter.class.getName());
111     defaultConverterMap.put("requestURI", RequestURIConverter.class.getName());
112 
113     defaultConverterMap.put("v", ServerNameConverter.class.getName());
114     defaultConverterMap.put("server", ServerNameConverter.class.getName());
115 
116     defaultConverterMap.put("localPort", LocalPortConverter.class.getName());
117     
118     defaultConverterMap.put("requestAttribute", RequestAttributeConverter.class
119         .getName());
120     defaultConverterMap.put("reqAttribute", RequestAttributeConverter.class
121         .getName());
122     
123     defaultConverterMap
124         .put("reqCookie", RequestCookieConverter.class.getName());
125     defaultConverterMap
126     .put("requestCookie", RequestCookieConverter.class.getName());
127 
128     
129     defaultConverterMap.put("responseHeader", ResponseHeaderConverter.class
130         .getName());
131     
132     
133     defaultConverterMap.put("requestParameter", RequestParameterConverter.class
134         .getName());
135     defaultConverterMap.put("reqParameter", RequestParameterConverter.class
136         .getName());
137 
138     defaultConverterMap.put("requestContent", RequestContentConverter.class.getName());
139 
140     defaultConverterMap.put("responseContent", ResponseContentConverter.class.getName());
141 
142     defaultConverterMap.put("fullRequest", FullRequestConverter.class.getName());
143     defaultConverterMap.put("fullResponse", FullResponseConverter.class.getName());
144 
145     
146     defaultConverterMap.put("n", LineSeparatorConverter.class.getName());
147   }
148 
149   
150   public PatternLayout() {
151     // set a default value for pattern
152     setPattern(CLF_PATTERN);
153     // by default postCompileProcessor the is an EnsureLineSeparation instance
154     this.postCompileProcessor = new EnsureLineSeparation();
155   }
156 
157   /**
158    * Returns the default converter map for this instance.
159    */
160   public Map<String, String> getDefaultConverterMap() {
161     return defaultConverterMap;
162   }
163 
164   public String doLayout(AccessEvent event) {
165     if (!isStarted()) {
166       return null;
167     }
168     return writeLoopOnConverters(event);
169   }
170 
171   @Override
172   public void start() {
173     if (getPattern().equalsIgnoreCase(CLF_PATTERN_NAME)
174         || getPattern().equalsIgnoreCase(CLF_PATTERN_NAME_2)) {
175       setPattern(CLF_PATTERN);
176     } else if (getPattern().equalsIgnoreCase(COMBINED_PATTERN_NAME)) {
177       setPattern(COMBINED_PATTERN);
178     }
179     super.start();
180   }
181 
182 }