Jetty(特别是 Solr)请求延迟记录到应用程序洞察
Jetty (specifically Solr) request latency logging to application insights
我可以配置 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,
所以 application insights log4j appender 不会拾取它。
(参见 - )
如何让 log4j 记录码头请求延迟?
或者,我看到 logback 内置了对它自己的 RequestLogImpl 的支持
https://logback.qos.ch/access.html
并且application insights支持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>
server\lib\ext\logback-access-1.2.3.jar
server\lib\ext\logback-core-1.2.3.jar
但是,我似乎无法获取 logback 以将任何请求记录到文件中。
不确定它是否正在获取 logback-access.xml 配置,尝试使用默认设置提供文件路径,但没有成功。
server\etc\logback-access.xml(与 jetty.xml 相同的位置)
并尝试指定相对的、完全限定的日志文件位置路径,但 none 成功了。
<?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>
那么如何使用 log4j 或 logback 让 Solr 将 Jetty 请求延迟指标记录到应用程序洞察中?
我找到了这段代码(谢谢)
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]
现在证明可以做到,是时候整理一下了。
我可以配置 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,
所以 application insights log4j appender 不会拾取它。
(参见 -
如何让 log4j 记录码头请求延迟?
或者,我看到 logback 内置了对它自己的 RequestLogImpl 的支持 https://logback.qos.ch/access.html
并且application insights支持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>
server\lib\ext\logback-access-1.2.3.jar
server\lib\ext\logback-core-1.2.3.jar
但是,我似乎无法获取 logback 以将任何请求记录到文件中。 不确定它是否正在获取 logback-access.xml 配置,尝试使用默认设置提供文件路径,但没有成功。
server\etc\logback-access.xml(与 jetty.xml 相同的位置)
并尝试指定相对的、完全限定的日志文件位置路径,但 none 成功了。
<?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>
那么如何使用 log4j 或 logback 让 Solr 将 Jetty 请求延迟指标记录到应用程序洞察中?
我找到了这段代码(谢谢) 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]
现在证明可以做到,是时候整理一下了。