2016-05-05 14 views
0

Ich mag würde die CMIS einzuloggen fragt im Freien von Kunden zu bekommen.Log CMIS-Abfragen in Alfresco 4.2 und höher

Ich habe versucht, alle CMIS-Kategorien zu debuggen Einstellung ... viele Informationen, aber keine Abfrage-Strings:

log4j.logger.org.alfresco.opencmis=debug 
log4j.logger.org.alfresco.opencmis.AlfrescoCmisServiceInterceptor=debug 
log4j.logger.org.alfresco.cmis=debug 
log4j.logger.org.alfresco.cmis.dictionary=debug 
log4j.logger.org.apache.chemistry.opencmis=debug 

Wer weiß, ob dies möglich ist? Ich habe in der Quelle herumgespuckt, aber es fällt mir schwer etwas zu finden.

Antwort

2

ich keine nützliche Protokollierung finden konnte, so habe ich zusammen einen Servlet-Filter die Anfragen zu protokollieren. Denken Sie daran, dass der Query-String ist eigentlich in der Nutzlast einer POST-Anforderung, so dass es notwendig ist, einen Anfrage-Wrapper zu erstellen, so kann die Nutzlast durch die Filter gelesen werden, ohne die Dienste zu stören, dass es stromabwärts benötigen. Während ich es war, angemeldet ich den Inhaltstyp und die Parameter zu, die wirklich nicht die Verpackung benötigen, da sie nicht-destruktiv die Anfrage Informationen zugreifen können. Um diesen Ansatz zu verwenden, erstellen Sie zwei Klassen, eine für den Filter und eine für den Wrapper. Setzen Sie sie beide in/tomcat/webapps/im Freien/WEB-INF/classes, fügen Sie dann einen Filter wie folgt web.xml ...

<filter> 
     <filter-name>post-body-filter</filter-name> 
     <filter-class>filter.PostBodyFilter</filter-class> 
    </filter> 
    <filter-mapping> 
     <filter-name>post-body-filter</filter-name> 
     <url-pattern>/*</url-pattern> 
    </filter-mapping> 

Die Ergebnisse können in die Protokolldatei gesetzt werden, indem ein Ventil umfassen Eintrag in server.xml wie folgt. Im Protokoll sehen Sie die Abfrage im REQBODY. Das Protokollpräfix, nach dem Sie suchen sollten, lautet localhost_access_log.

 <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" 
      prefix="localhost_access_log." suffix=".txt" 
      pattern=" %t %r contentType:%{REQCONTENTTYPE}r parameters:%{REQPARAMETERS}r body:%{REQBODY}r %s" />  

Die Klassen selbst sehen so aus. Ich gebe zu, mich frei von anderen Beispielen von Filtern zu leihen. Ich würde Zuschreibung (oder Schuld) geben, wenn ich mich nur an den Ort erinnern könnte. Ich bin mir sicher, dass es verbessert werden kann.

package filter; 

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.util.Enumeration; 
import javax.servlet.*; 
import javax.servlet.http.HttpServletRequest; 

import filter.FilterRequestWrapper 

public class PostBodyFilter implements Filter { 

    private FilterConfig filterConfig = null; 

    public void destroy() { 
     this.filterConfig = null; 
    } 

    public void doFilter(ServletRequest request, ServletResponse response, 
       FilterChain chain) throws IOException, ServletException { 
     if (filterConfig == null) 
      return; 
     FilterRequestWrapper requestWrapper = new FilterRequestWrapper((HttpServletRequest) request); 
     String contentType = request.getContentType(); 
     StringBuffer parameters = getParameters(request); 
     StringBuffer body = getBody(requestWrapper); 
     request.setAttribute("REQPARAMETERS", parameters); 
     request.setAttribute("REQBODY", body); 
     request.setAttribute("REQCONTENTTYPE", contentType); 
     chain.doFilter(requestWrapper, response); 
    } 

    private static StringBuffer getParameters(ServletRequest request) { 
     Enumeration<String> names = request.getParameterNames(); 
     StringBuffer parameters = new StringBuffer(); 
     while (names.hasMoreElements()) { 
      String name = (String) names.nextElement(); 
      parameters.append(name + "="); 
      String values[] = request.getParameterValues(name); 
      for (int i = 0; i < values.length; i++) { 
       if (i > 0) 
        parameters.append("' "); 
       parameters.append(values[i]); 
      } 
      if (names.hasMoreElements()) 
       parameters.append(" "); 
     } 
     return parameters; 
    } 

    private static StringBuffer getBody(ServletRequest request) 
      throws IOException { 
     StringBuffer body = new StringBuffer(); 
     BufferedReader bufferedReader = null; 
     try { 
      InputStream inputStream = request.getInputStream(); 
      if (inputStream != null) { 
       bufferedReader = new BufferedReader(new InputStreamReader(
         inputStream)); 
       char[] charBuffer = new char[128]; 
       int bytesRead = -1; 
       while ((bytesRead = bufferedReader.read(charBuffer)) > 0) { 
        body.append(charBuffer, 0, bytesRead); 
       } 
      } else { 
       body.append(""); 
      } 
     } catch (IOException ex) { 
      throw ex; 
     } finally { 
      if (bufferedReader != null) { 
       try { 
        bufferedReader.close(); 
       } catch (IOException ex) { 
        throw ex; 
       } 
      } 
     } 
     return body; 
    } 

    public void init(FilterConfig filterConfig) throws ServletException { 
     this.filterConfig = filterConfig; 
    } 
} 

package filter; 

import java.io.BufferedReader; 
import java.io.ByteArrayInputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.InputStreamReader; 

import javax.servlet.ServletInputStream; 

import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletRequestWrapper;  

public class FilterRequestWrapper extends HttpServletRequestWrapper { 

    private final String body; 

    public FilterRequestWrapper(HttpServletRequest request) { 
     super(request); 

     StringBuilder stringBuilder = new StringBuilder(); 
     BufferedReader bufferedReader = null; 

     try { 
      InputStream inputStream = request.getInputStream(); 

      if (inputStream != null) { 
       bufferedReader = new BufferedReader(new InputStreamReader(
         inputStream)); 

       char[] charBuffer = new char[128]; 
       int bytesRead = -1; 

       while ((bytesRead = bufferedReader.read(charBuffer)) > 0) { 
        stringBuilder.append(charBuffer, 0, bytesRead); 
       } 
      } else { 
       stringBuilder.append(""); 
      } 
     } catch (IOException ex) { 

     } finally { 
      if (bufferedReader != null) { 
       try { 
        bufferedReader.close(); 
       } catch (IOException ex) { 
       } 
      } 
     } 

     body = stringBuilder.toString(); 
    } 

    @Override 
    public ServletInputStream getInputStream() throws IOException { 
     final ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(
      body.getBytes()); 

     ServletInputStream inputStream = new ServletInputStream() { 
      public int read() throws IOException { 
       return byteArrayInputStream.read(); 
      } 
     }; 

     return inputStream; 
    } 
} 
+0

Danke. Ich werde wahrscheinlich die Anmeldung der Kunden vorher erkunden, weil es für mich ein bisschen zu "invasiv" ist, aber ich muss mich vielleicht darauf zurückziehen! –