对于 web
服务器来说, 日志是不可缺少的一部分, 对于服务器排错、统计都很有用。nginx
的日志主要分为两种: access_log
(访问日志) 和 error_log
(错误日志)。通过访问日志我们可以获取到用户的 IP
地址、浏览器信息、请求处理时间等信息,而请求处理时间对于程序员来说是一个及其重要的东西, 毕竟它可以看出来你的代码烂不烂。错误日志记录了访问日志出错的信息, 可以帮我们快速定位错误的位置、原因等重要因素
nginx
错误日志信息介绍
配置记录 nginx
的错误信息是调试 nginx
服务的重要手段,属于核心功能模块 ngx_core_module
的参数,该参数名为 error_log
,可以放在 Main
区块中作为全局配置,也可以单独放在不同的虚拟主机中单独记录error_log
的语法格式及参数说明如下:
error_log | file_path | level |
---|---|---|
关键字 | 日志文件路径 | 错误级别 |
其中,关键字 error_log
不能改变,日志文件路径可以指定任意存放日志的目录,错误级别常见的有 [debug|info|notice|warn|error|crit|alert|emerg]
,级别越高纪录的信息越少,生产环境一般是 [warn|error|crit]
这三个级别之一
注意:尽量不要配置
info
等较低级别的错误级别,这样会带来大量的I/O
消耗
error_log
的默认值为:
1 | default: error_log logs/error.log error; |
可以放置的标签段为
1 | context: main; http; server; location |
nginx
访问日志介绍
nginx
会把每个用户访问网站的日志信息记录到自定的日志文件中,供网站提供者分析用户的浏览行为等。客户端向 nginx
服务器发起的每一次请求都会记录到访问日志中,客户端IP,浏览器信息, referer
, 请求处理时间, 请求URL等都可以在访问日志中得到。当然具体要记录哪些信息,你可以通过 log_format
指令定义。此功能由 ngx_http_log_module
模块负责
nginx
访问日志语法:
1 | access_log path [format [buffer=size] [gzip[=level]] [flush=time] [if=condition]]; |
参数 | 说明 |
---|---|
path | 指定日志的存放位置 |
format | 用来定义记录日志的格式(可以定义多种日志格式,取不同的名字即可) |
access_log | 用来自定日志文件的路径及使用何种日志格式记录日志 |
buffer | 用来指定日志写入时的缓存大小。默认是64k |
gzip | 日志写入前先进行压缩。压缩率可以指定,从1到9数值越大压缩比越高,同时压缩的速度也越慢。默认是1 |
flush | 设置缓存的有效时间。如果超过flush指定的时间,缓存中的内容将被清空 |
if | 条件判断。如果指定的条件计算为0或空字符串,那么该请求不会写入日志 |
一般场景中,这些参数都不用配置,极端优化时才可能会考虑这些参数
access_log off
中的off
,表示不记录访问日志
使用 log_format
自定义访问日志格式
日志格式定义说明
定义语法
1 | log_format name [escape=default|json] string ...; |
如下例:
1 | access_log /var/logs/nginx-access.log main |
其中, log_format
为日志格式关键参数,不能随意改变。main
是为日志格式指定的标签,记录日志时会通过这个 main
标签选择指定的格式。标签后面跟着的都是可以记录的日志信息。
具体日志参数信息如下:
nginx 日志变量 | 说明 |
---|---|
$remote_addr | 记录访问网站的客户端IP地址 |
$http_x_forwarded_for | 当前端游代理服务器时,是指 Web 节点记录客户端地址的配置,此参数生效的前提是代理服务器上也进行了相关的 x_forwarded_for 设置 |
$remote_user | 远程客户端名称 |
$time_local | 记录访问时间与时区 |
$request | 用户的 http 请求起始行信息 |
$status | http 状态码,记录请求返回的状态,例如:200、404、301 等 |
$body_bytes_sents | 服务器发送给客户端的响应的 body 字节数 |
$http_referer | 记录此次请求是从哪个链接访问过来的,可以根据 referer 进行防盗链设置 |
$http_user_agent | 记录客户端访问信息,例如:浏览器、手机客户端等 |
所有的日志段以空格分割,一行可以记录多个
在没有特殊要求的情况下,采用默认配置即可,更多可以设置的目录日志信息的变量见 nginx日志变量
访问日志可以放置的标签段为
1 | context: http; server; location; if in location; limit_except |
nginx
日志切割
默认情况下 nginx
会把所有的访问日志生成到一个指定的访问日志文件 access.log
中,但这样一来,时间长了就导致日志文件内容过大,不利于日志的分析或处理,因此,一般做法会将 nginx
的访问日志按天或按小时进行分割,分成不同的文件保存。
新建一个 shell
脚本 cut_nginx_log.sh
,内容如下
1 | !/bin/sh |
脚本实现切割
nginx
日志的思想,是将正在写入的nginx
日志access_defalut
修改为带日期的的格式文件xxx_xx_xx_access_default
, 然后新建一个access_default
文件
通过定时任务的方式实现每日 00 点整定时执行 cut_nginx_log.sh
切割日志,将以下内容写入到 /var/spool/cron/root
中
1 | #每日0点切割nginx日志 \ |
查看 crontab
是否添加成功
1 | $ crontab -l |