2011-09-07 58 views
1

我似乎无法弄清楚如何让Solr记录所有不良的事件 - 基本上,每当有错误的URL进入请求处理程序时,如qt=unknownhandler就不存在,我需要记录它。SOLR:记录错误的请求

我可以看到我的日志文件中的Solr启动日志和异常日志,但不是坏请求。

使用JDK4的java.util.logging和Solr林采伐使用SLF4J和SLF4J-jdk的内部,我TOMCAT_DIR/conf目录/ logging.properties看起来是这样的:

5SOLR.org.apache.juli.FileHandler.level = ALL 
5SOLR.org.apache.juli.FileHandler.directory = ${catalina.base}/logs 
5SOLR.org.apache.juli.FileHandler.prefix = SOLR. 


org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/solr].level = ALL 
org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/solr].handlers = 5SOLR.org.apache.juli.FileHandler 

和我已经加入5SOLR.org。 apache.juli.FileHandler到一组处理程序。为什么我CAN NOT看到坏的请求,而我CAN看到这些类型的日志:

Sep 7, 2011 12:49:04 PM org.apache.catalina.core.StandardContext listenerStart 
FINE: Sending application start events 
Sep 7, 2011 12:49:04 PM org.apache.catalina.session.StandardSession readObject 
FINE: readObject() loading session C8A52B935A03A78BEC4A799119A79B49 
Sep 7, 2011 12:49:04 PM org.apache.catalina.core.StandardContext filterStart 
FINE: Starting filters 
Sep 7, 2011 12:49:04 PM org.apache.catalina.core.StandardContext filterStart 
FINE: Starting filter 'SolrRequestFilter' 
+0

Solrconfig.xml没有关于记录HTTP STATUS CODE:400(错误请求)事件的元素。预先感谢任何“答案” – Zasz

回答

2

你可以看到所有的请求发送到服务器的访问日志。 只是在$ TOMCAT_HOME/conf/server.xml中注释掉AccessLogValve。

<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" 
      prefix="localhost_access_log." suffix=".txt" pattern="common" resolveHosts="false"/> 

没有办法记录4xx请求,但hack源代码如下所述。

删除测试代码条件在org.apache.solr.servlet.SolrDispatchFilter.java * sendError *方法。

protected void sendError(HttpServletResponse res, Throwable ex) throws IOException { 
    int code=500; 
    String trace = ""; 
    if(ex instanceof SolrException) { 
    code = ((SolrException)ex).code(); 
    } 

    // For any regular code, don't include the stack trace 
    if(code == 500 || code < 100) { 
    StringWriter sw = new StringWriter(); 
    ex.printStackTrace(new PrintWriter(sw)); 
    trace = "\n\n"+sw.toString(); 

    SolrException.logOnce(log,null,ex); 

    // non standard codes have undefined results with various servers 
    if(code < 100) { 
     log.warn("invalid return code: "+code); 
     code = 500; 
    } 
    } 
    res.sendError(code, ex.getMessage() + trace); 
} 

编译之后,你需要把你的新的Apache-Solr的核心 - *罐子WEB-INF/lib目录,并重新启动Web容器。你会看到下面的所有错误。

2011年9月22日下午5时29分18秒org.apache.solr.common.SolrException登录 重度:org.apache.solr.common.SolrException:未知的处理程序: 办法抹杀在org.apache.solr .servlet.SolrDispatchFilter.doFilter(SolrDispatchFilter.java:227) 在org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) 在org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java :206) 在org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) 在org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) at org.apache.catalina.valves。 AccessLogValve.invoke(AccessLogValve.java:555) 在org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) 在org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298) 在org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:857) 在org.apache.coyote.http11.Http11Protocol $ Http11ConnectionHandler.process(Http11Protocol.java:588) 在org.apache.tomcat。 util.net.JIoEndpoint $ Worker.run(JIoEndpoint.java:489) at java.lang.Thread.run(Thread.java:662)

+0

这将记录所有请求,并且我不需要配置任何内容,这一配置已经下架了。 我需要让SOLR记录对它做出的错误请求。 (作为一个临时解决方案,我让应用程序记录了solr错误的请求。) – Zasz

+0

这很好,适用于我!作为最后一个选项,我保留了hack和重新编译源代码(为了稍后顺利更新solr)。但是这帮助我做到了这一点,虽然我不得不改变比你在这里提到的更多。 – Zasz