当前位置: 首页 > 知识库问答 >
问题:

Jetty(特别是Solr)向application insights请求延迟日志记录

斜和硕
2023-03-14
<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记录jetty请求延迟?

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

和application insights支持日志备份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>

然而,我似乎无法获得日志记录任何请求到一个文件。不确定它是否使用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>

共有1个答案

耿和韵
2023-03-14

我找到了这段代码(谢谢)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等,而且serializable对我不起作用,所以不得不重载到string(只需在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
c:\apache-maven-3.6.1-bin\apache-maven-3.6.1\bin\mvn package

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

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

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

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

 类似资料:
  • 我正在通过后码头日志记录,并试图找出打印的每个属性的含义 123.4.5.6---[27/Aug/2004:10:16:17 0000]“GET/jetty/tut/XmlConfiguration.html HTTP/1.1”200 76793”http://localhost:8080/jetty/tut/logging.html“Mozilla/5.0(X11;U;Linux i686;en

  • Flask 的设计原则中有一条是响应对象被创建并在一条可能的回调链中传递,而在 这条回调链但中的任意一个回调,您都可以修改或者替换掉他们。当请求开始被 处理时,还没有响应对象,响应对象将在这一过程中,被某个视图函数或者系统 的其他组件按照实际需要来闯将。 但是,如果您想在响应过程的结尾修改响应对象,但是这是对象还不存在,那么会发生 什么呢?一个常见的例子是您可能需要在 before-request

  • 我想按照这里的描述设置用于日志记录的Jetty-http://www.eclipse.org/jetty/documentation/current/configuring-jetty-request-logs.html 但上线过程以错误结束: 我的码头网。WEB-INF中的xml具有以下配置: 我做错了什么? 我用下一个命令编译并运行WAR文件:

  • 我试图通过aop在控制器中记录超文本传输协议请求。但是,在方面代码中,如果我 那么请求数据将无法在主流中检索。 所以,我创建了另一个公共方法,在控制器中传递请求字符串 这种方法是记录“数据”的切入点。 但问题是,这种方法的切入点似乎无法通过Spring识别,这种方法没有日志记录。我需要帮助。 下面是aop的定义

  • 问题内容: 我有一个jQuery Ajax请求,我想用文本输入调用它,因此我将其嵌套在里面。这很好。 但这有时表现为越野车。当我非常快速地输入一些文本时,我得到的输入单词的结果中省略了原始输入单词的最后几个字母(可能是浏览器的某些错误)。我希望在没有输入活动持续一秒钟的情况下发送ajax请求,如果我很快输入文本并休息一秒钟(意味着我进行了输入)。我怎样才能做到这一点? 问题答案: 听起来好像是从先

  • 我想让Jetty记录所有的HTTP请求(连同正文)和响应。Jetty本机支持吗?理想情况下,它会记录到我现有的log4j日志文件。 我在经营6号码头。