nginx日志共有三个参数。access_log:定义日志的路径和格式。log_format:定义日志的模板。open_log_file_cache:定义日志文件缓存。nginx访问日志配置access_log日志配置access_log用于定义日志级别和日志位置。语法如下:日志级别:debug>info>notice>warn>error>crit>alert>emerg语法格式:access_logpath[format[buffer=size][gzip[=level]][flush=time][if=条件]];access_log关闭;默认:access_loglogs/access.log合并;范围:http,server,location,ifinlocation,limit_except?path指定存储日志的位置。?format指定日志的格式。默认情况下使用预定义组合。?buffer用于指定写入日志时的缓冲区大小。默认值为64k。?gzip日志在写入前被压缩。可以指定压缩率,1到9之间的值越大,压缩率越高,压缩速度越慢。默认值为1。?flush设置缓存的有效时间。如果超过flush指定的时间,缓存中的内容将被清空。?if条件判断。如果指定条件的计算结果为0或空字符串,则不会记录请求。此外,还有一项特殊的超值优惠。如果指定此值,则关闭当前范围内的所有请求日志记录。示例:基本用法access_log/var/logs/nginx-access.log本示例指定日志写入路径为/var/logs/nginx-access.log,日志格式使用默认组合。access_log/var/logs/nginx-access.logbuffer=32kgzipflush=1m本例指定日志写入路径为/var/logs/nginx-access.log,日志格式使用默认组合,并指定日志cachesize为32k,写入日志前启用gzip压缩,压缩率使用默认值1,缓存数据有效时间为1分钟。log_format定义日志格式语法格式:log_formatname[escape=default|json]string...;默认值:log_format组合“...”;范围:http?名称格式名称。在access_log指令中引用。?escape设置变量中的字符编码是json还是default,默认为default。?string要定义的日志格式的内容。可以有多个参数。Nginx变量可以在参数中使用。示例:access_log/var/logs/nginx-access.logmainlog_formatmain'$remote_addr-$remote_user[$time_local]"$request"''$status$body_bytes_sent"$http_referer"''"$http_user_agent""$http_x_forwarded_for"';我们使用log_format指令定义了一个主格式,并在access_log指令中引用了它。如果客户端发起请求:https://suyunfe.com/,我们看一下我截获的一个请求的日志记录:124.78.32.26--[12/Mar/2022:22:18:20+0800]"GET/HTTP/1.1"200569"-""Mozilla/5.0(Macintosh;IntelMacOSX10_15_7)AppleWebKit/537.36(KHTML,likeGecko)Chrome/99.0.4844.51Safari/537.36""-"我们看到最后的log记录中,$remote_user、$http_referer、$http_x_forwarded_for都对应一个-,因为这些变量都是空的。设置error_log错误日志在Nginx中通过error_log指令实现。该指令在请求处理期间记录服务器和错误消息。该语法配置错误日志文件的路径和日志级别。error_log文件[级别];默认值:error_log日志/error.log错误;第一个参数指定写入日志的位置。第二个参数指定日志级别。level可以是debug、info、notice、warn、error、crit、alert、emerg中的任意值。可以看出,取值范围是按紧迫性由低到高排列的。只有当日志的错误级别等于或高于level指定的值时,才会写入错误日志。默认值为错误。基本用法error_log/var/logs/nginx/nginx-error.log可以配置在:main,http,mail,stream,server,location范围。示例中指定错误日志的路径为:/var/logs/nginx/nginx-error.log,日志级别使用默认错误。常用日志记录变量?$remote_addr、$http_x_forwarded_for日志客户端IP地址。?$remote_user记录客户端用户名。?$request记录请求的URL和HTTP协议(??GET、POST、DEL等)。?$status记录请求状态。?$body_bytes_sent发送给客户端的字节数,不包括响应头的大小;此变量与Apache模块mod_log_config中的“%B”参数兼容。?$bytes_sent发送到客户端的字节总数。?$connection连接的序列号。?$connection_requests当前通过连接发出的请求数。?$msec日志写入时间。单位是秒,精度是毫秒。?$pipe如果请求是通过HTTP流水线(pipelined)发送的,pipe的值为“p”,否则为“.”。?$http_referer记录访问了哪个页面链接。?$http_user_agent记录客户端浏览器相关信息。?$request_length请求的长度(包括请求行、请求头和请求文本)。?$request_time请求处理时间,单位秒,精度毫秒;从第一个字节读入客户端,直到最后一个字符发送到客户端后写入日志。?$time_iso8601ISO8601标准格式的本地时间。?$time_local通用日志格式的本地时间。open_log_file_cache使用open_log_file_cache设置日志文件缓存(默认为关闭)。?max设置缓存中文件描述符的最大数量。如果缓存已满,将使用LRU算法关闭描述符。?inactive设置生存时间,默认为10s。?min_uses设置在非活动时间段内日志文件最少被使用的次数,日志文件描述符被记录在缓存中,默认为1次。?valid设置校验频率,默认为60s。?off禁用缓存。语法格式:open_log_file_cachemax=N[inactive=time][min_uses=N][valid=time];open_log_file_cache关闭;默认值:open_log_file_cacheoff;范围:http,服务器,位置示例open_log_file_cachemax=1000inactive=20svalid=1mmin_uses=2;它可以在http、服务器和位置范围内配置。在示例中,将缓存设置为最多缓存1000个日志文件描述符。如果缓存中的日志文件描述符在20秒内至少被访问两次,则不会被缓存关闭。每隔1分钟检查缓存中文件描述符的文件名是否还存在。nginx日志调试技巧设置Nginx只记录指定IP的错误当日志级别设置为debug时,如果调试在线高流量网站,错误日志可能会为每个请求记录很多消息,这将变得无用无意义。在events{...}中配置如下内容,使Nginx只记录来自指定IP的错误日志。事件{debug_connection1.2.3.4;}调试nginxrewrite规则调试rewrite规则时,如果规则写错了,只会看到404页面。可以在配置文件中开启nginxrewritelogs进行调试。服务器{error_log/var/logs/nginx/example.com.error.log;重写登录;}rewrite_log上;启用后,它将使用[notice]级别将所有重写相关的日志信息发送到error_log文件。然后可以在error_log中查看rewrite信息。使用location记录指定URL服务器的日志{error_log/var/logs/nginx/example.com.error.log;位置/static/{error_log/var/logs/nginx/static-error.log调试;}}配置完以上配置后,/static/相关的日志会单独记录在static-error.log文件中。常用示例main格式log_formatmain'$remote_addr-$remote_user[$time_local]"$request"''$status$body_bytes_sent"$http_referer"''"$http_user_agent""$http_x_forwarded_for"''$upstream_addr$upstream_response_time$request_time';access_loglogs/access.logmain;json格式log_formatlogstash_json'{"@timestamp":"$time_iso8601",''"host":"$server_addr",''"client":"$remote_addr",''"size":$body_bytes_sent,''"responsetime":$request_time,''"domain":"$host",''"url":"$request_uri",''"referer":"$http_referer",''"agent":"$http_user_agent",''"status":"$status",''"x_forwarded_for":"$http_x_forwarded_for"}';解释:$uri请求中的当前URI(不带请求参数,参数位于$args),与浏览器传递的$request_uri的值不同,可以通过内部重定向修改,或者使用index命令不包含协议和主机名,eg/foo/bar.html.$request_uri这个变量等于包含一些客户端请求参数的原始URI,不能修改,见$uri更改或重写URI.即:$request_uri是原始请求URL,$uri是nginx处理请求后去掉参数的URL,所以汉字会显示为union.坑点:使用$uri改变或改写中的URLnginx,但是可以用于日志输出用$request_uri代替,如果没有特殊的业务需求,可以完全替换,压缩格式日志中加入压缩信息http{log_formatcompression'$remote_addr-$remote_user[$time_local]''"$request"$status$body_bytes_sent''"$http_referer""$http_user_agent""$gzip_ratio"';服务器{gzip上;access_log/spool/logs/nginx-access.log压缩;...}}上游格式增加了上游消耗的时间。http{log_formatupstream_time'$remote_addr-$remote_user[$time_local]''"$request"$status$body_bytes_sent''"$http_referer""$http_user_agent"''rt=$request_timeuct="$upstream_connect_time"uht="$upstream_header_time"urt="$upstream_response_time"';服务器{access_log/spool/logs/nginx-access.logupstream_time;...}}总结在Nginx中,访问日志和错误日志是通过access_log和error_log指令配置的。通过log_format,我们可以自定义定义日志格式。如果日志文件路径中使用了变量,我们可以通过open_log_file_cache命令设置缓存来提高性能。另外access_log和log_format中用到了很多变量,这些变量就不一一列举了。详细的变量信息请参考Nginx官方文档查看日志使用技巧统计statusawk'{print$9}'access.log|出现次数排序|uniq-c|sort-rn364612004835009400330214031301显示URLawk'($9~/302/)'access.log|awk'{print$7}'|排序|uniq-c|sort-rn1/anyrtc.png1/test.html参考文档Nginx日志配置详解HowtoconfigurecustomaccessanderrorlogformatsinNginxFullExampleConfiguration
