Author: andy
Date: Mon Apr 7 13:43:22 2014
New Revision: 1585481
URL: http://svn.apache.org/r1585481
Log:
NCSA combined/extended request logs.
Added:
jena/Experimental/jena-fuseki2/src/main/java/org/apache/jena/fuseki/server/RequestLog.java
Modified:
jena/Experimental/jena-fuseki2/src/main/java/org/apache/jena/fuseki/Fuseki.java
jena/Experimental/jena-fuseki2/src/main/java/org/apache/jena/fuseki/FusekiLogging.java
jena/Experimental/jena-fuseki2/src/main/java/org/apache/jena/fuseki/servlets/ActionSPARQL.java
jena/Experimental/jena-fuseki2/src/main/java/org/apache/jena/fuseki/servlets/ConcurrencyPolicyMRSW.java
jena/Experimental/jena-fuseki2/src/main/java/org/apache/jena/fuseki/servlets/FusekiFilter.java
jena/Experimental/jena-fuseki2/src/main/java/org/apache/jena/fuseki/servlets/HttpAction.java
jena/Experimental/jena-fuseki2/src/main/java/org/apache/jena/fuseki/servlets/ResponseModel.java
jena/Experimental/jena-fuseki2/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_Update.java
jena/Experimental/jena-fuseki2/src/main/java/org/apache/jena/fuseki/validation/ValidatorBaseJson.java
jena/Experimental/jena-fuseki2/src/test/java/org/apache/jena/fuseki/TS_Fuseki.java
jena/Experimental/jena-fuseki2/src/test/java/org/apache/jena/fuseki/TestAuth.java
Modified:
jena/Experimental/jena-fuseki2/src/main/java/org/apache/jena/fuseki/Fuseki.java
URL:
http://svn.apache.org/viewvc/jena/Experimental/jena-fuseki2/src/main/java/org/apache/jena/fuseki/Fuseki.java?rev=1585481&r1=1585480&r2=1585481&view=diff
==============================================================================
---
jena/Experimental/jena-fuseki2/src/main/java/org/apache/jena/fuseki/Fuseki.java
(original)
+++
jena/Experimental/jena-fuseki2/src/main/java/org/apache/jena/fuseki/Fuseki.java
Mon Apr 7 13:43:22 2014
@@ -90,11 +90,18 @@ public class Fuseki {
/** An identifier for the HTTP Fuseki server instance */
static public final String serverHttpName = NAME + " (" +
VERSION + ")" ;
- /** Actual log file for operations */
- public static final String requestLogName = PATH + ".Fuseki" ;
+ /** Loger name for operations */
+ public static final String actionLogName = PATH + ".Fuseki" ;
/** Instance of log for operations */
- public static final Logger requestLog =
LoggerFactory.getLogger(requestLogName) ;
+ public static final Logger actionLog =
LoggerFactory.getLogger(actionLogName) ;
+
+ /** Logger name for standard webserver log file request log */
+ public static final String requestLogName = PATH + ".Request" ;
+
+ // See HttpAction.finishRequest.
+ /** Instance of log for operations */
+ public static final Logger requestLog = null ; //
LoggerFactory.getLogger(requestLogName) ;
/** Admin log file for operations */
public static final String adminLogName = PATH + ".Admin" ;
Modified:
jena/Experimental/jena-fuseki2/src/main/java/org/apache/jena/fuseki/FusekiLogging.java
URL:
http://svn.apache.org/viewvc/jena/Experimental/jena-fuseki2/src/main/java/org/apache/jena/fuseki/FusekiLogging.java?rev=1585481&r1=1585480&r2=1585481&view=diff
==============================================================================
---
jena/Experimental/jena-fuseki2/src/main/java/org/apache/jena/fuseki/FusekiLogging.java
(original)
+++
jena/Experimental/jena-fuseki2/src/main/java/org/apache/jena/fuseki/FusekiLogging.java
Mon Apr 7 13:43:22 2014
@@ -52,7 +52,7 @@ public class FusekiLogging
"# System logs.",
"log4j.logger." + Fuseki.serverLogName + "=INFO",
- "log4j.logger." + Fuseki.requestLogName + "=INFO",
+ "log4j.logger." + Fuseki.actionLogName + "=INFO",
"log4j.logger." + Fuseki.adminLogName + "=INFO",
"log4j.logger." + Fuseki.validationLogName + "=INFO",
"log4j.logger." + Fuseki.configLogName + "=INFO",
Added:
jena/Experimental/jena-fuseki2/src/main/java/org/apache/jena/fuseki/server/RequestLog.java
URL:
http://svn.apache.org/viewvc/jena/Experimental/jena-fuseki2/src/main/java/org/apache/jena/fuseki/server/RequestLog.java?rev=1585481&view=auto
==============================================================================
---
jena/Experimental/jena-fuseki2/src/main/java/org/apache/jena/fuseki/server/RequestLog.java
(added)
+++
jena/Experimental/jena-fuseki2/src/main/java/org/apache/jena/fuseki/server/RequestLog.java
Mon Apr 7 13:43:22 2014
@@ -0,0 +1,148 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.jena.fuseki.server;
+
+import java.text.DateFormat ;
+import java.text.SimpleDateFormat ;
+import java.util.Collection ;
+import java.util.Date ;
+import java.util.Enumeration ;
+import java.util.TimeZone ;
+
+import javax.servlet.http.HttpServletRequest ;
+import javax.servlet.http.HttpServletResponse ;
+
+import org.apache.jena.atlas.logging.Log ;
+import org.apache.jena.fuseki.servlets.HttpAction ;
+
+/** Create standard request logs (NCSA etc) */
+public class RequestLog {
+ /*
+ http://httpd.apache.org/docs/current/mod/mod_log_config.html
+Common Log Format (CLF)
+ "%h %l %u %t \"%r\" %>s %b"
+Common Log Format with Virtual Host
+ "%v %h %l %u %t \"%r\" %>s %b"
+NCSA extended/combined log format
+ "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-agent}i\""
+ */
+ /*
+ %l -- Identity or -
+ %u -- Remote user or -
+ %t -- Timestamp
+ "%r" -- Request line
+ %>s -- Final request status
+ %b -- Size in bytes
+ Headers.
+ %{}i for request header.
+ %{}o for response header.
+ */
+
+ private static DateFormat dateFormatter ;
+ static {
+ dateFormatter = new SimpleDateFormat("dd/MMM/yyyy:HH:mm:ss Z") ;
+ dateFormatter.setTimeZone(TimeZone.getTimeZone("UTC"));
+ }
+
+ /** NCSA combined log format *
+ * LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %b \"%{Referer}i\"
\"%{User-Agent}i\"" combinedfwd
+ * XXX.XXX.XXX.XXX - - [01/Feb/2014:03:19:09 +0000] "GET / HTTP/1.1" 200
6190 "-" "check_http/v1.4.16 (nagios-plugins 1.4.16)"
+ */
+ public static String combinedNCSA(HttpAction action) {
+ StringBuilder builder = new StringBuilder() ;
+ HttpServletRequest request = action.request ;
+ HttpServletResponse response = action.response ;
+
+ // Remote
+ String remote = get(request, "X-Forwarded-For",
request.getRemoteAddr()) ;
+ builder.append(remote) ;
+ builder.append(" ") ;
+
+ // %l %u : User identity (unrelaible)
+ builder.append("- - ") ;
+
+ // %t
+ // Expensive?
+ builder.append("[");
+ // Better?
+ builder.append(dateFormatter.format(new Date())) ;
+ builder.append("] ");
+
+ // "%r"
+ builder.append("\"") ;
+ builder.append(request.getMethod()) ;
+ builder.append(" ") ;
+ // No query string - they are long and logged readably elsewhere
+ builder.append(request.getRequestURI()) ;
+ builder.append("\"") ;
+ //%>s -- Final request status
+ builder.append(" ") ;
+ builder.append(response.getStatus()) ;
+
+ //%b -- Size in bytes
+ builder.append(" ") ;
+ //String size = getField()
+ String size = get(response, "Content-Length", "-") ;
+ builder.append(size) ;
+
+ // "%{Referer}i"
+ builder.append(" \"") ;
+ builder.append(get(request, "Referer", "")) ;
+ builder.append("\"") ;
+ // "%{User-Agent}i"
+ builder.append(" \"") ;
+ builder.append(get(request, "User-Agent", "")) ;
+ builder.append("\"") ;
+
+ return builder.toString() ;
+ }
+
+ private static String get(HttpServletRequest request, String name, String
dft) {
+ String x = get(request, name) ;
+ if ( x == null )
+ x = dft ;
+ return x ;
+ }
+
+ private static String get(HttpServletRequest request, String name) {
+ Enumeration<String> en = request.getHeaders(name) ;
+ if ( ! en.hasMoreElements() ) return null ;
+ String x = en.nextElement() ;
+ if ( en.hasMoreElements() ) {
+ Log.warn(RequestLog.class, "Multiple request header values") ;
+ }
+ return x ;
+ }
+
+ private static String get(HttpServletResponse response, String name,
String dft) {
+ String x = get(response, name) ;
+ if ( x == null )
+ x = dft ;
+ return x ;
+ }
+
+
+ private static String get(HttpServletResponse response, String name) {
+ Collection<String> en = response.getHeaders(name) ;
+ if ( en.isEmpty() )return null ;
+ if ( en.size() != 1 ) Log.warn(RequestLog.class, "Multiple response
header values") ;
+ return response.getHeader(name) ;
+ }
+
+}
Modified:
jena/Experimental/jena-fuseki2/src/main/java/org/apache/jena/fuseki/servlets/ActionSPARQL.java
URL:
http://svn.apache.org/viewvc/jena/Experimental/jena-fuseki2/src/main/java/org/apache/jena/fuseki/servlets/ActionSPARQL.java?rev=1585481&r1=1585480&r2=1585481&view=diff
==============================================================================
---
jena/Experimental/jena-fuseki2/src/main/java/org/apache/jena/fuseki/servlets/ActionSPARQL.java
(original)
+++
jena/Experimental/jena-fuseki2/src/main/java/org/apache/jena/fuseki/servlets/ActionSPARQL.java
Mon Apr 7 13:43:22 2014
@@ -39,7 +39,7 @@ import com.hp.hpl.jena.query.QueryCancel
/** SPARQL request lifecycle */
public abstract class ActionSPARQL extends ActionBase
{
- protected ActionSPARQL() { super(Fuseki.requestLog) ; }
+ protected ActionSPARQL() { super(Fuseki.actionLog) ; }
protected abstract void validate(HttpAction action) ;
protected abstract void perform(HttpAction action) ;
Modified:
jena/Experimental/jena-fuseki2/src/main/java/org/apache/jena/fuseki/servlets/ConcurrencyPolicyMRSW.java
URL:
http://svn.apache.org/viewvc/jena/Experimental/jena-fuseki2/src/main/java/org/apache/jena/fuseki/servlets/ConcurrencyPolicyMRSW.java?rev=1585481&r1=1585480&r2=1585481&view=diff
==============================================================================
---
jena/Experimental/jena-fuseki2/src/main/java/org/apache/jena/fuseki/servlets/ConcurrencyPolicyMRSW.java
(original)
+++
jena/Experimental/jena-fuseki2/src/main/java/org/apache/jena/fuseki/servlets/ConcurrencyPolicyMRSW.java
Mon Apr 7 13:43:22 2014
@@ -26,7 +26,7 @@ import org.slf4j.Logger ;
public final class ConcurrencyPolicyMRSW
{
- static private Logger log = Fuseki.requestLog ;
//org.slf4j.LoggerFactory.getLogger(ConcurrencyPolicyMRSW.class) ;
+ static private Logger log = Fuseki.actionLog ;
//org.slf4j.LoggerFactory.getLogger(ConcurrencyPolicyMRSW.class) ;
static private final boolean logging = false ; //log.isDebugEnabled() ;
// This is a simplified version of ConcurrencyPolicyMRSW from TDB.
Modified:
jena/Experimental/jena-fuseki2/src/main/java/org/apache/jena/fuseki/servlets/FusekiFilter.java
URL:
http://svn.apache.org/viewvc/jena/Experimental/jena-fuseki2/src/main/java/org/apache/jena/fuseki/servlets/FusekiFilter.java?rev=1585481&r1=1585480&r2=1585481&view=diff
==============================================================================
---
jena/Experimental/jena-fuseki2/src/main/java/org/apache/jena/fuseki/servlets/FusekiFilter.java
(original)
+++
jena/Experimental/jena-fuseki2/src/main/java/org/apache/jena/fuseki/servlets/FusekiFilter.java
Mon Apr 7 13:43:22 2014
@@ -24,16 +24,13 @@ import javax.servlet.* ;
import javax.servlet.http.HttpServletRequest ;
import javax.servlet.http.HttpServletResponse ;
-import org.apache.jena.fuseki.Fuseki ;
import org.apache.jena.fuseki.server.DataAccessPointRegistry ;
-import org.slf4j.Logger ;
/** Look at all requests and see if they match a registered dataset name;
* if they do, pass down to the uber servlet, which can dispatch any request
* for any service.
*/
public class FusekiFilter implements Filter {
- private static Logger log = Fuseki.requestLog ;
//LoggerFactory.getLogger(SomeFilter.class) ;
private static SPARQL_UberServlet überServlet = new
SPARQL_UberServlet.AccessByConfig() ;
@Override
Modified:
jena/Experimental/jena-fuseki2/src/main/java/org/apache/jena/fuseki/servlets/HttpAction.java
URL:
http://svn.apache.org/viewvc/jena/Experimental/jena-fuseki2/src/main/java/org/apache/jena/fuseki/servlets/HttpAction.java?rev=1585481&r1=1585480&r2=1585481&view=diff
==============================================================================
---
jena/Experimental/jena-fuseki2/src/main/java/org/apache/jena/fuseki/servlets/HttpAction.java
(original)
+++
jena/Experimental/jena-fuseki2/src/main/java/org/apache/jena/fuseki/servlets/HttpAction.java
Mon Apr 7 13:43:22 2014
@@ -28,10 +28,12 @@ import javax.servlet.http.HttpServletReq
import javax.servlet.http.HttpServletResponse ;
import org.apache.jena.atlas.logging.Log ;
+import org.apache.jena.fuseki.Fuseki ;
import org.apache.jena.fuseki.FusekiException ;
import org.apache.jena.fuseki.server.DataAccessPoint ;
import org.apache.jena.fuseki.server.DataService ;
import org.apache.jena.fuseki.server.Endpoint ;
+import org.apache.jena.fuseki.server.RequestLog ;
import org.slf4j.Logger ;
import com.hp.hpl.jena.query.ReadWrite ;
@@ -223,6 +225,11 @@ public class HttpAction
public final void finishRequest() {
if ( dataAccessPoint != null )
dataAccessPoint.finishRequest(this) ;
+ // Standard logging goes here.
+ if ( Fuseki.requestLog != null ) {
+ String s = RequestLog.combinedNCSA(this) ;
+ Fuseki.requestLog.info(s);
+ }
}
public final DatasetGraph getActiveDSG() {
@@ -272,6 +279,20 @@ public class HttpAction
this.startTime = System.nanoTime() ;
}
+ /** Start time, in system nanos */
+ public long getStartTime() {
+ if ( ! startTimeIsSet )
+ Log.warn(this, "Start time is not set") ;
+ return startTime ;
+ }
+
+ /** Start time, in system nanos */
+ public long getFinishTime() {
+ if ( ! finishTimeIsSet )
+ Log.warn(this, "Finish time is not set") ;
+ return finishTime ;
+ }
+
public void setFinishTime() {
if ( finishTimeIsSet )
Log.warn(this, "Finish time reset") ;
Modified:
jena/Experimental/jena-fuseki2/src/main/java/org/apache/jena/fuseki/servlets/ResponseModel.java
URL:
http://svn.apache.org/viewvc/jena/Experimental/jena-fuseki2/src/main/java/org/apache/jena/fuseki/servlets/ResponseModel.java?rev=1585481&r1=1585480&r2=1585481&view=diff
==============================================================================
---
jena/Experimental/jena-fuseki2/src/main/java/org/apache/jena/fuseki/servlets/ResponseModel.java
(original)
+++
jena/Experimental/jena-fuseki2/src/main/java/org/apache/jena/fuseki/servlets/ResponseModel.java
Mon Apr 7 13:43:22 2014
@@ -82,7 +82,7 @@ public class ResponseModel
if ( mimeType == null )
{
- Fuseki.requestLog.warn("Can't find MIME type for response") ;
+ Fuseki.actionLog.warn("Can't find MIME type for response") ;
String x = WebLib.getAccept(request) ;
String msg ;
if ( x == null )
Modified:
jena/Experimental/jena-fuseki2/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_Update.java
URL:
http://svn.apache.org/viewvc/jena/Experimental/jena-fuseki2/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_Update.java?rev=1585481&r1=1585480&r2=1585481&view=diff
==============================================================================
---
jena/Experimental/jena-fuseki2/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_Update.java
(original)
+++
jena/Experimental/jena-fuseki2/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_Update.java
Mon Apr 7 13:43:22 2014
@@ -19,9 +19,17 @@
package org.apache.jena.fuseki.servlets;
import static java.lang.String.format ;
-import static org.apache.jena.fuseki.Fuseki.requestLog ;
-import static org.apache.jena.riot.web.HttpNames.* ;
import static org.apache.jena.fuseki.server.CounterName.UpdateExecErrors ;
+import static org.apache.jena.riot.WebContent.charsetUTF8 ;
+import static org.apache.jena.riot.WebContent.contentTypeHTMLForm ;
+import static org.apache.jena.riot.WebContent.contentTypeSPARQLUpdate ;
+import static org.apache.jena.riot.WebContent.ctSPARQLUpdate ;
+import static org.apache.jena.riot.WebContent.isHtmlForm ;
+import static org.apache.jena.riot.WebContent.matchContentType ;
+import static org.apache.jena.riot.web.HttpNames.paramRequest ;
+import static org.apache.jena.riot.web.HttpNames.paramUpdate ;
+import static org.apache.jena.riot.web.HttpNames.paramUsingGraphURI ;
+import static org.apache.jena.riot.web.HttpNames.paramUsingNamedGraphURI ;
import java.io.ByteArrayInputStream ;
import java.io.IOException ;
@@ -40,10 +48,9 @@ import org.apache.jena.atlas.lib.StrUtil
import org.apache.jena.atlas.web.ContentType ;
import org.apache.jena.fuseki.Fuseki ;
import org.apache.jena.fuseki.FusekiLib ;
-import org.apache.jena.riot.web.HttpNames ;
import org.apache.jena.iri.IRI ;
-import static org.apache.jena.riot.WebContent.* ;
import org.apache.jena.riot.system.IRIResolver ;
+import org.apache.jena.riot.web.HttpNames ;
import org.apache.jena.web.HttpSC ;
import com.hp.hpl.jena.graph.Node ;
@@ -176,7 +183,7 @@ public class SPARQL_Update extends SPARQ
String requestStr = null ;
try { requestStr = IO.readWholeFileAsUTF8(input) ; }
catch (IOException ex) { IO.exception(ex) ; }
- requestLog.info(format("[%d] Update = %s", action.id,
ServletOps.formatForLog(requestStr))) ;
+ action.log.info(format("[%d] Update = %s", action.id,
ServletOps.formatForLog(requestStr))) ;
input = new ByteArrayInputStream(requestStr.getBytes());
requestStr = null;
@@ -193,8 +200,7 @@ public class SPARQL_Update extends SPARQ
requestStr = action.request.getParameter(paramRequest) ;
if ( action.verbose )
- //requestLog.info(format("[%d] Form update = %s", action.id,
formatForLog(requestStr))) ;
- requestLog.info(format("[%d] Form update = \n%s", action.id,
requestStr)) ;
+ action.log.info(format("[%d] Form update = \n%s", action.id,
requestStr)) ;
// A little ugly because we are taking a copy of the string, but
hopefully shouldn't be too big if we are in this code-path
// If we didn't want this additional copy, we could make the parser
take a Reader in addition to an InputStream
byte[] b = StrUtils.asUTF8bytes(requestStr) ;
Modified:
jena/Experimental/jena-fuseki2/src/main/java/org/apache/jena/fuseki/validation/ValidatorBaseJson.java
URL:
http://svn.apache.org/viewvc/jena/Experimental/jena-fuseki2/src/main/java/org/apache/jena/fuseki/validation/ValidatorBaseJson.java?rev=1585481&r1=1585480&r2=1585481&view=diff
==============================================================================
---
jena/Experimental/jena-fuseki2/src/main/java/org/apache/jena/fuseki/validation/ValidatorBaseJson.java
(original)
+++
jena/Experimental/jena-fuseki2/src/main/java/org/apache/jena/fuseki/validation/ValidatorBaseJson.java
Mon Apr 7 13:43:22 2014
@@ -52,7 +52,6 @@ public abstract class ValidatorBaseJson
public static final String jParseErrorLine = "parse-error-line" ;
public static final String jParseErrorCol = "parse-error-column" ;
- protected static Logger serviceLog = Fuseki.requestLog ;
public static final String respService = "X-Service" ;
@Override
Modified:
jena/Experimental/jena-fuseki2/src/test/java/org/apache/jena/fuseki/TS_Fuseki.java
URL:
http://svn.apache.org/viewvc/jena/Experimental/jena-fuseki2/src/test/java/org/apache/jena/fuseki/TS_Fuseki.java?rev=1585481&r1=1585480&r2=1585481&view=diff
==============================================================================
---
jena/Experimental/jena-fuseki2/src/test/java/org/apache/jena/fuseki/TS_Fuseki.java
(original)
+++
jena/Experimental/jena-fuseki2/src/test/java/org/apache/jena/fuseki/TS_Fuseki.java
Mon Apr 7 13:43:22 2014
@@ -53,6 +53,6 @@ public class TS_Fuseki extends ServerTes
LogCtl.logLevel(Fuseki.configLogName, WARN1, WARN2);
LogCtl.logLevel(Fuseki.adminLogName, WARN1, WARN2);
LogCtl.logLevel(Fuseki.builderLogName, WARN1, WARN2);
- LogCtl.logLevel(Fuseki.requestLogName, WARN1, WARN2);
+ LogCtl.logLevel(Fuseki.actionLogName, WARN1, WARN2);
}
}
\ No newline at end of file
Modified:
jena/Experimental/jena-fuseki2/src/test/java/org/apache/jena/fuseki/TestAuth.java
URL:
http://svn.apache.org/viewvc/jena/Experimental/jena-fuseki2/src/test/java/org/apache/jena/fuseki/TestAuth.java?rev=1585481&r1=1585480&r2=1585481&view=diff
==============================================================================
---
jena/Experimental/jena-fuseki2/src/test/java/org/apache/jena/fuseki/TestAuth.java
(original)
+++
jena/Experimental/jena-fuseki2/src/test/java/org/apache/jena/fuseki/TestAuth.java
Mon Apr 7 13:43:22 2014
@@ -72,7 +72,7 @@ public class TestAuth extends ServerTest
writer.close();
LogCtl.logLevel(Fuseki.serverLog.getName(),
org.apache.log4j.Level.WARN, java.util.logging.Level.WARNING);
- LogCtl.logLevel(Fuseki.requestLog.getName(),
org.apache.log4j.Level.WARN, java.util.logging.Level.WARNING);
+ LogCtl.logLevel(Fuseki.actionLog.getName(),
org.apache.log4j.Level.WARN, java.util.logging.Level.WARNING);
LogCtl.logLevel("org.eclipse.jetty", org.apache.log4j.Level.WARN,
java.util.logging.Level.WARNING);
ServerTest.setupServer(realmFile.getAbsolutePath());