23
23
import static org .openqa .selenium .remote .CapabilityType .BROWSER_NAME ;
24
24
import static org .openqa .selenium .remote .server .DriverServlet .SESSION_TIMEOUT_PARAMETER ;
25
25
26
+ import com .google .common .base .Splitter ;
26
27
import com .google .common .net .HttpHeaders ;
27
28
import com .google .common .net .MediaType ;
28
29
30
+ import org .openqa .selenium .logging .LoggingHandler ;
31
+ import org .openqa .selenium .remote .SessionId ;
32
+ import org .openqa .selenium .remote .server .log .LoggingManager ;
33
+ import org .openqa .selenium .remote .server .log .PerSessionLogHandler ;
29
34
import org .openqa .selenium .remote .server .xdrpc .CrossDomainRpc ;
30
35
import org .openqa .selenium .remote .server .xdrpc .CrossDomainRpcLoader ;
31
36
32
37
import java .io .ByteArrayInputStream ;
33
38
import java .io .IOException ;
39
+ import java .util .List ;
34
40
import java .util .concurrent .ExecutionException ;
35
41
import java .util .concurrent .ExecutorService ;
36
42
import java .util .concurrent .Executors ;
37
43
import java .util .concurrent .Future ;
38
44
import java .util .concurrent .TimeoutException ;
45
+ import java .util .logging .Handler ;
46
+ import java .util .logging .Logger ;
39
47
40
48
import javax .servlet .ServletException ;
41
49
import javax .servlet .ServletInputStream ;
46
54
47
55
public class WebDriverServlet extends HttpServlet {
48
56
57
+ private static final Logger LOG = Logger .getLogger (WebDriverServlet .class .getName ());
49
58
public static final String ACTIVE_SESSIONS_KEY = WebDriverServlet .class .getName () + ".sessions" ;
50
59
51
60
private static final String CROSS_DOMAIN_RPC_PATH = "/xdrpc" ;
@@ -57,6 +66,7 @@ public class WebDriverServlet extends HttpServlet {
57
66
58
67
@ Override
59
68
public void init () throws ServletException {
69
+ configureLogging ();
60
70
log ("Initialising WebDriverServlet" );
61
71
62
72
String value = getInitParameter (SESSION_TIMEOUT_PARAMETER );
@@ -73,6 +83,22 @@ public void init() throws ServletException {
73
83
handlers = new AllHandlers (allSessions );
74
84
}
75
85
86
+ private synchronized Logger configureLogging () {
87
+ Logger logger = Logger .getGlobal ();
88
+ logger .addHandler (LoggingHandler .getInstance ());
89
+
90
+ Logger rootLogger = Logger .getLogger ("" );
91
+ boolean sessionLoggerAttached = false ;
92
+ for (Handler handler : rootLogger .getHandlers ()) {
93
+ sessionLoggerAttached |= handler instanceof PerSessionLogHandler ;
94
+ }
95
+ if (!sessionLoggerAttached ) {
96
+ rootLogger .addHandler (LoggingManager .perSessionLogHandler ());
97
+ }
98
+
99
+ return logger ;
100
+ }
101
+
76
102
@ Override
77
103
protected void service (HttpServletRequest request , HttpServletResponse response )
78
104
throws IOException , ServletException {
@@ -165,25 +191,38 @@ public ServletInputStream getInputStream() throws IOException {
165
191
private void handle (HttpServletRequest req , HttpServletResponse resp ) {
166
192
CommandHandler handler = handlers .match (req );
167
193
168
- log ("Found handler: " + handler );
194
+ LOG . info ("Found handler: " + handler );
169
195
170
196
boolean invalidateSession =
171
197
handler instanceof ActiveSession &&
172
198
"DELETE" .equalsIgnoreCase (req .getMethod ()) &&
173
199
req .getPathInfo ().equals ("/session/" + ((ActiveSession ) handler ).getId ());
174
200
175
201
Future <?> execution = executor .submit (() -> {
202
+ // Clear the logs
203
+ PerSessionLogHandler sessionLogHandler = LoggingManager .perSessionLogHandler ();
204
+ sessionLogHandler .clearThreadTempLogs ();
205
+
176
206
try {
177
207
if (handler instanceof ActiveSession ) {
208
+ sessionLogHandler .attachToCurrentThread (((ActiveSession ) handler ).getId ());
178
209
ActiveSession session = (ActiveSession ) handler ;
179
210
Thread .currentThread ().setName (String .format (
180
211
"Handler thread for session %s (%s)" ,
181
212
session .getId (),
182
213
session .getCapabilities ().get (BROWSER_NAME )));
183
214
} else {
215
+ // All commands that take a session id expect that as the path fragment immediately after "/session".
216
+ List <String > fragments = Splitter .on ('/' ).limit (4 ).splitToList (req .getPathInfo ());
217
+ if (fragments .size () > 2 ) {
218
+ if ("session" .equals (fragments .get (1 ))) {
219
+ sessionLogHandler .attachToCurrentThread (new SessionId (fragments .get (2 )));
220
+ }
221
+ }
222
+
184
223
Thread .currentThread ().setName (req .getPathInfo ());
185
224
}
186
- log (String .format (
225
+ LOG . info (String .format (
187
226
"%s: Executing %s on %s (handler: %s)" ,
188
227
Thread .currentThread ().getName (),
189
228
req .getMethod (),
@@ -197,6 +236,7 @@ private void handle(HttpServletRequest req, HttpServletResponse resp) {
197
236
throw new RuntimeException (e );
198
237
} finally {
199
238
Thread .currentThread ().setName ("Selenium WebDriver Servlet - Quiescent Thread" );
239
+ sessionLogHandler .detachFromCurrentThread ();
200
240
}
201
241
});
202
242
0 commit comments