1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.eclipse.jetty.server;
20
21 import java.io.IOException;
22 import java.util.Locale;
23
24 import javax.servlet.http.Cookie;
25
26 import org.eclipse.jetty.http.HttpHeader;
27 import org.eclipse.jetty.http.PathMap;
28 import org.eclipse.jetty.server.handler.StatisticsHandler;
29 import org.eclipse.jetty.util.DateCache;
30 import org.eclipse.jetty.util.annotation.ManagedAttribute;
31 import org.eclipse.jetty.util.component.AbstractLifeCycle;
32 import org.eclipse.jetty.util.log.Log;
33 import org.eclipse.jetty.util.log.Logger;
34
35
36
37
38
39
40
41 public abstract class AbstractNCSARequestLog extends AbstractLifeCycle implements RequestLog
42 {
43 protected static final Logger LOG = Log.getLogger(AbstractNCSARequestLog.class);
44
45 private static ThreadLocal<StringBuilder> _buffers = new ThreadLocal<StringBuilder>()
46 {
47 @Override
48 protected StringBuilder initialValue()
49 {
50 return new StringBuilder(256);
51 }
52 };
53
54
55 private String[] _ignorePaths;
56 private boolean _extended;
57 private transient PathMap<String> _ignorePathMap;
58 private boolean _logLatency = false;
59 private boolean _logCookies = false;
60 private boolean _logServer = false;
61 private boolean _preferProxiedForAddress;
62 private transient DateCache _logDateCache;
63 private String _logDateFormat = "dd/MMM/yyyy:HH:mm:ss Z";
64 private Locale _logLocale = Locale.getDefault();
65 private String _logTimeZone = "GMT";
66
67
68
69
70
71
72
73 protected abstract boolean isEnabled();
74
75
76
77
78
79
80
81
82 public abstract void write(String requestEntry) throws IOException;
83
84
85
86 private void append(StringBuilder buf,String s)
87 {
88 if (s==null || s.length()==0)
89 buf.append('-');
90 else
91 buf.append(s);
92 }
93
94
95
96
97
98
99 @Override
100 public void log(Request request, Response response)
101 {
102 try
103 {
104 if (_ignorePathMap != null && _ignorePathMap.getMatch(request.getRequestURI()) != null)
105 return;
106
107 if (!isEnabled())
108 return;
109
110 StringBuilder buf = _buffers.get();
111 buf.setLength(0);
112
113 if (_logServer)
114 {
115 append(buf,request.getServerName());
116 buf.append(' ');
117 }
118
119 String addr = null;
120 if (_preferProxiedForAddress)
121 {
122 addr = request.getHeader(HttpHeader.X_FORWARDED_FOR.toString());
123 }
124
125 if (addr == null)
126 addr = request.getRemoteAddr();
127
128 buf.append(addr);
129 buf.append(" - ");
130 Authentication authentication = request.getAuthentication();
131 append(buf,(authentication instanceof Authentication.User)?((Authentication.User)authentication).getUserIdentity().getUserPrincipal().getName():null);
132
133 buf.append(" [");
134 if (_logDateCache != null)
135 buf.append(_logDateCache.format(request.getTimeStamp()));
136 else
137 buf.append(request.getTimeStamp());
138
139 buf.append("] \"");
140 append(buf,request.getMethod());
141 buf.append(' ');
142 append(buf,request.getHttpURI().toString());
143 buf.append(' ');
144 append(buf,request.getProtocol());
145 buf.append("\" ");
146
147 int status = response.getCommittedMetaData().getStatus();
148 if (status >=0)
149 {
150 buf.append((char)('0' + ((status / 100) % 10)));
151 buf.append((char)('0' + ((status / 10) % 10)));
152 buf.append((char)('0' + (status % 10)));
153 }
154 else
155 buf.append(status);
156
157 long written = response.getHttpChannel().getBytesWritten();
158 if (written >= 0)
159 {
160 buf.append(' ');
161 if (written > 99999)
162 buf.append(written);
163 else
164 {
165 if (written > 9999)
166 buf.append((char)('0' + ((written / 10000) % 10)));
167 if (written > 999)
168 buf.append((char)('0' + ((written / 1000) % 10)));
169 if (written > 99)
170 buf.append((char)('0' + ((written / 100) % 10)));
171 if (written > 9)
172 buf.append((char)('0' + ((written / 10) % 10)));
173 buf.append((char)('0' + (written) % 10));
174 }
175 buf.append(' ');
176 }
177 else
178 buf.append(" - ");
179
180
181 if (_extended)
182 logExtended(buf, request, response);
183
184 if (_logCookies)
185 {
186 Cookie[] cookies = request.getCookies();
187 if (cookies == null || cookies.length == 0)
188 buf.append(" -");
189 else
190 {
191 buf.append(" \"");
192 for (int i = 0; i < cookies.length; i++)
193 {
194 if (i != 0)
195 buf.append(';');
196 buf.append(cookies[i].getName());
197 buf.append('=');
198 buf.append(cookies[i].getValue());
199 }
200 buf.append('\"');
201 }
202 }
203
204 if (_logLatency)
205 {
206 long now = System.currentTimeMillis();
207
208 if (_logLatency)
209 {
210 buf.append(' ');
211 buf.append(now - request.getTimeStamp());
212 }
213 }
214
215 String log = buf.toString();
216 write(log);
217 }
218 catch (IOException e)
219 {
220 LOG.warn(e);
221 }
222 }
223
224
225
226
227
228
229
230 @Deprecated
231 protected void logExtended(Request request, StringBuilder b) throws IOException
232 {
233 String referer = request.getHeader(HttpHeader.REFERER.toString());
234 if (referer == null)
235 b.append("\"-\" ");
236 else
237 {
238 b.append('"');
239 b.append(referer);
240 b.append("\" ");
241 }
242
243 String agent = request.getHeader(HttpHeader.USER_AGENT.toString());
244 if (agent == null)
245 b.append("\"-\"");
246 else
247 {
248 b.append('"');
249 b.append(agent);
250 b.append('"');
251 }
252 }
253
254
255
256
257
258
259
260
261
262 protected void logExtended(StringBuilder b, Request request, Response response) throws IOException
263 {
264 logExtended(request, b);
265 }
266
267
268
269
270
271
272 public void setIgnorePaths(String[] ignorePaths)
273 {
274 _ignorePaths = ignorePaths;
275 }
276
277
278
279
280
281
282 public String[] getIgnorePaths()
283 {
284 return _ignorePaths;
285 }
286
287
288
289
290
291
292
293 public void setLogCookies(boolean logCookies)
294 {
295 _logCookies = logCookies;
296 }
297
298
299
300
301
302
303 public boolean getLogCookies()
304 {
305 return _logCookies;
306 }
307
308
309
310
311
312
313 public void setLogServer(boolean logServer)
314 {
315 _logServer = logServer;
316 }
317
318
319
320
321
322
323 public boolean getLogServer()
324 {
325 return _logServer;
326 }
327
328
329
330
331
332
333
334 public void setLogLatency(boolean logLatency)
335 {
336 _logLatency = logLatency;
337 }
338
339
340
341
342
343
344 public boolean getLogLatency()
345 {
346 return _logLatency;
347 }
348
349
350
351
352
353 @Deprecated
354 public void setLogDispatch(boolean value)
355 {
356 }
357
358
359
360
361
362 @Deprecated
363 public boolean isLogDispatch()
364 {
365 return false;
366 }
367
368
369
370
371
372
373
374
375 public void setPreferProxiedForAddress(boolean preferProxiedForAddress)
376 {
377 _preferProxiedForAddress = preferProxiedForAddress;
378 }
379
380
381
382
383
384
385 public boolean getPreferProxiedForAddress()
386 {
387 return _preferProxiedForAddress;
388 }
389
390
391
392
393
394
395 public void setExtended(boolean extended)
396 {
397 _extended = extended;
398 }
399
400
401
402
403
404
405 @ManagedAttribute("use extended NCSA format")
406 public boolean isExtended()
407 {
408 return _extended;
409 }
410
411
412
413
414
415
416 @Override
417 protected synchronized void doStart() throws Exception
418 {
419 if (_logDateFormat != null)
420 {
421 _logDateCache = new DateCache(_logDateFormat, _logLocale ,_logTimeZone);
422 }
423
424 if (_ignorePaths != null && _ignorePaths.length > 0)
425 {
426 _ignorePathMap = new PathMap<>();
427 for (int i = 0; i < _ignorePaths.length; i++)
428 _ignorePathMap.put(_ignorePaths[i], _ignorePaths[i]);
429 }
430 else
431 _ignorePathMap = null;
432
433 super.doStart();
434 }
435
436 @Override
437 protected void doStop() throws Exception
438 {
439 _logDateCache = null;
440 super.doStop();
441 }
442
443
444
445
446
447
448
449 public void setLogDateFormat(String format)
450 {
451 _logDateFormat = format;
452 }
453
454
455
456
457
458
459 public String getLogDateFormat()
460 {
461 return _logDateFormat;
462 }
463
464
465
466
467
468
469 public void setLogLocale(Locale logLocale)
470 {
471 _logLocale = logLocale;
472 }
473
474
475
476
477
478
479 public Locale getLogLocale()
480 {
481 return _logLocale;
482 }
483
484
485
486
487
488
489 public void setLogTimeZone(String tz)
490 {
491 _logTimeZone = tz;
492 }
493
494
495
496
497
498
499 @ManagedAttribute("the timezone")
500 public String getLogTimeZone()
501 {
502 return _logTimeZone;
503 }
504 }