Nginx 的 log_format 日志格式

业余杂谈 herman 381浏览
公告:“业余草”微信公众号提供免费CSDN下载服务(只下Java资源),关注业余草微信公众号,添加作者微信:xttblog,发送下载链接帮助你免费下载!
本博客日IP超过1800,PV 2600 左右,急需赞助商。
极客时间所有课程通过我的二维码购买后返现24元微信红包,请加博主新的微信号:xttblog,之前的微信号好友位已满,备注:返现
所有面试题(java、前端、数据库、springboot等)一网打尽,请关注文末小程序
视频教程免费领

基本上任何一个系统或者框架都有日志记录功能,Nginx 也不例外。

前面我在《昨天,我和黑客之间的一次攻防演练!》这篇文章中也使用到了 Nginx 的 access_log 日志。今天我们重点来说一下,Nginx 中的 log_format 日志格式的配置设置。

首先说明一点,Nginx 中的日志相关的配置指令,都在 ngx_http_log_module 模块中。

log_format 配置案例

log_format 的语法

log_format name string …;

参数解释如下:

  • name 表示格式名称
  • string 表示等义的格式

log_format 的默认值

log_format 有一个默认的无需设置的 combined 日志格式,相当于 apache 的 combined 日志格式。格式如下:

log_format  combined  '$remote_addr - $remote_user  [$time_local]  '
 ' "$request"  $status  $body_bytes_sent  '
 ' "$http_referer"  "$http_user_agent" ';

但是默认的日志并不完美。例如,当 nginx 位于负载均衡器,squid,nginx 反向代理之后,web 服务器无法直接获取到客户端真实的 IP 地址了。$remote_addr 获取反向代理的 IP 地址。反向代理服务器在转发请求的 http 头信息中,可以增加 X-Forwarded-For 信息,用来记录 客户端 IP 地址和客户端请求的服务器地址。

log_format 指令的配置段

log_format 指令的配置段是在 http 指令块中。

log_format 常用的变量参数

log_format 常用的变量参数

$remote_addr, $http_x_forwarded_for(反向) 记录客户端IP地址
$remote_user 记录客户端用户名称
$request 记录请求的URL和HTTP协议
$status 记录请求状态
$body_bytes_sent 发送给客户端的字节数,不包括响应头的大小; 该变量与Apache模块mod_log_config里的“%B”参数兼容。
$bytes_sent 发送给客户端的总字节数。
$connection 连接的序列号。
$connection_requests 当前通过一个连接获得的请求数量。
$msec 日志写入时间。单位为秒,精度是毫秒。
$pipe 如果请求是通过HTTP流水线(pipelined)发送,pipe值为“p”,否则为“.”。
$http_referer 记录从哪个页面链接访问过来的
$http_user_agent 记录客户端浏览器相关信息
$request_length 请求的长度(包括请求行,请求头和请求正文)。
$request_time 请求处理时间,单位为秒,精度毫秒; 从读入客户端的第一个字节开始,直到把最后一个字符发送给客户端后进行日志写入为止。
$time_iso8601 ISO8601标准格式下的本地时间。
$time_local 通用日志格式下的本地时间。

下面看一个简单的配置案例:

http {
  log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    '"$status" $body_bytes_sent "$http_referer" '
    '"$http_user_agent" "$http_x_forwarded_for" '
    '"$gzip_ratio" $request_time $bytes_sent $request_length';

  log_format  porxy  '$http_x_forwarded_for - $remote_user  [$time_local]  '
    ' "$request"  $status $body_bytes_sent '
    ' "$http_referer"  "$http_user_agent" ';

  log_format srcache_log '$remote_addr - $remote_user [$time_local] "$request" '
    '"$status" $body_bytes_sent $request_time $bytes_sent $request_length '
    '[$upstream_response_time] [$srcache_fetch_status] [$srcache_store_status] [$srcache_expire]';

  open_log_file_cache max=1000 inactive=60s;

  server {
    server_name ~^(www\.)?(.+)$;
    access_log logs/$2-access.log main;
    error_log logs/$2-error.log;
    location /srcache {
      access_log logs/access-srcache.log srcache_log;
    }
  }
}

关于 nginx 日志的其他配置指令:access_log(访问日志)、log_format(日志格式)、open_log_file_cache、log_not_found、log_subrequest、rewrite_log、error_log 等我们后面再讲。

业余草公众号

最后,欢迎关注我的个人微信公众号:业余草(yyucao)!可加QQ1群:135430763(2000人群已满),QQ2群:454796847(已满),QQ3群:187424846(已满)。QQ群进群密码:xttblog,想加微信群的朋友,之前的微信号好友已满,请加博主新的微信号:xttblog,备注:“xttblog”,添加博主微信拉你进群。备注错误不会同意好友申请。再次感谢您的关注!后续有精彩内容会第一时间发给您!原创文章投稿请发送至532009913@qq.com邮箱。商务合作可添加助理微信进行沟通!

本文原文出处:业余草: » Nginx 的 log_format 日志格式