Road to growth of rookie

Meaningful life is called life

0%

Nginx logs

对于 web 服务器来说, 日志是不可缺少的一部分, 对于服务器排错、统计都很有用。nginx 的日志主要分为两种: access_log (访问日志) 和 error_log (错误日志)。通过访问日志我们可以获取到用户的 IP 地址、浏览器信息、请求处理时间等信息,而请求处理时间对于程序员来说是一个及其重要的东西, 毕竟它可以看出来你的代码烂不烂。错误日志记录了访问日志出错的信息, 可以帮我们快速定位错误的位置、原因等重要因素

image

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
2
3
4
access_log /var/logs/nginx-access.log main
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_frowarded_for"'

其中, 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 日志切割

默认情况下 nginx 会把所有的访问日志生成到一个指定的访问日志文件 access.log 中,但这样一来,时间长了就导致日志文件内容过大,不利于日志的分析或处理,因此,一般做法会将 nginx 的访问日志按天或按小时进行分割,分成不同的文件保存。

新建一个 shell 脚本 cut_nginx_log.sh,内容如下

1
2
3
4
5
6
7
8
#!/bin/sh
DateFormat=`date +%Y%m%d`
LogDir="/application/nginx/logs"
LogName="access_default";
[ -d $LogDir ] && cd $LogDir || exit 1
[ -f ${LogName}.log ] || exit 1
/bin/mv ${LogName}.log ${DateFormat}_${LogName}.log
/bin/touch ${LogName}.log

脚本实现切割 nginx 日志的思想,是将正在写入的 nginx 日志 access_defalut 修改为带日期的的格式文件 xxx_xx_xx_access_default, 然后新建一个 access_default 文件

通过定时任务的方式实现每日 00 点整定时执行 cut_nginx_log.sh 切割日志,将以下内容写入到 /var/spool/cron/root

1
2
#每日0点切割nginx日志 \
00 00 * * * /bin/sh script_path/cut_nginx_log.sh > /dev/null 2>&1

查看 crontab 是否添加成功

1
2
3
4
$ crontab -l

#每日0点切割nginx日志 \
00 00 * * * /bin/sh script_path/cut_nginx_log.sh > /dev/null 2>&1