log_fomat日志格式和命令

  1. log_format main '$remote_addr - $remote_user [$time_local] "$request" '
  2. '$status $body_bytes_sent "$http_referer" '
  3. '"$http_user_agent" "$http_x_forwarded_for"';
  4. log_format main #定义日志,此日志名字为main
  5. $remote_addr #远程地址
  6. $remote_user #远程用户
  7. [$time_local] #本地时间
  8. $request #请求,举例请求的URL和http协议
  9. $status #状态,记录请求状态
  10. $body_bytes_sent #发送给客户端的字节数,不包括响应头的大小
  11. $http_referer #记录从那个页面链接访问过来(超链接)
  12. $http_user_agent #记录客户端浏览器相关信息
  13. $http_x_forwarded_for #记录请求端真实 IP

error日志案例
  1. 2021/12/03 17:50:35 [error] 13574#13574: *61 open() "/jiangzilong/isssa.html" failed (2: No such file or directory), client: 221.176.33.202, server: , request: "GET /isssa.html HTTP/1.1", host: "8.134.32.139:81"
  2. 2021/12/03 17:50:35 #时间
  3. *61 open() "/jiangzilong/isssa.html" #请求页面
  4. failed (2: No such file or directory) #失败,未找到文件
  5. client: 221.176.33.202 #客户端
  6. server: #服务端
  7. request: "GET /isssa.html HTTP/1.1" #请求头
  8. host: "8.134.32.139:81" #主机

日志缓存
  1. 大量访问到来是,对于每一条日志记录,都将是先打开文件,再写入日志,然后关闭,占用了系统的io与业务无关。
  2. 可以使用open_log_file_cache来设置
  3. 磁盘io:计算机用语,也写作I/O,指输入/输出(Input/Output)。
  4. syntax(语法):open_log_file_cache max=1000 inactive=20s min_uses=3 valid=1m;
  5. max 1000max 最大值) 指的是日志文件的FD,最大的缓存数量为1000.
  6. min_usesmin 分钟 uses 使用) 3 20秒内小于3次访问的FD,就给你清掉,结合inactive 20s的时间。
  7. valid 1mvalid 有效的) 检查周期为1分钟
  8. 总结:缓存最多1000个,到了极限,每分钟开始清除掉 20秒内小于3次的文件FD.
  9. 官方不推荐使用

日志轮转/切割
  1. yum安装nginx,会默认安装日志轮转
  2. #USR1亦通常被用来告知应用程序重载配置文件;例如,向Apache HTTP服务器发送一个USR1信号将导致以下步骤的发生:停止接受新的连接,等待当前连接停止,重新载入配置文件,重新打开日志文件,重启服务器,从而实现相对平滑的不关机的更改。
  3. 主配置文件
  4. vim /etc/logrotate.d/nginx
  5. /var/log/nginx/*.log {
  6. daily #天
  7. missingok #丢失不提示
  8. rotate 52 #52份
  9. compress #压缩
  10. delaycompress #延迟压缩
  11. notifempty #空文件的话,不论储
  12. create 640 nginx adm #切割后创建新文件,权限640,nginx属主adm数组
  13. sharedscripts #所有文件归档完成后执行脚本
  14. postrotate #日志切割后执行的脚本命令
  15. if [ -f /var/run/nginx.pid ]; then
  16. kill -USR1 `cat /var/run/nginx.pid`
  17. fi
  18. endscript #脚本停止运行
  19. }

日志分析
  1. PVPage View)访问量, 即页面浏览量或点击量,衡量网站用户访问的网页数量;在一定统计周期内用户每打开或刷新一个页面就记录1次,多次打开或刷新同一页面则浏览量累计。
  2. UVUnique Visitor)独立访客,统计1天内访问某站点的用户数(以cookie为依据);访问网站的一台电脑客户端为一个访客。可以理解成访问某网站的电脑的数量。网站判断来访电脑的身份是通过来访电脑的cookies实现的。
  3. 统计2021127日一天内访问最多的10ipiptop10
  4. #grep '07/Dec/2021' access.log | awk '{ips[$1]++}END{for(i in ips){print i,ips[i]}}' | sort -k2 -rn
  5. sort -k2 k是指第几列
  6. -n 用于对数值的大小进行排序
  7. -r 以倒序(相反的顺序)输出排序结果
  8. 再加判断是否超过10
  9. #grep '07/Dec/2021' access.log | awk '{ips[$1]++} END{for(i in ips){if(ips[i]>10){print i,ips[i]} }}'

URL访问前10
  1. 199.19.225.163 - - [10/Dec/2021:03:14:52 +0800] "GET login.cgi HTTP/1.1" 400 157 "-" "-" "-"
  2. cat access.log | awk '{url[$7]++}END{for(i in url ){print url[i],i } }' | sort -k1 -rn | head -10

访问日志各个网页的总大小与次数
  1. cat access.log |awk '{urls[$7]++;size[$7]+=$10} END{for (i in urls) {print urls[i] ,size[i] , i}}' | sort -k1 -rn | head -10

查看状态码访问次数
  1. cat access.log | awk '{status[$9]++} END{for (i in status) {print status[i] ,i}}' | sort -k1 -rn
  2. #查看ip访问状态码的次数
  3. cat access.log | awk '{code[$1" "$9]++} END{for (i in code){print code[i] ,i}}'
  4. #查看某一个ip访问404的次数
  5. cat access.log | awk '{ if ($9="404"){ip_code[$1" "$9]++}} END{for (i in ip_code){ print ip_code[i] ,i}}' | sort -k1 -rn