1
2
3
4
5
6
7
8
9
10
11
12
13
14 package ch.qos.logback.access;
15
16 import java.util.HashMap;
17 import java.util.Map;
18
19 import ch.qos.logback.access.pattern.ContentLengthConverter;
20 import ch.qos.logback.access.pattern.DateConverter;
21 import ch.qos.logback.access.pattern.EnsureLineSeparation;
22 import ch.qos.logback.access.pattern.FullRequestConverter;
23 import ch.qos.logback.access.pattern.FullResponseConverter;
24 import ch.qos.logback.access.pattern.LineSeparatorConverter;
25 import ch.qos.logback.access.pattern.LocalIPAddressConverter;
26 import ch.qos.logback.access.pattern.LocalPortConverter;
27 import ch.qos.logback.access.pattern.NAConverter;
28 import ch.qos.logback.access.pattern.RemoteHostConverter;
29 import ch.qos.logback.access.pattern.RemoteIPAddressConverter;
30 import ch.qos.logback.access.pattern.RemoteUserConverter;
31 import ch.qos.logback.access.pattern.RequestAttributeConverter;
32 import ch.qos.logback.access.pattern.RequestContentConverter;
33 import ch.qos.logback.access.pattern.RequestCookieConverter;
34 import ch.qos.logback.access.pattern.RequestHeaderConverter;
35 import ch.qos.logback.access.pattern.RequestMethodConverter;
36 import ch.qos.logback.access.pattern.RequestParameterConverter;
37 import ch.qos.logback.access.pattern.RequestProtocolConverter;
38 import ch.qos.logback.access.pattern.RequestURIConverter;
39 import ch.qos.logback.access.pattern.RequestURLConverter;
40 import ch.qos.logback.access.pattern.ResponseContentConverter;
41 import ch.qos.logback.access.pattern.ResponseHeaderConverter;
42 import ch.qos.logback.access.pattern.ServerNameConverter;
43 import ch.qos.logback.access.pattern.StatusCodeConverter;
44 import ch.qos.logback.access.spi.IAccessEvent;
45 import ch.qos.logback.core.pattern.PatternLayoutBase;
46 import ch.qos.logback.core.pattern.parser.Parser;
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63 public class PatternLayout extends PatternLayoutBase<IAccessEvent> {
64
65 public static final Map<String, String> defaultConverterMap = new HashMap<String, String>();
66
67 public static String CLF_PATTERN = "%h %l %u %t \"%r\" %s %b";
68 public static String CLF_PATTERN_NAME = "common";
69 public static String CLF_PATTERN_NAME_2 = "clf";
70 public static String COMBINED_PATTERN = "%h %l %u %t \"%r\" %s %b \"%i{Referer}\" \"%i{User-Agent}\"";
71 public static String COMBINED_PATTERN_NAME = "combined";
72
73 static {
74 defaultConverterMap.putAll(Parser.DEFAULT_COMPOSITE_CONVERTER_MAP);
75
76 defaultConverterMap.put("a", RemoteIPAddressConverter.class.getName());
77 defaultConverterMap.put("remoteIP", RemoteIPAddressConverter.class
78 .getName());
79
80 defaultConverterMap.put("A", LocalIPAddressConverter.class.getName());
81 defaultConverterMap.put("localIP", LocalIPAddressConverter.class.getName());
82
83 defaultConverterMap.put("b", ContentLengthConverter.class.getName());
84 defaultConverterMap.put("B", ContentLengthConverter.class.getName());
85 defaultConverterMap
86 .put("bytesSent", ContentLengthConverter.class.getName());
87
88 defaultConverterMap.put("h", RemoteHostConverter.class.getName());
89 defaultConverterMap.put("clientHost", RemoteHostConverter.class.getName());
90
91 defaultConverterMap.put("H", RequestProtocolConverter.class.getName());
92 defaultConverterMap.put("protocol", RequestProtocolConverter.class
93 .getName());
94
95 defaultConverterMap.put("i", RequestHeaderConverter.class.getName());
96 defaultConverterMap.put("header", RequestHeaderConverter.class.getName());
97
98 defaultConverterMap.put("l", NAConverter.class.getName());
99
100 defaultConverterMap.put("m", RequestMethodConverter.class.getName());
101 defaultConverterMap.put("requestMethod", RequestMethodConverter.class
102 .getName());
103
104 defaultConverterMap.put("r", RequestURLConverter.class.getName());
105 defaultConverterMap.put("requestURL", RequestURLConverter.class.getName());
106
107 defaultConverterMap.put("s", StatusCodeConverter.class.getName());
108 defaultConverterMap.put("statusCode", StatusCodeConverter.class.getName());
109
110 defaultConverterMap.put("t", DateConverter.class.getName());
111 defaultConverterMap.put("date", DateConverter.class.getName());
112
113 defaultConverterMap.put("u", RemoteUserConverter.class.getName());
114 defaultConverterMap.put("user", RemoteUserConverter.class.getName());
115
116 defaultConverterMap.put("U", RequestURIConverter.class.getName());
117 defaultConverterMap.put("requestURI", RequestURIConverter.class.getName());
118
119 defaultConverterMap.put("v", ServerNameConverter.class.getName());
120 defaultConverterMap.put("server", ServerNameConverter.class.getName());
121
122 defaultConverterMap.put("localPort", LocalPortConverter.class.getName());
123
124 defaultConverterMap.put("requestAttribute", RequestAttributeConverter.class
125 .getName());
126 defaultConverterMap.put("reqAttribute", RequestAttributeConverter.class
127 .getName());
128
129 defaultConverterMap
130 .put("reqCookie", RequestCookieConverter.class.getName());
131 defaultConverterMap
132 .put("requestCookie", RequestCookieConverter.class.getName());
133
134
135 defaultConverterMap.put("responseHeader", ResponseHeaderConverter.class
136 .getName());
137
138
139 defaultConverterMap.put("requestParameter", RequestParameterConverter.class
140 .getName());
141 defaultConverterMap.put("reqParameter", RequestParameterConverter.class
142 .getName());
143
144 defaultConverterMap.put("requestContent", RequestContentConverter.class.getName());
145
146 defaultConverterMap.put("responseContent", ResponseContentConverter.class.getName());
147
148 defaultConverterMap.put("fullRequest", FullRequestConverter.class.getName());
149 defaultConverterMap.put("fullResponse", FullResponseConverter.class.getName());
150
151
152 defaultConverterMap.put("n", LineSeparatorConverter.class.getName());
153 }
154
155
156 public PatternLayout() {
157
158 setPattern(CLF_PATTERN);
159
160 this.postCompileProcessor = new EnsureLineSeparation();
161 }
162
163
164
165
166 public Map<String, String> getDefaultConverterMap() {
167 return defaultConverterMap;
168 }
169
170 public String doLayout(IAccessEvent event) {
171 if (!isStarted()) {
172 return null;
173 }
174 return writeLoopOnConverters(event);
175 }
176
177 @Override
178 public void start() {
179 if (getPattern().equalsIgnoreCase(CLF_PATTERN_NAME)
180 || getPattern().equalsIgnoreCase(CLF_PATTERN_NAME_2)) {
181 setPattern(CLF_PATTERN);
182 } else if (getPattern().equalsIgnoreCase(COMBINED_PATTERN_NAME)) {
183 setPattern(COMBINED_PATTERN);
184 }
185 super.start();
186 }
187 }