Nginx中记录请求抵达时间最准确的变量是$time_iso8601或$time_local,二者均在请求头解析完成后赋值,标志请求已完整抵达;$msec提供毫秒级精度,可配合使用;而$request_time等为耗时变量,非时间点。

Nginx 默认访问日志中的 $time_local 记录的是日志写入时的时间,不是请求真正到达服务器的时刻。若需精确记录请求抵达时间(例如用于排查网络延迟、首字节耗时分析),应使用 $msec 或更准确的 $request_time 配合自定义日志格式,但要注意:真正反映“请求到达瞬间”的变量是 $time_iso8601 或 $time_local —— 它们在 Nginx 接收到完整请求头后即被赋值,实际已足够贴近抵达时刻;而更严格的“内核接收时间”无法直接获取,Nginx 层面能用的最准指标仍是请求开始处理时的时间。
使用 $time_iso8601 或 $time_local 记录请求起始时间
这两个变量在 Nginx 解析完请求行和请求头后立即生成,可视为请求已完整抵达并准备处理的标志,实践中广泛用于衡量服务端响应延迟起点。
-
$time_local:格式如 24/Jul/2024:10:32:15 +0800,适合人工阅读 -
$time_iso8601:格式如 2024-07-24T10:32:15+08:00,便于程序解析和时序对齐 - 二者均在 accept() → read request header 完成后确定,不包含后续 upstream 耗时或响应发送时间
补充毫秒级精度:添加 $msec
$msec 是 Unix 时间戳带毫秒的小数形式(如 1721788335.123),精度更高,适合做性能统计或与后端日志对齐。
- 它与
$time_local同步生成,只是数值表达方式不同 - 可在 log_format 中组合使用,例如:
log_format main '$time_iso8601 [$msec] $remote_addr - $request'; - 注意:该值不是请求处理耗时,而是请求开始处理时的绝对时间点
避免混淆:$request_time 和 $upstream_response_time 不是抵达时间
这两个变量反映的是耗时,不是时间点:
-
$request_time:从接收到第一个字节到发送完最后一个响应字节的总耗时(单位:秒,精度毫秒) -
$upstream_response_time:Nginx 等待后端返回响应的时间(可能多个值,用逗号分隔) - 它们必须配合起始时间(如
$time_iso8601)才能推算出请求完成时刻
配置示例:记录高精度抵达时间
在 http 块中定义日志格式:
log_format detailed '$time_iso8601|$msec|$request_time|$upstream_response_time|$status|$request'; access_log /var/log/nginx/access.log detailed;
重启 Nginx 后,日志类似:
2024-07-24T10:32:15+08:00|1721788335.123|0.042|0.041|200|GET /api/user HTTP/1.1其中第一列即请求抵达并开始处理的时间点,第二列提供毫秒级对齐能力。


















