1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.eclipse.jetty.server.handler;
20
21 import java.io.IOException;
22
23 import javax.servlet.ServletException;
24 import javax.servlet.http.HttpServletRequest;
25 import javax.servlet.http.HttpServletResponse;
26
27 import org.eclipse.jetty.continuation.Continuation;
28 import org.eclipse.jetty.continuation.ContinuationListener;
29 import org.eclipse.jetty.server.AsyncContinuation;
30 import org.eclipse.jetty.server.DispatcherType;
31 import org.eclipse.jetty.server.Request;
32 import org.eclipse.jetty.server.RequestLog;
33 import org.eclipse.jetty.server.Response;
34 import org.eclipse.jetty.server.Server;
35 import org.eclipse.jetty.util.component.AbstractLifeCycle;
36 import org.eclipse.jetty.util.log.Log;
37 import org.eclipse.jetty.util.log.Logger;
38
39
40
41
42
43
44
45
46 public class RequestLogHandler extends HandlerWrapper
47 {
48 private static final Logger LOG = Log.getLogger(RequestLogHandler.class);
49
50 private RequestLog _requestLog;
51
52
53
54
55
56 @Override
57 public void handle(String target, final Request baseRequest, HttpServletRequest request, final HttpServletResponse response)
58 throws IOException, ServletException
59 {
60 AsyncContinuation continuation = baseRequest.getAsyncContinuation();
61 if (!continuation.isInitial())
62 {
63 baseRequest.setDispatchTime(System.currentTimeMillis());
64 }
65
66 try
67 {
68 super.handle(target, baseRequest, request, response);
69 }
70 finally
71 {
72 if (continuation.isAsync())
73 {
74 if (continuation.isInitial())
75 continuation.addContinuationListener(new ContinuationListener()
76 {
77
78 public void onTimeout(Continuation continuation)
79 {
80
81 }
82
83 public void onComplete(Continuation continuation)
84 {
85 _requestLog.log(baseRequest, (Response)response);
86 }
87 });
88 }
89 else
90 _requestLog.log(baseRequest, (Response)response);
91 }
92 }
93
94
95 public void setRequestLog(RequestLog requestLog)
96 {
97
98 try
99 {
100 if (_requestLog != null)
101 _requestLog.stop();
102 }
103 catch (Exception e)
104 {
105 LOG.warn (e);
106 }
107
108 if (getServer()!=null)
109 getServer().getContainer().update(this, _requestLog, requestLog, "logimpl",true);
110
111 _requestLog = requestLog;
112
113
114 try
115 {
116 if (isStarted() && (_requestLog != null))
117 _requestLog.start();
118 }
119 catch (Exception e)
120 {
121 throw new RuntimeException (e);
122 }
123 }
124
125
126
127
128
129 @Override
130 public void setServer(Server server)
131 {
132 if (_requestLog!=null)
133 {
134 if (getServer()!=null && getServer()!=server)
135 getServer().getContainer().update(this, _requestLog, null, "logimpl",true);
136 super.setServer(server);
137 if (server!=null && server!=getServer())
138 server.getContainer().update(this, null,_requestLog, "logimpl",true);
139 }
140 else
141 super.setServer(server);
142 }
143
144
145 public RequestLog getRequestLog()
146 {
147 return _requestLog;
148 }
149
150
151
152
153
154 @Override
155 protected void doStart() throws Exception
156 {
157 if (_requestLog==null)
158 {
159 LOG.warn("!RequestLog");
160 _requestLog=new NullRequestLog();
161 }
162 super.doStart();
163 _requestLog.start();
164 }
165
166
167
168
169
170 @Override
171 protected void doStop() throws Exception
172 {
173 super.doStop();
174 _requestLog.stop();
175 if (_requestLog instanceof NullRequestLog)
176 _requestLog=null;
177 }
178
179
180
181
182 private static class NullRequestLog extends AbstractLifeCycle implements RequestLog
183 {
184 public void log(Request request, Response response)
185 {
186 }
187 }
188
189 }