You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@chemistry.apache.org by je...@apache.org on 2011/10/11 21:25:36 UTC
svn commit: r1182044 - in
/chemistry/opencmis/trunk/chemistry-opencmis-server:
chemistry-opencmis-server-bindings/src/main/webapp/WEB-INF/
chemistry-opencmis-server-support/src/main/java/org/apache/chemistry/opencmis/server/support/filter/
Author: jens
Date: Tue Oct 11 19:25:35 2011
New Revision: 1182044
URL: http://svn.apache.org/viewvc?rev=1182044&view=rev
Log:
Improve Logging filter [CMIS-442]
Modified:
chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/webapp/WEB-INF/web.xml
chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-support/src/main/java/org/apache/chemistry/opencmis/server/support/filter/LoggingFilter.java
Modified: chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/webapp/WEB-INF/web.xml
URL: http://svn.apache.org/viewvc/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/webapp/WEB-INF/web.xml?rev=1182044&r1=1182043&r2=1182044&view=diff
==============================================================================
--- chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/webapp/WEB-INF/web.xml (original)
+++ chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/webapp/WEB-INF/web.xml Tue Oct 11 19:25:35 2011
@@ -54,6 +54,10 @@
<param-value>true</param-value>
</init-param>
<init-param>
+ <param-name>LogHeader</param-name>
+ <param-value>true</param-value>
+ </init-param>
+ <init-param>
<param-name>Indent</param-name>
<param-value>4</param-value>
</init-param>
@@ -63,7 +67,7 @@
<filter-name>LoggingFilter</filter-name>
<servlet-name>cmisatom</servlet-name>
</filter-mapping>
- -->
+ -->
<servlet>
<servlet-name>cmisws</servlet-name>
Modified: chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-support/src/main/java/org/apache/chemistry/opencmis/server/support/filter/LoggingFilter.java
URL: http://svn.apache.org/viewvc/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-support/src/main/java/org/apache/chemistry/opencmis/server/support/filter/LoggingFilter.java?rev=1182044&r1=1182043&r2=1182044&view=diff
==============================================================================
--- chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-support/src/main/java/org/apache/chemistry/opencmis/server/support/filter/LoggingFilter.java (original)
+++ chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-support/src/main/java/org/apache/chemistry/opencmis/server/support/filter/LoggingFilter.java Tue Oct 11 19:25:35 2011
@@ -25,6 +25,12 @@ import java.io.IOException;
import java.io.PrintWriter;
import java.io.StringReader;
import java.io.StringWriter;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.Locale;
+import java.util.Map;
import java.util.Scanner;
import javax.servlet.Filter;
@@ -35,6 +41,7 @@ import javax.servlet.ServletInputStream;
import javax.servlet.ServletOutputStream;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
+import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import javax.servlet.http.HttpServletResponse;
@@ -53,44 +60,37 @@ public class LoggingFilter implements Fi
private static final Log log = LogFactory.getLog(LoggingFilter.class);
private static int REQUEST_NO = 0;
- private static String OVERRIDE_NAME;
- private static int OVERRIDE_INDENT = -1;
- private static String OVERRIDE_LOG_DIR;
- private static Boolean OVERRIDE_PRETTY_PRINT;
+ private static final SimpleDateFormat FORMAT = new SimpleDateFormat("EEE MMM dd hh:mm:ss a z yyyy", Locale.US);
private String logDir;
private boolean prettyPrint = true;
+ private boolean logHeaders = true;
private int indent = -1;
public void init(FilterConfig cfg) throws ServletException {
String val;
- if (null == OVERRIDE_LOG_DIR) {
- logDir = cfg.getInitParameter("LogDir");
- if (null == logDir)
- logDir = System.getProperty("java.io.tmpdir");
- if (null == logDir)
- logDir = "." + File.separator;
- } else
- logDir = OVERRIDE_LOG_DIR;
-
+ logDir = cfg.getInitParameter("LogDir");
+ if (null == logDir)
+ logDir = System.getProperty("java.io.tmpdir");
+ if (null == logDir)
+ logDir = "." + File.separator;
+
if (!logDir.endsWith(File.separator))
logDir += File.separator;
-
- if (OVERRIDE_INDENT < 0) {
- val = cfg.getInitParameter("Indent");
- if (null != val)
- indent = Integer.parseInt(val);
- if (indent < 0)
- indent = 4;
- } else
- indent = OVERRIDE_INDENT;
-
- if (null == OVERRIDE_PRETTY_PRINT) {
- val = cfg.getInitParameter("PrettyPrint");
- if (null != val)
- prettyPrint = Boolean.parseBoolean(val);
- } else
- prettyPrint = OVERRIDE_PRETTY_PRINT;
+
+ val = cfg.getInitParameter("Indent");
+ if (null != val)
+ indent = Integer.parseInt(val);
+ if (indent < 0)
+ indent = 4;
+
+ val = cfg.getInitParameter("PrettyPrint");
+ if (null != val)
+ prettyPrint = Boolean.parseBoolean(val);
+
+ val = cfg.getInitParameter("LogHeaders");
+ if (null != val)
+ logHeaders = Boolean.parseBoolean(val);
}
public void destroy() {
@@ -108,28 +108,45 @@ public class LoggingFilter implements Fi
String requestFileName = getRequestFileName(reqNo);
String cType = logReq.getContentType();
String xmlRequest = logReq.getPayload();
+ StringBuffer sb = new StringBuffer();
+
+ if (logHeaders)
+ logHeaders(logReq, sb);
+
if (xmlRequest != null && xmlRequest.length() > 0) {
if (prettyPrint)
xmlRequest = prettyPrint(xmlRequest, indent);
} else
xmlRequest = "";
+ xmlRequest = sb.toString() + xmlRequest;
log.debug("Found request: " + requestFileName + ": " + xmlRequest);
writeTextToFile(requestFileName, xmlRequest);
chain.doFilter(logReq, logResponse);
+ sb = new StringBuffer();
cType = logResponse.getContentType();
String xmlResponse;
String responseFileName = getResponseFileName(reqNo);
- if(cType != null && cType.endsWith("xml")) {
+ if (logHeaders) {
+ logHeaders(logResponse, req.getProtocol(), sb);
+ }
+ if (cType != null && cType.contains("xml")) {
if (prettyPrint)
xmlResponse = prettyPrint(logResponse.getPayload(), indent);
else
xmlResponse = logResponse.getPayload();
+ xmlResponse = sb.toString() + xmlResponse;
+ log.debug("Found response: " + responseFileName + ": " + xmlResponse);
+ writeTextToFile(responseFileName, xmlResponse);
+ } else if (cType != null && cType.contains("html")) {
+ xmlResponse = sb.toString() + logResponse.getPayload();
log.debug("Found response: " + responseFileName + ": " + xmlResponse);
writeTextToFile(responseFileName, xmlResponse);
+ } else {
+ writeTextToFile(responseFileName, "Unknown reponse content format: " + cType);
}
} else {
chain.doFilter(req, resp);
@@ -179,41 +196,53 @@ public class LoggingFilter implements Fi
throw new RuntimeException(e); // simple exception handling, please review it
}
}
+
+ @SuppressWarnings("rawtypes")
+ private void logHeaders(LoggingRequestWrapper req, StringBuffer sb) {
+ sb.append(req.getMethod());
+ sb.append(" ");
+ sb.append(req.getRequestURI());
+ sb.append(" ");
+ sb.append(req.getProtocol());
+ sb.append("\n");
+ Enumeration headerNames = req.getHeaderNames();
+ while (headerNames.hasMoreElements()) {
+ String headerName = headerNames.nextElement().toString();
+ headerName = headerName.substring(0, 1).toUpperCase() + headerName.substring(1);
+ sb.append(headerName + ": ");
+ sb.append(req.getHeader(headerName));
+ sb.append("\n");
+ }
+ sb.append("\n");
+ }
+
+ private void logHeaders(LoggingResponseWrapper resp, String protocol, StringBuffer sb) {
+ sb.append(protocol);
+ sb.append(" ");
+ sb.append(String.valueOf(resp.getStatus()));
+ sb.append("\n");
+ Map<String, String> headers = resp.getHeaders();
+ for ( Map.Entry<String, String> header: headers.entrySet()) {
+ sb.append(header.getKey());
+ sb.append(": ");
+ sb.append(header.getValue());
+ sb.append("\n");
+ }
+ sb.append("\n");
+ }
private String getRequestFileName(int no) {
- if (OVERRIDE_NAME == null)
- return logDir + String.format("%05d-request.log", no);
- else
- return OVERRIDE_NAME + "-request";
+ return logDir + String.format("%05d-request.log", no);
}
private String getResponseFileName(int no) {
- if (OVERRIDE_NAME == null)
- return logDir + String.format("%05d-response.log", no);
- else
- return OVERRIDE_NAME + "-request";
+ return logDir + String.format("%05d-response.log", no);
}
private static synchronized int getNextRequestNumber() {
return REQUEST_NO++;
}
- public static void setFileName(String name) {
- OVERRIDE_NAME = name;
- }
-
- public static void setLogDir(String dir) {
- OVERRIDE_LOG_DIR = dir;
- }
-
- public static void setIndent(int indent) {
- OVERRIDE_INDENT = indent;
- }
-
- public static void setPrettyPrint(boolean pp) {
- OVERRIDE_PRETTY_PRINT = pp;
- }
-
private class LoggingRequestWrapper extends HttpServletRequestWrapper {
private LoggingInputStream is;
@@ -288,7 +317,10 @@ public class LoggingFilter implements Fi
private class LoggingResponseWrapper extends HttpServletResponseWrapper {
private LoggingOutputStream os;
-
+ private int statusCode;
+ private Map<String, String> headers = new HashMap<String, String>();
+ String encoding;
+
public LoggingResponseWrapper(HttpServletResponse response) throws IOException {
super(response);
this.os = new LoggingOutputStream(response.getOutputStream());
@@ -302,6 +334,136 @@ public class LoggingFilter implements Fi
public String getPayload() {
return os.getPayload();
}
+
+ @Override
+ public void addCookie(Cookie cookie) {
+ super.addCookie(cookie);
+ String value;
+ if (headers.containsKey("Cookie")) {
+ value = headers.get("Cookie") + "; " + cookie.toString();
+ } else
+ value = cookie.toString();
+ headers.put("Cookie", value);
+ }
+
+ @Override
+ public void setContentType(String type) {
+ super.setContentType(type);
+ if (headers.containsKey("Content-Type")) {
+ String cType = headers.get("Content-Type");
+ int pos = cType.indexOf(";charset=");
+ if (pos < 0 && encoding != null)
+ type = cType + ";charset=" + encoding;
+ else if (pos >= 0)
+ encoding = null;
+ }
+ headers.put("Content-Type", type);
+ }
+
+ @Override
+ public void setCharacterEncoding(java.lang.String charset) {
+ super.setCharacterEncoding(charset);
+ encoding = charset;
+ if (headers.containsKey("Content-Type")) {
+ String cType = headers.get("Content-Type");
+ int pos = cType.indexOf(";charset=");
+ if (pos >=0)
+ cType = cType.substring(0, pos) + ";charset=" + encoding;
+ else
+ cType = cType + ";charset=" + encoding;
+ headers.put("Content-Type", cType);
+ }
+ }
+
+ @Override
+ public void setContentLength(int len) {
+ super.setContentLength(len);
+ headers.put("Content-Length", String.valueOf(len));
+ }
+
+ private String getDateString(long date) {
+ return FORMAT.format(new Date(date));
+ }
+
+ @Override
+ public void setDateHeader(String name, long date) {
+ super.setDateHeader(name, date);
+ headers.put(name, String.valueOf(getDateString(date)));
+ }
+
+ @Override
+ public void addDateHeader(String name, long date) {
+ super.addDateHeader(name, date);
+ if (headers.containsKey(name)) {
+ headers.put(name, headers.get(name) + "; " + getDateString(date));
+ } else {
+ headers.put(name, String.valueOf(getDateString(date)));
+ }
+ }
+
+ @Override
+ public void setHeader(String name, String value) {
+ super.setHeader(name, value);
+ headers.put(name, String.valueOf(value));
+ }
+
+ @Override
+ public void addHeader(String name, String value) {
+ super.addHeader(name, value);
+ if (headers.containsKey(name)) {
+ headers.put(name, headers.get(name) + "; " + value);
+ } else {
+ headers.put(name, String.valueOf(value));
+ }
+ }
+
+ @Override
+ public void setIntHeader(String name, int value) {
+ super.setIntHeader(name, value);
+ headers.put(name, String.valueOf(value));
+ }
+
+ @Override
+ public void addIntHeader(String name, int value) {
+ super.addIntHeader(name, value);
+ if (headers.containsKey(name)) {
+ headers.put(name, headers.get(name) + "; " + String.valueOf(value));
+ } else {
+ headers.put(name, String.valueOf(value));
+ }
+ }
+
+ @Override
+ public void sendError(int sc) throws IOException {
+ statusCode = sc;
+ super.sendError(sc);
+ }
+
+ @Override
+ public void sendError(int sc, String msg) throws IOException {
+ statusCode = sc;
+ super.sendError(sc, msg);
+ }
+
+ @Override
+ public void sendRedirect(String location) throws IOException {
+ statusCode = 302;
+ super.sendRedirect(location);
+ }
+
+ @Override
+ public void setStatus(int sc) {
+ statusCode = sc;
+ super.setStatus(sc);
+ }
+
+ public int getStatus() {
+ return statusCode;
+ }
+
+ public Map<String, String> getHeaders() {
+ return headers;
+ }
}
private class LoggingOutputStream extends ServletOutputStream {