nginx日志配置

本文详细介绍了如何配置Nginx的access_log,包括日志级别、日志位置、log_format定义、open_log_file_cache缓存设置,以及各种调试技巧。还提供了如main、json、压缩和upstream等不同格式的日志示例,并给出了统计日志状态码出现次数的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

nginx access日志配置

access_log日志配置

access_log用来定义日志级别,日志位置。语法如下:
日志级别: debug > info > notice > warn > error > crit > alert > emerg

语法格式: access_log path [format [buffer=size] [gzip[=level]] [flush=time] [if=condition]];
access_log off;
默认值 : access_log logs/access.log combined;
作用域 : http, server, location, if in location, limit_except
实例一:

access_log /spool/logs/nginx-access.log compression buffer=32k;
log_format 定义日志格式

语法格式: log_format name [escape=default|json] string …;
默认值 : log_format combined “…”;
作用域 : http
实例一:

log_format compression '$remote_addr - r e m o t e u s e r [ remote_user [ remoteuser[time_local] ’
‘"$request" $status KaTeX parse error: Double superscript at position 37: … '̲"http_referer" “ h t t p u s e r a g e n t " " http_user_agent" " httpuseragent""gzip_ratio”’;

access_log /spool/logs/nginx-access.log compression buffer=32k;
常见的日志变量

$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_iso8601 ISO8601标准格式下的本地时间。
$time_local通用日志格式下的本地时间。
open_log_file_cache

使用open_log_file_cache来设置日志文件缓存(默认是off)。

max:设置缓存中的最大文件描述符数量,如果缓存被占满,采用LRU算法将描述符关闭。
inactive:设置存活时间,默认是10s
min_uses:设置在inactive时间段内,日志文件最少使用多少次后,该日志文件描述符记入缓存中,默认是1次
valid:设置检查频率,默认60s
off:禁用缓存
语法格式: open_log_file_cache max=N [inactive=time] [min_uses=N] [valid=time];
open_log_file_cache off;
默认值: open_log_file_cache off;
作用域: http, server, location
实例一

open_log_file_cache max=1000 inactive=20s valid=1m min_uses=2;
nginx日志调试技巧

设置 Nginx 仅记录来自于你的 IP 的错误

当你设置日志级别成 debug,如果你在调试一个在线的高流量网站的话,你的错误日志可能会记录每个请求的很多消息,这样会变得毫无意义。

在events{…}中配置如下内容,可以使 Nginx 记录仅仅来自于你的 IP 的错误日志。

events {
debug_connection 1.2.3.4;
}
调试 nginx rewrite 规则

调试rewrite规则时,如果规则写错只会看见一个404页面,可以在配置文件中开启nginx rewrite日志,进行调试。

server {
error_log /var/logs/nginx/example.com.error.log;
rewrite_log on;
}
rewrite_log on; 开启后,它将发送所有的 rewrite 相关的日志信息到 error_log 文件中,使用 [notice] 级别。随后就可以在error_log 查看rewrite信息了。

使用location记录指定URL的日志

server {
error_log /var/logs/nginx/example.com.error.log;
location /static/ {
error_log /var/logs/nginx/static-error.log debug;
}
}
配置以上配置后,/static/ 相关的日志会被单独记录在static-error.log文件中。

nginx日志共三个参数
access_log: 定义日志的路径及格式。
log_format: 定义日志的模板。
open_log_file_cache: 定义日志文件缓存。

proxy_set_header X-Forwarded-For :如果后端Web服务器上的程序需要获取用户IP,从该Header头获取。proxy_set_header X-Forwarded-For $remote_addr;

常用例子

main格式

log_format main '$remote_addr - r e m o t e u s e r [ remote_user [ remoteuser[time_local] “KaTeX parse error: Double superscript at position 34: … '̲status b o d y b y t e s s e n t " body_bytes_sent " bodybytessent"http_referer” ’
‘“ h t t p u s e r a g e n t " " http_user_agent" " httpuseragent""http_x_forwarded_for”’
'$upstream_addr $upstream_response_time $request_time ';
access_log logs/access.log main;
json格式

log_format logstash_json ‘{"@timestamp":“KaTeX parse error: Double superscript at position 24: …8601",' '̲"host": "server_addr”,’
‘“client”: “$remote_addr”,’
‘“size”: $body_bytes_sent,’
‘“responsetime”: KaTeX parse error: Double superscript at position 23: …_time,' '̲"domain": "host",’
‘“url”:“KaTeX parse error: Double superscript at position 23: …_uri",' '̲"referer": "http_referer”,’
‘“agent”: “KaTeX parse error: Double superscript at position 27: …gent",' '̲"status":"status”,’
‘“x_forwarded_for”:"$http_x_forwarded_for"}’;
解释:
u r i 请 求 中 的 当 前 U R I ( 不 带 请 求 参 数 , 参 数 位 于 uri请求中的当前URI(不带请求参数,参数位于 uriURI(args),不同于浏览器传递的$request_uri的值,它可以通过内部重定向,或者使用index指令进行修改。不包括协议和主机名,例如/foo/bar.html。
r e q u e s t u r i 这 个 变 量 等 于 包 含 一 些 客 户 端 请 求 参 数 的 原 始 U R I , 它 无 法 修 改 , 请 查 看 request_uri 这个变量等于包含一些客户端请求参数的原始URI,它无法修改,请查看 requesturiURIuri更改或重写URI。
也就是说: r e q u e s t u r i 是 原 始 请 求 U R L , request_uri是原始请求URL, requesturiURLuri则是经过nginx处理请求后剔除参数的URL,所以会将汉字表现为union。
坑点:
使用 u r i 可 以 在 n g i n x 对 U R L 进 行 更 改 或 重 写 , 但 是 用 于 日 志 输 出 可 以 使 用 uri 可以在nginx对URL进行更改或重写,但是用于日志输出可以使用 uringinxURL使request_uri代替,如无特殊业务需求,完全可以替换。

压缩格式

日志中增加了压缩的信息。

http {
log_format compression '$remote_addr - r e m o t e u s e r [ remote_user [ remoteuser[time_local] ’
‘"$request" $status KaTeX parse error: Double superscript at position 46: … '̲"http_referer" “ h t t p u s e r a g e n t " " http_user_agent" " httpuseragent""gzip_ratio”’;

server {
    gzip on;
    access_log /spool/logs/nginx-access.log compression;
    ...
}

}
upstream格式

增加upstream消耗的时间。

http {
log_format upstream_time '$remote_addr - r e m o t e u s e r [ remote_user [ remoteuser[time_local] ’
‘"$request" $status KaTeX parse error: Double superscript at position 48: … '̲"http_referer" “KaTeX parse error: Double superscript at position 48: … '̲rt=request_time uct=“ u p s t r e a m c o n n e c t t i m e " u h t = " upstream_connect_time" uht=" upstreamconnecttime"uht="upstream_header_time” urt=”$upstream_response_time"’;

server {
    access_log /spool/logs/nginx-access.log upstream_time;
    ...
}

}
参考文档

统计status 出现的次数

awk ‘{print $9}’ access.log | sort | uniq -c | sort -rn

36461 200
483 500
87 404
9 400
3 302
1 499
1 403
1 301
显示返回302状态码的URL。

awk ‘($9 ~ /302/)’ access.log | awk ‘{print $7}’ | sort | uniq -c | sort -rn

1 /wp-login.php
1 /wp-admin/plugins.php?action=activate&plugin=ewww-image-optimizer%2Fewww-image-optimizer.php&_wpnonce=cc4a379131
1 /wp-admin/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值