nginx支持两种日志:error_log 和 access_log

1.error_log

nginx 日志级别支持:debug | info | notice | warn | error | crit | alert | emerg,错误级别从左到右越来越大。

nginx日志保存位置支持:syslog(远端日志服务器),内存,本地保存

error_log语法格式

Syntax:    error_log file [level];
Default:   error_log logs/error.log error;
error_log logs/error.log error;
Context:    main, http, mail, stream, server, location

内存(memory)

我们在配置存储路径时,还可以配置memory,而这种配置效果,更多的是在测试Debug阶段。正式上线阶段一般不使用该配置。示例效果如下:

error_log memory:32m debug;

error_log 可以在main,http,mail,stream,server,loaction 范围中定义。

通常默认情况下会在main中创建。我们也可以根据自己的需求,在不同的权限范围中定义不同的error错误输出等级和地址。

stream(需要nginx 1.7.11版本及以上),mail(需要nginx 1.9.0版本及以上)。

示例:

error_log /path/to/log debug;
http {
    server {
        error_log /path/to/log debug;
        ...
    }    

大部分情况下,我们都是创建一个main级别的就可以了。没有必要创建server级别的。如果我们定义了server级别的,建议可以注释掉main级别的。

我们默认安装,没有修改过error日志时,nginx提供的默认日志,将error.log 文件导出后效果如下:

2022/11/17 03:35:10 [warn] 2121534#2121534: *1779322 an upstream response is buffered to a temporary file 后面我就省略了
2022/11/17 09:08:44 [crit] 2121534#2121534: *1783300 SSL_do_handshake() failed (SSL: error:141CF06C:SSL routines:tls_parse_ctos_key_share:bad key share) while SSL handshaking,后面我就省略了
2022/11/17 17:07:17 [emerg] 2312144#2312144: unknown directive "if($http_user_agent" in /etc/nginx/nginx.conf:8

2. access_log

access_log: 记录nginx每一次的http请求的访问状态,主要用于去分析每一次http的请求和客户端的交互以及对行为的一些分析。

Nginx官网文档地址:http://nginx.org/en//docs/http/ngx_http_log_module.html#access_log

access_log语法格式

Syntax: access_log path [log_format [buffer=size] [gzip[=level]] [flush=time] [if=condition]];
access_log off;
Default: access_log logs/access.log combined;
Context: http, server, location, if in location, limit_except
  • path 指定日志的存放位置。

  • log_format 指定日志的格式。默认使用预定义的combined。

  • buffer 用来指定日志写入时的缓存大小。默认是64k。

  • gzip 日志写入前先进行压缩。压缩率可以指定,从1到9数值越大压缩比越高,同时压缩的速度也越慢。默认是1。

  • flush 设置缓存的有效时间。如果超过flush指定的时间,缓存中的内容将被清空。

  • if 条件判断。如果指定的条件计算为0或空字符串,那么该请求不会写入日志。

log_format的配置,nginx的日志里面记录的信息可以理解为就是log_format,但是log_format又是一个一个的变量拼接起来的,所以下面来看看log_format。Nginx官网文档地址:http://nginx.org/en//docs/http/ngx_http_log_module.html#log_format

官网对log_format配置的介绍是"指定日志格式",语法格式如下示:

Syntax: log_format name [escape=default|json|none] string ...;
Default: log_format combined "...";
Context: http

代码示例:

log_format http '$remote_addr - $remote_user [$time_local] "$request" '
                 '$status $body_bytes_sent "$http_referer" '
                 '"$http_user_agent" "$http_x_forwarded_for"';
access_log  /var/log/nginx/access.log  http;

语法分析:

语法中的 name=http , 然后 [escape=default|json|none]这些参数都没有填 , 语法中的 string就是后面所有的字符串了 , 示例中string 的值全是不同的变量拼接的一个字符串 , 所以下面还得接着看看Nginx变量的介绍。name写明了http , 那log_format就只能配置在http模块中,不要配置在server中了,server属于http模块中的子模块了。

下面是一个请求的日志记录:

112.195.209.90 - - [20/Feb/2018:12:12:14 +0800] "GET / HTTP/1.1" 200 190 "-" "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Mobile Safari/537.36" "-"

我们看到最终的日志记录中

http_referer、$http_x_forwarded_for都对应了一个”-“,这是因为这几个变量为空。

3.Nginx变量

nginx的变量主要分三种:

http内核模块提供的变量

变量名

作用

$arg_PARAMETER

HTTP请求中某个参数的值,如/index.php?site=www.ttlsa.com,可以用$arg_site 取得www.ttlsa.com这个值.

$args

HTTP请求中的完整参数。例如,在请求/index.php?width=400&height=200 中,$args表示字符串width=400&height=200.

$binary_remote_addr

二进制格式的客户端地址。例如:\\x0A\\xE0B\\x0E

$body_bytes_sent

表示在向客户端发送的http响应中,包体部分的字节数

$content_length

表示客户端请求头部中的Content-Length 字段

$content_type

表示客户端请求头部中的Content-Type 字段

$cookie_COOKIE

表示在客户端请求头部中的cookie 字段

$document_root

表示当前请求所使用的root 配置项的值

$document_uri

与$uri 含义相同

$Host

表示客户端请求头部中的Host字段。如果Host字段不存在,则以实际处理的server(虚拟主机)名称代替。如果Host字段中带有端口,如IP:PORT,那么$host是去掉端口的,它的值为IP。

$host

是全小写的。这些特性与http_HEADER中的http_host不同,http_host只取出Host头部对应的值。

$hostname

表示 Nginx所在机器的名称,与 gethostbyname调用返回的值相同

$http_HEADER

表示当前 HTTP请求中相应头部的值。HEADER名称全小写。例如,示请求中 Host头部对应的值 用 $http_host表

$is_args

表示请求中的 URI是否带参数,如果带参数,$is_args值为 ?,如果不带参数,则是空字符串

$limit_rate

表示当前连接的限速是多少,0表示无限速

$nginx_version

表示当前 Nginx的版本号

$query_string

请求 URI中的参数,与 $args相同,然而 $query_string是只读的不会改变

$remote_addr

表示客户端的地址

$remote_port

表示客户端连接使用的端口

$remote_user

表示使用 Auth Basic Module时定义的用户名

$request_body

表示HTTP请求中的包体,该参数只在 proxy_pass或 fastcgi_pass中有意义

$request_body_file

表示 HTTP请求中的包体存储的临时文件名

$request_completion

当请求已经全部完成时,其值为 “ok”。若没有完成,就要返回客户端,则其值为空字符串;或者在断点续传等情况下使用 HTTP range访问的并不是文件的最后一块,那么其值也是空字符串。

$request_filename

表示用户请求中的 URI经过 root或 alias转换后的文件路径

$request_method

表示 HTTP请求的方法名,如 GET、PUT、POST等

$request

完整的原始请求行,如 "GET / HTTP/1.1"

$http_x_forwarded_for

当前端有代理服务器时,设置web节点记录客户端地址的配置,此参数生效的前提是代理服务器也要进行相关的x_forwarded_for设置。

$request_uri

表示客户端发来的原始请求URI,带完整的参数。

$scheme

表示HTTP scheme,如在请求 https://nginx.com/中表示 https

$sent_http_HEADER

表示返回客户端的 HTTP响应中相应头部的值。HEADER名称全小写。例如,用 $sent_ http_content_type表示响应中 Content-Type头部对应的值

$server_addr

表示服务器地址

$server_name

表示服务器名称

$server_port

表示服务器端口

$server_protocol

表示服务器向客户端发送响应的协议,如 HTTP/1.1或 HTTP/1.0

$uri

表示当前请求的URI,不带任何参数

$uri和$document_uri

未必是用户的原始请求,在内部重定向后可能是重定向后的URI,而$request_uri 永远不会改变,始终是客户端的原始URI.

内置变量

可以打开Nginx官方文档http://nginx.org/en//docs/http/ngx_http_log_module.html#log_format查看

变量名

作用

$bytes_sent

发送的字节数的客户端

$connection

连接序号

$connection_requests

在当前经由一个连接 (1.1. 18)

$msec

时间在毫秒和秒的分辨率在写日志

$pipe

如果请求是通过http流水线发送,则其值为"p",否则为“."

$request_length

请求 ( 包含请求行、报头和请求主体)

$request_time

请求处理时间 (以秒和毫秒的分辨率 ;经过的时间之间的第一字节读取到客户端和服务器的日志写入的最后一个字节后被传送至客户端

$status

状态响应

$time_iso8601

当地时间在 ISO 8601 格式标准

$time_local

在当地时间的公共日志格式

自定义变量

可以在代码中增加自己需要的内容作为自动变量,并在日志中打印。

4.日志轮转

日志保存时间

error日志和运行access日志的存储时间是一个值,配置路径为:

vim /etc/logrotate.d/nginx

通过修改rotate参数值,就可以修改日志的存储时间了。通过vim命令打开文件:vim /etc/logrotate.d/nginx可以看到下面

/var/log/nginx/*.log {
       ...
        rotate 60
        ...
}

其中的rotate 就是nginx日志保留时间了。例如上面配置中的60(天),我们可以根据自己的需求修改为其他整数日期,根据自己项目需要修改为对应的天数即可。修改完毕后,需要执行:

logrotate /etc/logrotate.d/nginx

就可以让配置生效了。

日志分隔

编写nginx日志分割脚本

[root@localhost ~]# vim /usr/local/nginx/logs/NginxLogRotate.sh
#!/bin/bash 
LOGS_PATH=/usr/local/nginx/logs 
YESTERDAY=$(date -d "yesterday" +%Y-%m-%d) 
cp ${LOGS_PATH}/access.log ${LOGS_PATH}/access_${YESTERDAY}.log && >${LOGS_PATH}/access.log
cp ${LOGS_PATH}/error.log ${LOGS_PATH}/error_${YESTERDAY}.log && >${LOGS_PATH}/error.log

2、设置定时任务运行脚本

[root@localhost ~]# crontab -e
0 0 * * *  /usr/local/nginx/logs/NginxLogRotate.sh

定时任务每天00:00执行脚本/usr/local/nginx/logs/NginxLogRotate.sh,实现定时自动分割Nginx日志(包括访问日志和错误日志),这样Nginx每天都会生成一个新的日志文件。

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