05.Nginx日志管理


文章目录

  • 一. 访问日志
  • 二. 错误日志
  • 三. 日志切割
  • 四. 日志统计
    • 1. IP统计
    • 2. 页面统计
    • 3. 按时统计
    • 4. 性能分析
    • 5. 爬虫统计
    • 6. 连接统计

一. 访问日志 变量说明:
名称 说明
$remote_addr 客户端地址
$remote_user 客户端用户名称
$time_local 访问时间和时区
$request 请求的URI和HTTP协议
$http_host 请求地址,即浏览器中你输入的地址(IP或域名)
$status HTTP请求状态
$upstream_status upstream状态
$body_bytes_sent 发送给客户端文件内容大小
$http_referer url跳转来源
$http_user_agent 用户终端浏览器等信息
$ssl_protocol SSL协议版本
$ssl_cipher 交换数据中的算法
$upstream_addr 后台upstream的地址,即真正提供服务的主机地址
$request_time 整个请求的总时间
$upstream_response_time 请求过程中,upstream响应时间
$http_x_forwarded_for 可以记录客户端IP,通过代理服务器来记录客户端的ip地址
配置示例:
usernobody; worker_processes1; events { worker_connections1024; }#全局错误日志 error_log log/error.log debug; http { log_formatfmt_main1 '$remote_addr $remote_user [$time_local] $request $status $body_bytes_sent $http_referer $http_user_agent $http_x_forwarded_for'; log_formatfmt_main2 '[$remote_addr] [$request] [$status] [$http_user_agent]'; log_formatfmt_json ' { "@timestamp":"$time_local", ' '"remote_addr":"$remote_addr", ' '"referer":"$http_referer", ' '"request":"$request", ' '"status":$status, ' '"bytes":$body_bytes_sent, ' '"agent":"$http_user_agent", ' '"x_forwarded":"$http_x_forwarded_for", ' '"up_addr":"$upstream_addr",' '"up_host":"$upstream_http_host",' '"up_resp_time":"$upstream_response_time",' '"request_time":"$request_time"' ' }'; #方式1:默认日志路径 access_log/data/logs/nginx/access.log fmt_main1; server { listen80; server_namelocalhost www.demo.com; #方式2:针对项目指定日志文件 access_log/data/logs/nginx/demo_access.log fmt_json; location / { root/data/www/demo; indexindex.html; } error_page404 /error.html; } }


二. 错误日志
  • 格式error_log path(存放路径) level(日志等级),可设置全局块,http块,server块
  • 级别:debug|info|notice|warn|error|crit|alert|emerg
error_log log/error.log debug; error_log /dev/null; #可以关闭日志


三. 日志切割
#!/bin/bash year=`date +%Y` month=`date +%m` day=`date +%d` logs_backup_path="/data/logs/logs_backup/$year$month" #日志存储路径logs_path="/data/logs/" #要切割的日志路径 logs_access="access" #要切割的日志 logs_error="error" pid_path="/var/run/nginx.pid" #nginx的pid[ -d $logs_backup_path ]||mkdir -p $logs_backup_path rq=`date +%Y%m%d` for i in `ls -al ${logs_path} | grep "^-" | awk '{print $9}' ` do #echo ${i} mv ${logs_path}${i} ${logs_backup_path}/${i}_${rq}.bak done #mv ${logs_path}${logs_access}.log ${logs_backup_path}/${logs_access}_${rq}.log #mv ${logs_path}${logs_error}.log ${logs_backup_path}/${logs_error}_${rq}.log kill -USR1 $(cat /var/run/nginx.pid)

crontab –e 59 23 * * * bash /usr/local/nginx/shell/cut_ngnix_log.sh#每天23:59分开始执行;


四. 日志统计 1. IP统计 统计IP访问量: 独立ip访问数量
awk '{print $1}' access.log | sort -n | uniq | wc -l

查看某一时间段的IP访问量(4-5点)
grep "07/Apr/2017:0[4-5]" access.log | awk '{print $1}' | sort | uniq -c| sort -nr | wc -l

查看访问最频繁的前100个IP
awk '{print $1}' access.log | sort -n |uniq -c | sort -rn | head -n 100

查看访问100次以上的IP
awk '{print $1}' access.log | sort -n |uniq -c |awk '{if($1 >100) print $0}'|sort -rn

查询某个IP的详细访问情况,按访问频率排序
grep '127.0.01' access.log |awk '{print $7}'|sort |uniq -c |sort -rn |head -n 100

2. 页面统计 查看访问最频的页面(TOP100)
awk '{print $7}' access.log | sort |uniq -c | sort -rn | head -n 100

查看访问最频的页面([排除php页面】(TOP100)
grep -v ".php" access.log | awk '{print $7}' | sort |uniq -c | sort -rn | head -n 100

查看页面访问次数超过100次的页面
cat access.log | cut -d ' ' -f 7 | sort |uniq -c | awk '{if ($1 > 100) print $0}' | less

查看最近1000条记录,访问量最高的页面
tail -1000 access.log |awk '{print $7}'|sort|uniq -c|sort -nr|less

3. 按时统计 统计每秒的请求数,top100的时间点(精确到秒)
awk '{print $4}' access.log |cut -c 14-21|sort|uniq -c|sort -nr|head -n 100

统计每分钟的请求数,top100的时间点(精确到分钟)
awk '{print $4}' access.log |cut -c 14-18|sort|uniq -c|sort -nr|head -n 100

统计每小时的请求数,top100的时间点(精确到小时)
awk '{print $4}' access.log |cut -c 14-15|sort|uniq -c|sort -nr|head -n 100

4. 性能分析 列出传输时间超过 3 秒的页面,显示前20条
cat access.log|awk '($NF > 3){print $7}'|sort -n|uniq -c|sort -nr|head -20

列出php页面请求时间超过3秒的页面,并统计其出现的次数,显示前100条
cat access.log|awk '($NF > 1 && $7~/\.php/){print $7}'|sort -n|uniq -c|sort -nr|head -100

5. 爬虫统计 统计蜘蛛抓取次数
grep 'Baiduspider' access.log |wc -l

统计蜘蛛抓取404的次数
grep 'Baiduspider' access.log |grep '404' | wc -l

6. 连接统计 查看当前TCP连接数
netstat -tan | grep "ESTABLISHED" | grep ":80" | wc -l

用tcpdump嗅探80端口的访问看看谁最高
tcpdump -i eth0 -tnn dst port 80 -c 1000 | awk -F"." '{print $1"."$2"."$3"."$4}' | sort | uniq -c | sort -nr


【05.Nginx日志管理】参考:
https://www.cnblogs.com/gouge/p/7089939.html (统计)
https://cloud.tencent.com/developer/article/1397738 (Json日志)
https://blog.csdn.net/Felix_CB/article/details/86614062 (切割)
https://blog.51cto.com/jinlong/2055173 (ELK输出)

    推荐阅读