nginx短篇(6):访问日志

栏目: 服务器 · Nginx · 发布时间: 5年前

内容简介:所属分类:Nginx
  • A+

所属分类:Nginx 运维技术

博主会将与Nginx有关的知识点总结到"nginx短篇系列"文章中,如果你对nginx不是特别了解,请 按照顺序 阅读"nginx短篇系列",以便站在前文的基础上理解新的知识点。

当我们访问nginx服务时,nginx会记录日志,nginx日志分两种,一种是访问日志,一种是错误日志,访问日志记录在"access.log"文件中,错误日志记录在"error.log"文件中,这篇文章我们只关注访问日志的使用,也就是"access.log"。

如果你编译安装了nginx,默认情况下,access.log日志会放在nginx安装路径的logs目录中,如果你是通过yum源安装的nginx,那么access.log的默认路径为/var/log/nginx/access.log,当然,无论你通过哪种方式安装nginx,我们都可以自定义日志文件的路径,想要自定义访问日志文件的路径非常简单,我们只需要借助一条配置指令即可,这条配置指令就是access_log指令,比如,我们想要将访问日志写入到/opt/access.log文件中,那么只需要进行如下配置即可:

access_log /opt/access.log;

access_log指令还有一些别的用法,不过我们暂且先放下不聊,我们先来仔细看看默认的访问日志是什么样子的。

首先,打开你的谷歌浏览器,访问nginx默认的index.html页面,在浏览器的地址栏中输入"http://10.1.1.72/index.html"进行访问,然后,打开logs/access.log,你会发现类似如下的日志:

10.1.1.1 - - [09/Feb/2019:22:41:28 +0800] "GET /index.html HTTP/1.1" 200 612 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36"

如果你并没有仔细研究过nginx的访问日志,那么当你第一眼看到上述日志的时候,可能会有些懵逼,这一长串日志到底是什么意思呢?不要着急,我们慢慢聊。上述日志看似杂乱无章,其实是有一定的规律的,我们看到的日志之所以长成这个样子,都是因为一条配置指令决定的,这条配置指令就是"log_format"指令。

通过"log_format"指令可以指定访问日志都记录哪些内容,以怎样的格式记录这些内容,这样说可能不太容易理解,不如我们先来看一个简单的小示例,示例配置如下:

nginx短篇(6):访问日志

上述配置表示,我们通过"log_format"指令创建了一个"日志格式",这个"日志格式"的名字是"testformat","testformat"日志格式都会记录哪些内容呢?"testformat"日志格式会将"remote_addr"变量和"http_user_agent"变量中的内容记录到日志中,并且使用" - "作为分隔符将两个变量的内容分隔开,同时,使用双引号""将http_user_agent变量的内容引起,nginx中有很多内置变量,"remote_addr"变量和"http_user_agent"变量就是这些内置变量中的一员,使用"$变量名"即可调用变量,这些变量通常与http协议的请求和响应有关系,所以我们可以利用这些变量做很多事情,比如,利用它们记录访问日志。聪明如你,一定想到了,日志中记录什么内容,是由我们决定的,我们在日志格式中设置了A变量、B变量、C变量,那么日志文件中就会记录A变量的值,B变量的值,以及C变量的值。

比如:

如果我们设置的日志格式是"A变量 -- B变量 -- C变量",那么在日志中记录的就是"A值 -- B值 -- C值"。

如果我们设置的日志格式是"C变量 # A变量 - G变量 # B变量",那么在日志中记录的就是"C值 # A值 - G值 # B值"。

也就是说,记录哪些变量,以什么样的顺序记录这些变量,用什么符号将这些变量的值分隔开,都可以通过"log_format"这条配置指令进行控制。

看到此处,我们再回过头来看刚才的问题,为什么默认情况下我们看到的访问日志长成那个样子呢?这是因为,nginx有一个默认的日志格式,当我们没有在配置文件中明确定义自己的日志格式时,nginx会使用这个默认预定义的日志格式记录日志,这个日志格式的名字叫做"combined","combined"日志格式的具体配置如下:

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

