nginx短篇(6):访问日志

  • 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指令还有一些别的用法,不过我们暂且先放下不聊,我们先来仔细看看默认的访问日志是什么样子的。

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

如果你并没有仔细研究过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"的日志格式,这个日志格式中记录了上述变量,那么这些变量分别代表了什么意思呢?我们来总结一下(此处先大致了解一下,不用纠结细节):

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

 

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

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

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

 

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

 

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

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

 

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

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

 

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

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

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

http, server, location, if in location, limit_except

 

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

  

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

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

目前评论:5   其中:访客  4   博主  1

    • avatar Dg 1

      我从awk命令开始拜读,从中受益了printf和正则,除了视频教程从没见过这么详细的文字教程,现在再到nginx这一块拜读,后续拜读zabbix,希望博主能出sed命令的文章~
      感谢博主的大力发表!

        • avatar 朱双印 Admin

          @Dg 回来找时间总结一下sed,加油~

            • avatar Dg 1

              @朱双印 加油加油!fighting!!

          • avatar 啦啦啦啦 1

            期待负载均衡和反向代理这部分的内容

            • avatar 文昌鱼 0

              在IT这么多年了,一直很羡慕能自己弄一个个人网站记录工作和平时所学的。每每有这种打算的时候,又怕自己坚持不下来;买服务器,注册域名又会觉得很麻烦