nginx日志配置
参考文档:Nginx基本配置和日志处理
Nginx 日志配置不同位置的不同含义:
-
在 nginx 配置文件的最外层,我们可以配置 error_log,这个 error_log 能够记录 nginx 启动过程中的异常,也能记录日常访问过程中遇到的错误。
-
在 http 段中可以配置 error_log 和 access_log,可以用于记录整个访问过程中成功的,失败的,错误的访问。
-
在 server 内部配置属于专门 server 的 error_log 和 access_log,这是我们常用的,不同业务日志分开。
最后我们需要知道的,越往配置里层,优先级越高,意味着 server 的日志记录以后并不会因为你在外层写了日志而再次记录。
在日志配置中,有如下关键字:
error_log logs/error.log error; -> 错误日志,级别:debug/info/notice/warn/error/crit/alert/emerg
access_log logs/access.log main; -> 正常访问日志,可以关闭:access_log off
open_log_file_cache max=1000 inactive=20s valid=1m min_uses=2; -> 日志写入都是经过打开,写入,关闭文件。该参数用于设置日志文件的缓存,默认 off
log_not_found on | off; -> 是否在 error_log 中记录不存在的错误,默认 on
log_subrequest on | off; -> 是否在 access_log 中记录子请求的记录,默认 off
rewrite_log on | off; -> 重写的日志,该日志只有在 rewrite 时候起作用,一般用于调试,默认 off
另外我们需要单独拿出来谈谈的是日志格式关键字:log_format
我们需要先知道的是,在 nginx 中内置了很多变量,我们都可以直接拿来使用,在日志这里我们常用的变量:
$remote_addr 客户端的 IP 地址
$remote_user 客户端用户名称
$time_local 当前时区时间
$time_iso8601 ISO8601 标准格式下的本地时间
$request 请求的 URL 与 HTTP 协议
$status 请求状态,成功 200
$body_bytes_sent 发送给客户端的主体文件大小
$http_referer 从哪个页面来的
$http_user_agent 客户端浏览器信息
$http_x_forwarded_for 客户端真实 IP
$connection 连接的序列号
$connection_requests 当前通过一个连接获取的请求数量
$msec 日志写入时间
$pipe pipeline 标识
$request_length 请求长度
$request_time 请求处理时间
我们先看下默认的配置:
log_format main \'$remote_addr - $remote_user [$time_local] "$request" \'
\'$status $body_bytes_sent "$http_referer" \'
\'"$http_user_agent" "$http_x_forwarded_for"\';
我们可以进行简单的改写,便于查看:
log_format mylog \'$remote_addr - $status $remote_user [$time_local] "$request" \'
\'[Bytes: $body_bytes_sent - Time: $request_time] "$http_referer" \'
\'"$http_user_agent" "$http_x_forwarded_for"\';
此时我们删除配置中原来的日志配置,修改为我们新的:
...
http {
...
log_format mylog \'$remote_addr - $status $remote_user [$time_local] "$request" \'
\'[Bytes: $body_bytes_sent - Time: $request_time] "$http_referer" \'
\'"$http_user_agent" "$http_x_forwarded_for"\';
access_log /data/logs/nginx/access.log mylog;
...
}
红色部分需要特别注意,我们改了这个格式的名字,自然使用的时候也要换成这个名字。
重载 nginx 后访问查看日志 /data/logs/nginx/access.log:
至于为啥状态码是 304 而不是 200,原因在于对于这种静态文件,nginx 在第一次访问的时候状态码 200,再次访问就是 304 了。
如果你还想 200,可以 ctrl + F5 强制刷新浏览器就是 200 了。 而且 304 可以发现其实服务器发送大小是 0 的。
至于针对单个 server(虚拟主机) 增加专门的日志,我们可以修改 demo.conf:
# 80 端口测试
server {
listen 80;
...
error_log /data/logs/nginx/demo-error.log info;
access_log /data/logs/nginx/demo-access.log mylog;
}
...
重载配置访问测试我们可以发现:
-
原本的 access.log 无论专门刷新也没有日志写入了。
-
在 /data/logs/nginx 目录下生成了我们刚刚配置的日志:
日志已经写到了新的文件里面!