如你所见,log_format配置指令的默认值就是这个名为"combined"的日志格式,这个日志格式中记录了上述变量,那么这些变量分别代表了什么意思呢?我们来总结一下(此处先大致了解一下,不用纠结细节):

$remote_addr变量:记录了客户端的IP地址(普通情况下)。
$remote_user变量:当nginx开启了用户认证功能后,此变量记录了客户端使用了哪个用户进行了认证。
$time_local变量:记录了当前日志条目的时间。
$request变量:记录了当前http请求的方法、url和http协议版本。
$status变量:记录了当前http请求的响应状态,即响应的状态码,比如200、404等响应码,都记录在此变量中。
$body_bytes_sent变量:记录了nginx响应客户端请求时,发送到客户端的字节数,不包含响应头的大小。
$http_referer变量:记录了当前请求是从哪个页面过来的,比如你点了A页面中的超链接才产生了这个请求,那么此变量中就记录了A页面的url。
$http_user_agent变量:记录了客户端的软件信息,比如,浏览器的名称和版本号。

这些变量并非一定会有对应的值,如果变量没有对应的值,那么日志中会使用 "-" 作为默认值进行占位。

你可能会有疑问,nginx中都有哪些变量能够使用呢?这些变量又都是什么含义呢?你可以从如下官网链接中找到答案:

http://nginx.org/en/docs/varindex.html

上述链接为官网提供的变量列表,我们能够从上述链接中找到能够使用的变量,其实,你需要搞明白一点,"变量"与"配置指令"一样,都是隶属于某个"模块"的,如果你想要使用某个"变量",则必须先确保你的nginx中包含了对应的"模块",不是所有"模块"都提供了可用的"变量",很多模块压根就没有对应的变量可用,在之前的文章中,我们已经总结了怎样通过官方手册找到"模块"的详细信息,以及"模块"都包含了哪些"指令",事实上你可以使用同样的方法,找到"模块"都包含了哪些可用的"变量",举一反三的时候到了,如果你找到了具体方法,欢迎在评论区留言,给出你的答案。

聊完这些,再次打开access.log日志文件,是不是觉得那些日志顺眼多了。

其实,"log_format"配置指令只负责定义"日志格式",如果想要使用对应的"日志格式",还需要与"access_log"指令结合起来使用,才能真正的实现我们的目的,也就是说,"log_format"负责定义日志格式,"access_log"负责使用定义好的日志格式。这样说不太容易理解,不如来看一个配置示例,如下:

log_format testformat '···一些变量的组合···';
access_log /opt/access.log testformat;

上例中,我们使用"log_format"指令定义了一个名为"testformat"的日志格式,然后使用"access_log"指令引用了"testformat"日志格式,"access_log /opt/access.log testformat"表示使用"testformat"日志格式记录日志,日志记录在"/opt/access.log"文件中。

在nginx中,log_format指令和access_log指令的默认值如下:

log_format combined '···各变量省略···';
access_log logs/access.log combined;

正是因为上述默认配置,决定了我们看到的日志的样子,如果你使用了yum源的方式安装了nginx,默认情况下你会在配置文件中找到一个名为"main"的日志格式,默认就是使用这个"main"日志格式记录访问日志的。

不过有一点仍然需要注意,那就是"log_format"指令和"access_log"指令所处的上下文位置。

"log_format"指令只能配置在"http块"中。

"access_log"指令可以配置在如下上下文中:

http, server, location, if in location, limit_except

"access_log"指令还有一些其他的参数我们没有聊到,不过最基础的参数我们已经总结完了,其他参数等用到的时候再行总结也不迟,关于nginx的访问日志,就先暂时总结到这里,希望能够对你有所帮助。

nginx短篇(6):访问日志

我的微信公众号

关注"实用运维笔记"微信公众号,当博客中有新文章时,可第一时间得知哦~


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Implementing Responsive Design

Implementing Responsive Design

Tim Kadlec / New Riders / 2012-7-31 / GBP 27.99

New devices and platforms emerge daily. Browsers iterate at a remarkable pace. Faced with this volatile landscape we can either struggle for control or we can embrace the inherent flexibility of the w......一起来看看 《Implementing Responsive Design》 这本书的介绍吧!

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试