nginx 日志中记录http响应头

背景:一个很简单的静态下载站点,每个文件都比较大,一般为30M+,现在想通过日志统计每个文件的下载完整情况。初步计划是在nginx日志中除了将下载的字节数之外,还要将原始文件的大小记录下来。不过如有range的请求情况下,这个值也不是很准确,但是有另外一个规律可寻,详见后面的测试结果。

google了大半天,发现nginx的log_format没有现成的变量将Content-Length记录下来,唯一的几篇抄来抄去的文章说是用$content_length,试过了这个变量是取不到header里面的Content-Length头的,
各种不靠谱,各种坑爹。

后来搜到了淘宝github上的一个文档

sent_http	ngx_http_variable_unknown_header_out

凭空感觉如果nginx内置变量记录到日志中的情况下,变量可以试试添加前缀sent_http,尝试了一下果然可以。

下面是测试情况:

原始文件大小为:43912736

# curl -I http://localhost/sudops.com.testfile.zip
HTTP/1.1 200 OK
Server: Nginx
Date: Wed, 27 Aug 2014 08:39:08 GMT
Content-Type: application/octet-stream
Content-Length: 43912736
Last-Modified: Tue, 19 Aug 2014 02:49:32 GMT
Connection: keep-alive
Xdebug: mytestnginx
Accept-Ranges: bytes

nginx.conf日志格式

    log_format  sudops_logs  '$remote_addr - $remote_user [$time_local] "$request" "$request_body" '
               '$status $body_bytes_sent "$http_referer" '
               '"$http_user_agent" $http_x_forwarded_for "$content_length" "$http_content_length" "$sent_http_content_length"';

从测试情况来看起作用的是”$sent_http_content_length,
$content_length” “$http_content_length”这两个均取不到值,网上的一些说法都有些误导。

一次性完整下载测试的日志:

10.233.11.107 - - [27/Aug/2014:16:37:56 +0800] "GET /sudops.com.testfile HTTP/1.0" "-" 200 43912736 "-" "Wget/1.11.4 Red Hat modified" - "-" "-" "43912736" 

断点续传测试的日志:

10.233.11.107 - - [27/Aug/2014:16:36:25 +0800] "GET /sudops.com.testfile.zip HTTP/1.0" "-" 200 2420430 "-" "Wget/1.11.4 Red Hat modified" - "-" "-" "43912736"
10.233.11.107 - - [27/Aug/2014:16:36:27 +0800] "GET /sudops.com.testfile.zip HTTP/1.0" "-" 206 7203351 "-" "Wget/1.11.4 Red Hat modified" - "-" "-" "41531726"
10.233.11.107 - - [27/Aug/2014:16:36:29 +0800] "GET /sudops.com.testfile.zip HTTP/1.0" "-" 206 4873191 "-" "Wget/1.11.4 Red Hat modified" - "-" "-" "34405755"
10.233.11.107 - - [27/Aug/2014:16:36:31 +0800] "GET /sudops.com.testfile.zip HTTP/1.0" "-" 206 9285310 "-" "Wget/1.11.4 Red Hat modified" - "-" "-" "29582204"
10.233.11.107 - - [27/Aug/2014:16:36:33 +0800] "GET /sudops.com.testfile.zip HTTP/1.0" "-" 206 2345930 "-" "Wget/1.11.4 Red Hat modified" - "-" "-" "20364054"
10.233.11.107 - - [27/Aug/2014:16:36:40 +0800] "GET /sudops.com.testfile.zip HTTP/1.0" "-" 206 9590450 "-" "Wget/1.11.4 Red Hat modified" - "-" "-" "18088204"
10.233.11.107 - - [27/Aug/2014:16:36:42 +0800] "GET /sudops.com.testfile.zip HTTP/1.0" "-" 206 8551774 "-" "Wget/1.11.4 Red Hat modified" - "-" "-" "8551774"

这个结果看上去很有规律,在断点续传情况下,range的作用会导致请求字节数有些叠加,总体来讲206+200的下载字节数之和基本等于初始文件大小。

u2

Related Posts

python cx-Oracle 驱动安装

安装oracle驱动 cx-Oracle驱动二进制版本下载地…

sqlalchemy.exc.TimeoutError: QueuePool limit of size 5 overflow 10 reached

Python3 + Flask + mysql5.7搭建的w…

One thought on “nginx 日志中记录http响应头

评论已关闭。

You Missed

雇佣AI员工,花钱上班:开发者的新”职场”荒诞剧

  • u2
  • 3月 1, 2026
  • 32 views
雇佣AI员工,花钱上班:开发者的新”职场”荒诞剧

OpenClaw 完整使用指南:自托管 AI Agent 的架构与实战

  • u2
  • 2月 25, 2026
  • 136 views
OpenClaw 完整使用指南:自托管 AI Agent 的架构与实战

Anthropic 推出 Claude Code Security:AI 驱动的代码安全神器

  • u2
  • 2月 24, 2026
  • 78 views

来自 OWASP 的代码安全检查工具:Dependency-Check,为你消除安全隐患

  • u2
  • 10月 16, 2025
  • 48 views
来自 OWASP 的代码安全检查工具:Dependency-Check,为你消除安全隐患

技术宅如何躲开越来越垃圾的CSDN?

  • u2
  • 4月 11, 2024
  • 35 views
技术宅如何躲开越来越垃圾的CSDN?

mysql连接失败:The driver has not received any packets from the server

  • u2
  • 3月 26, 2024
  • 39 views
mysql连接失败:The driver has not received any packets from the server