1

我似乎无法弄清楚如何让 Solr 记录所有错误的结果 - 基本上每当出现错误的 URL 时,例如,请求处理程序上不存在的请求qt=unknownhandler,我需要记录它。

我可以在我的日志文件中看到 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 添加到处理程序集中。为什么我不到错误请求,而我可以看到这些日志:

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'
4

1 回答 1

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 请求,但可以按照以下说明破解源代码。

删除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-core-*.jar 放入 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) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)在 org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) 在 org.apache.catalina。Valves.AccessLogValve.invoke(AccessLogValve.java:555) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) at 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) 在 java.lang.Thread.run(Thread.java:662)在 org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:第489章)在 org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:第489章)

于 2011-09-21T03:49:27.963 回答