Nginx日志配置

Posted Jerome12138

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Nginx日志配置相关的知识,希望对你有一定的参考价值。

nginx日志配置

参考文档:Nginx基本配置和日志处理

Nginx 日志配置不同位置的不同含义:

  1. 在 nginx 配置文件的最外层,我们可以配置 error_log,这个 error_log 能够记录 nginx 启动过程中的异常,也能记录日常访问过程中遇到的错误。

  2. 在 http 段中可以配置 error_log 和 access_log,可以用于记录整个访问过程中成功的,失败的,错误的访问。

  3. 在 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;
}
...

重载配置访问测试我们可以发现:

  1. 原本的 access.log 无论专门刷新也没有日志写入了。

  2. 在 /data/logs/nginx 目录下生成了我们刚刚配置的日志:

日志已经写到了新的文件里面!

以上是关于Nginx日志配置的主要内容,如果未能解决你的问题,请参考以下文章

nginx.conf 忽略了 nginx-ingress 配置映射片段

linux学习:Nginx--常见功能配置片段与优化-06

Nginx——Nginx启动报错Job for nginx.service failed because the control process exited with error code(代码片段

Nginx配置文件详细介绍

Nginx Nginx主机配置日志分割日志自动备份

argparse 代码片段只打印部分日志