本文就主要介绍nginx日志的配置、切割及简单的日志分析。
日志格式通过配置文件 log_format 定义。
log_format main '$remote_addr - remote_user [time_local] "$request" '
'$status body_bytes_sent "http_referer" '
'"http_user_agent" "http_x_forwarded_for"';
注:如果Nginx作为负载均衡器,web服务器无法直接获取到客户端真实的IP地址。$remote_addr获取的是反向代理的IP地址。此时,http_x_forwarded_for可以记录客户端的IP地址。
$remote_addr $http_x_forwarded_for 记录客户端的IP地址。 $remote_user 记录客户端用户名称 如果网站不加密 显示"-"。 $time_local 通用日志格式的本地时间。 $request 客户端请求的URL(get下载 post上传)和 http协议。 $status 请求的状态码。 $body_bytes_sent 发送给客户端的字节数,不包括响应头的大小。 $http_referer 从哪个页面跳转过来的。 $http_user_agent 客户端浏览器的信息。 $bytes_sent 发送给客户端的总字节数。 $msec 日志写入时间。单位为秒,精度是毫秒。 $request_time 请求处理时间,单位为秒,精度毫秒;从读入客户端的第一个字节开始,直到把最后一个字符发送给客户端后进行日志写入为止。 $time_iso8601 ISO8601标准格式下的本地时间。
1. 缓存设置
open_log_file_cache max=1000 inactive=20s valid=1m min_uses=2;
max: 设置缓存中的最大文件描述符数量,如果缓存被占满,采用LRU算法将描述符关闭。 inactive: 设置存活时间,默认是10s。 min_uses: 设置在inactive时间段内,日志文件最少使用多少次后,该日志文件描述符记入缓存中,默认是1次。 valid: 设置检查频率,默认60s。 off: 禁用缓存。
2. 作用位置
http{} 将整个服务器所有网站,所有页面的日志进行缓存。 server{} 将某一个网站的所有页面日志,进行缓存。 location{} 某一个页面的日志,进行缓存。
1. 切割配置文件
cd /etc/logrotate.d/
cat nginx
/var/log/nginx/*.log { # 待切割的日志
daily # 每天轮转一次
missingok # 丢失不提醒
rotate 52 # 保留52份
compress # 压缩
delaycompress # 不要将最近一次轮转的日志压缩
notifempty # 空日志不轮转
create 640 root root # 创建新的日志文件 ,属主属组
copytruncate # 将原始文件拷贝,并清空原始文件(程序无pid文件时候使用)
sharedscripts # 轮转后脚本
postrotate
if [ -f /var/run/nginx.pid ]; then
kill -HUP `cat /var/run/nginx.pid`
fi
endscript
}
2. 日志切割原理
/etc/cron.daily: # logrotate默认配置就在/etc/cron.daily目录下,所以每日都会执行logrotate logrotate man-db.cron mlocate /etc/cron.monthly: /etc/cron.weekly:
cat /etc/anacrontab
SHELL=/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
RANDOM_DELAY=45 # 延迟时间,最大延迟45min
START_HOURS_RANGE=3-22 # logrotate允许执行的时间范围
1 5 cron.daily nice run-parts /etc/cron.daily
7 25 cron.weekly nice run-parts /etc/cron.weekly
@monthly 45 cron.monthly nice run-parts /etc/cron.monthly
整个流程:
nginx常用的统计案例:
grep '15/Nov/2020' /var/log/nginx/access.log |wc -l
grep '15/Nov/2020' /var/log/nginx/access.log |awk
'{ips[$1]++} END{for(i in ips){print i,ips[i]}}' |sort -k2 -rn |head -10
grep '15/Nov/2020' /var/log/nginx/access.log |awk
'{ips[$1]++} END{for(i in ips){if(ips[i]>100)print i,ips[i]}}'
grep '15/Nov/2020' /var/log/nginx/access.log |awk
'{url[$7]++} END{for(i in url){print i,url[i]}}' |sort -k2 -rn |head -10
grep '15/Nov/2020' /var/log/nginx/access.log |awk '{
urls[$7]++; size[$7]+=$10}END{for(i in urls){print urls[i],size[i],i}}'|sort -k1 -rn | head -n10
grep '15/Nov/2020' /var/log/nginx/access.log | awk
'{if($9="404"){ip_code[$1" "$9]++}}END{for(i in ip_code){print i,ip_code[i]}}'
date=(date -d '-1 minute' +%d/%b/%Y:%H:%M);awk -v date=date
'$0 ~ date {i++} END{print i}' /var/log/nginx/access.log
awk '$4>="[15/Nov/2020:08:30:00" && $4<="[15/Nov/2020:09:00:00" {if($9="404"){ip_code[$1"
"$9]++}}END{for(i in ip_code){print i,ip_code[i]}}' /var/log/nginx/access.log

本文作者:赵建强(上海新炬中北团队)
本文来源:“IT那活儿”公众号

文章转载自IT那活儿,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




