内容简介:所属分类: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"指令可以指定访问日志都记录哪些内容,以怎样的格式记录这些内容,这样说可能不太容易理解,不如我们先来看一个简单的小示例,示例配置如下:
上述配置表示,我们通过"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的访问日志,就先暂时总结到这里,希望能够对你有所帮助。
我的微信公众号
关注"实用运维笔记"微信公众号,当博客中有新文章时,可第一时间得知哦~
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- Goaccess - 访问日志
- 使用Fluentd + Elasticsearch收集访问日志
- nginx tcp stream 访问日志配置的优化
- Spring Boot从入门到实战:集成AOPLog来记录接口访问日志
- 10年大数据架构师:日访问百亿级,如何架构并优化日志系统?
- Go Web编程--给自己写的服务器添加错误和访问日志
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
游戏化思维
[美] 凯文·韦巴赫(Kevin Werbach)、[美] 丹·亨特(Dan Hunter) / 周逵、王晓丹 / 浙江人民出版社 / 2014-4 / 36.90
[内容简介] ●本书由开设了全世界第一个游戏化课程的沃顿商学院副教授凯文·韦巴赫和丹·亨特所著,第一次全面系统地介绍游戏化的理论,阐述了如何将游戏的理念应用到商业实践中。 ●作者指出,在商业竞争日益激烈的今天,传统的激励方式渐渐失效,未来的管理将更多地建立在员工和消费者的内在动机和自我激励上。这些制作精良、设计巧妙的游戏建立在多年来对人类动机和人类心理的研究基础之上,可以最大限度地激发......一起来看看 《游戏化思维》 这本书的介绍吧!