【问题标题】:Jetty (specifically Solr) request latency logging to application insightsJetty(特别是 Solr)请求延迟记录到应用程序洞察力
【发布时间】:2019-12-22 15:58:51
【问题描述】:

我可以配置 Jetty 来记录请求延迟 https://support.lucidworks.com/s/question/0D58000003LRo9YCAT/how-to-log-http-request-latencies-for-solr-in-jetty-logs

<Ref id="Handlers">
      <Call name="addHandler">
        <Arg>
          <New id="RequestLog" class="org.eclipse.jetty.server.handler.RequestLogHandler">
            <Set name="requestLog">
              <New id="RequestLogImpl" class="org.eclipse.jetty.server.NCSARequestLog">
                <Set name="filename">
                   logs/request.yyyy_mm_dd.log
                </Set>
                <Set name="filenameDateFormat">yyyy_MM_dd</Set>
                <Set name="retainDays">90</Set>
                <Set name="append">true</Set>
                <Set name="extended">false</Set>
                <Set name="logCookies">false</Set>
                <Set name="LogTimeZone">UTC</Set>
                <Set name="logLatency">true</Set>                
              </New>
            </Set>
          </New>
        </Arg>
      </Call>
    </Ref>

但是,这会转到一个单独的日志文件, 并且不使用 log4j, 所以应用程序洞察力 log4j 附加程序不会选择它。 (见-Solr to Application Insights

如何让 log4j 记录码头请求延迟?

另外,我看到 logback 已经内置了对它自己的 RequestLogImpl 的支持 https://logback.qos.ch/access.html

应用洞察支持 logback https://docs.microsoft.com/en-us/azure/azure-monitor/app/java-trace-logs

<Ref id="Handlers">
  <Call name="addHandler">
    <Arg>
      <New id="RequestLog" class="org.eclipse.jetty.server.handler.RequestLogHandler">
        <Set name="requestLog">
            <New id="requestLogImpl" class="ch.qos.logback.access.jetty.RequestLogImpl">
            </New>
        </Set>
      </New>
    </Arg>
  </Call>
</Ref>

服务器\lib\ext\logback-access-1.2.3.jar

服务器\lib\ext\logback-core-1.2.3.jar

但是,我似乎无法通过 logback 将任何请求记录到文件中。 不确定它是否选择了 logback-access.xml 配置,尝试提供文件路径,使用默认值,但没有运气。

server\etc\logback-access.xml(与 jetty.xml 相同的位置)

并尝试指定相对的、完全限定的日志文件位置路径,但没有一个有效。

<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
  <!-- always a good activate OnConsoleStatusListener -->
  <statusListener class="ch.qos.logback.core.status.OnConsoleStatusListener" />  

<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>C:\logcallback\access.log</file>
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
      <fileNamePattern>C:\logcallback\access.%d{yyyy-MM-dd}.log.zip</fileNamePattern>
    </rollingPolicy>

    <encoder>
      <pattern>combined</pattern>
    </encoder>
  </appender>

  <logger name="org.eclipse.jetty.server.RequestLog" level="DEBUG" additivity="false">
    <appender-ref ref="FILE" />
  </logger>

   <root level="DEBUG">
        <appender-ref ref="FILE"/>
    </root>
</configuration>

那么如何让 Solr 使用 log4j 或 logback 将 Jetty 请求延迟指标记录到应用程序洞察中?

【问题讨论】:

    标签: solr log4j jetty logback azure-application-insights


    【解决方案1】:

    我找到了这个代码(谢谢) https://github.com/Fewbytes/jetty-log4j-request-log/tree/master/src/main/java/com/fewbytes/jetty/log4j

    调整后,我将 Jetty 响应时间记录到 log4j。

    <Ref id="Handlers">
      <Call name="addHandler">
        <Arg>
          <New id="RequestLog" class="org.eclipse.jetty.server.handler.RequestLogHandler">
            <Set name="requestLog">
                <New id="requestLogImpl" class="com.fewbytes.jetty.log4j.Log4JRequestHandler">
                </New>
            </Set>
          </New>
        </Arg>
      </Call>
    </Ref>
    

    必须添加一个重载的无参数构造函数,因为在此之前出现无效配置错误。

    public Log4JRequestHandler()
        {
            this.loggerName = "com.fewbytes.jetty.log4j";
        }
        public Log4JRequestHandler(String loggerName) {
            this.loggerName = loggerName;
        }
    

    我不得不将 ResponseDescriptor 修改为出现空错误并且不需要所有 cookie 等,并且可序列化对我不起作用,因此必须重载到字符串(只需在 toString 上输出几个属性来测试它)

    public JettyRequestResponseDescriptor(Request request, Response response) {
            method = request.getMethod();
            requestURL = request.getRequestURL().toString();
            status = response.getStatus();
            latency = System.currentTimeMillis() - request.getTimeStamp();
            remoteHost = request.getRemoteHost();
            remotePort = request.getRemotePort();
            scheme = request.getScheme();
            protocol = request.getProtocol();
            localName = request.getLocalName();
            localPort = request.getLocalPort();
            requestURI = request.getRequestURI();
            responseLength = response.getContentCount();
            serverName = request.getServerName();
            timestamp = request.getTimeStamp();
            referrer = request.getHeader(HttpHeaders.REFERER);
            userAgent = request.getHeader(HttpHeaders.USER_AGENT);
            X_Forwarded_For = request.getHeader(HttpHeaders.X_FORWARDED_FOR);
        }
        @Override
        public String toString() {
            return "JettyRequestResponseDescriptor [requestURL=" + requestURL + ", latency=" + latency + "]";
        }
    

    然后在 log4j.properties 中

    为此记录器设置日志记录级别

    com.fewbytes.jetty.log4j=INFO
    

    要构建包必须下载maven

    针对 pom.xml 文件运行

    c:\apache-maven-3.6.1-bin\apache-maven-3.6.1\bin\mvn package
    

    将生成的“jetty-log4j-request-log-1.0-SNAPSHOT.jar”文件复制到“server\lib\ext”

    并且可以在 log4j 生成的 solr 日志文件中看到来自码头的请求和延迟时间!

    2019-08-16 12:51:41.318 INFO  (qtp100555887-18) [   ] c.f.j.log4j JettyRequestResponseDescriptor [requestURL=http://localhost:8983/solr/admin/collections, latency=110]
    

    现在证明可以做到,是时候整理一下了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-15
      • 1970-01-01
      • 2020-05-22
      • 2018-12-28
      • 1970-01-01
      • 1970-01-01
      • 2018-10-24
      • 2016-09-17
      相关资源
      最近更新 更多