tomcat和nginx的日志记录请求时间

当系统卡顿时候,我们需要分析时间花费在哪个缓解。项目的后端接口可以记录一些时间,此外,在我们的tomcat容器和nginx网关上也可以记录一些有关请求用户,请求时间,响应时间的数据,可以提供更多的信息以便于排查问题。

1.tomcat日志

server.xml

复制代码
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
               prefix="localhost_access_log" suffix=".txt"
               pattern="%h %l %u %I %t &quot;%r&quot; %s %b %D" />

以下列出了一些基本的日志格式项:

复制代码
%a -- 远程主机的IP (Remote IP address)
%A -- 本机IP (Local IP address)
%b -- 发送字节数,不包含HTTP头,0字节则显示 '-' (Bytes sent, excluding HTTP headers, or '-' if no bytes
were sent)
%B -- 发送字节数,不包含HTTP头 (Bytes sent, excluding HTTP headers)
%h -- 远程主机名 (Remote host name)
%H -- 请求的具体协议,HTTP/1.0 或 HTTP/1.1 (Request protocol)
%l -- 远程用户名,始终为 '-' (Remote logical username from identd (always returns '-'))
%m -- 请求方式,GET, POST, PUT (Request method)
%p -- 本机端口 (Local port)
%q -- 查询串 (Query string (prepended with a '?' if it exists, otherwise
an empty string)
%r -- HTTP请求中的第一行 (First line of the request)
%s -- HTTP状态码 (HTTP status code of the response)
%S -- 用户会话ID (User session ID)
%t -- 访问日期和时间 (Date and time, in Common Log Format format)
%u -- 已经验证的远程用户 (Remote user that was authenticated
%U -- 请求的URL路径 (Requested URL path)
%v -- 本地服务器名 (Local server name)
%D -- 处理请求所耗费的毫秒数 (Time taken to process the request, in millis)
%T -- 处理请求所耗费的秒数 (Time taken to process the request, in seconds)
你可以用以上的任意组合来定制你的访问日志格式,也可以用下面两个别名common和combined来指定常用的日志格式:
common -- %h %l %u %t "%r" %s %b
combined -
%h %l %u %t "%r" %s %b "%{Referer}i" "%{User-Agent}i"
另外你还可以将cookie, 客户端请求中带的HTTP头(incoming header), 会话(session)或是ServletRequest中的数据都写到Tomcat的访问日志中,你可以用下面的语法来引用。
%{xxx}i -- 记录客户端请求中带的HTTP头xxx(incoming headers)
%{xxx}c -- 记录特定的cookie xxx
%{xxx}r -- 记录ServletRequest中的xxx属性(attribute)
%{xxx}s -- 记录HttpSession中的xxx属性(attribute)
2.nginx日志
复制代码
 log_format access_json '{"@timestamp":"$time_iso8601",'
        '"host":"$server_addr",'
        '"clientip":"$remote_addr",'
        '"size":$body_bytes_sent,'
        '"responsetime":$request_time,'
        '"upstreamtime":"$upstream_response_time",'
        '"upstreamhost":"$upstream_addr",'
        '"login_user":"$cookie_login_user",'
        '"http_host":"$host",'
        '"url":"$uri",'
        '"method":"$request_method",'
        '"domain":"$host",'
        '"xff":"$http_x_forwarded_for",'
        '"referer":"$http_referer",'
        '"status":"$status"}';
request_time(单位为秒)

官网描述:request processing time in seconds with a milliseconds resolution; time elapsed between the first bytes were read from the client and the log write after the last bytes were sent to the client。

指的就是从接受用户请求的第一个字节到发送完响应数据的时间,即$request_time包括接收客户端请求数据的时间、后端程序响应的时间、发送响应数据给客户端的时间(不包含写日志的时间)。

upstream_response_time(单位为秒)

官网描述:keeps time spent on receiving the response from the upstream server; the time is kept in seconds with millisecond resolution. Times of several responses are separated by commas and colons like addresses in the $upstream_addr variable.。

是指从Nginx向后端建立连接开始到接受完数据然后关闭连接为止的时间。

从上面的描述可以看出,request_time肯定比upstream_response_time值大;尤其是在客户端采用POST方式提交较大的数据,响应体比较大的时候。在客户端网络条件差的时候,$request_time还会被放大。

参考文档:

Tomcat访问日志浅析_org.apache.catalina.valves.accesslogvalve_yaerfeng的博客-CSDN博客

Nginx - request_time和upstream_response_time详解_nginx request_time_zzhongcy的博客-CSDN博客

相关推荐
Jack N4 小时前
【Strapi 系列之八】二次开发 + 生产部署,Docker + PostgreSQL + Nginx 一把梭
nginx·docker·postgresql·strapi
行者-全栈开发4 小时前
【码动四季·秋】把 Spring Boot 的 Tomcat 换成 Undertow:一次容器替换的三处暗坑
spring boot·tomcat·容器化·依赖管理·undertow
闲云自留地1 天前
K8s Ingress 全解:ingress-nginx 部署、域名路径路由、HTTPS 限流灰度一篇通
nginx·https·kubernetes
宁波阿成1 天前
CentOS 7 环境下 Tomcat 8.5 升级至 9.0.123 操作总结
linux·centos·tomcat
幽默小吴1 天前
nginx篇
运维·nginx
正经教主1 天前
【FDE系列】阶段2:Day 45(up详细版):综合实战 — Docker + Nginx + Git 完整部署与本周收官
人工智能·git·nginx·docker·fde
甜到心里的蛋糕1 天前
AI 生成 MV 音频异响排查:频谱定位、片段替换与 Nginx 缓存
人工智能·python·nginx·ffmpeg·音视频·音频处理
行思理2 天前
Nginx 跨站请求(CORS)配置完全指南:从原理到生产实践
java·前端·nginx
行者-全栈开发2 天前
【Java中间件】CVE-2026-34486:Tomcat EncryptInterceptor 补丁绕过修复指南
tomcat·cve-2026-34486·encryptintercep·会话复制·集群安全·补丁绕过·cwe-311
李迟2 天前
Nginx容器绑定81端口报拒绝访问错误的解决
运维·nginx