Web日志分析
以apache为例
访问日志记录过程
apache日志大致分为两类:访问日志和错误日志
访问日志记录的过程:
-  客户端向web服务器发送请求,请求中包含客户端的IP、浏览器类型(User-Agent)、请示的URL等信息 
-  web服务器向客户端返回请示的页面 
-  web服务器同时将访问信息和状态信息记录到日志文件中 

Apache的访问日志目录在其配置文件中已经定义好了,CentOS中apache的配置文件位置为/etc/httpd/conf/httpd.conf,默认的访问日志存放在/var/log/httpd/access_log中
访问日志格式分析
apache中访问日志功能由mod_log_config模块提供,以默认的CLF来记录访问日志,如LogFormat "%h%l%u%t %r"
127.0.0.1 - - [13/Apr/2022:23:34:30 +0800] "GET /images/apache_pb.gif HTTP/1.1" 200 4897 "-" "Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Firefox/68.0"
| 域 | 内容 | 含义 | 
|---|---|---|
| $1 | 127.0.0.1 | 远程主机IP地址,%h | 
| $2 | - | 占位符,%l | 
| $3 | - | 占位符,%u | 
| $4 | 13/Apr/2022:23:34:30 | 服务器完成请示处理时间,日/月/年:小时:分:秒:时间,%t | 
| $5 | +0800 | 时区 | 
| $6 | GET | 请示方法(GET,POST),%r\ | 
| $7 | /images/apache_pb.gif | 请示的资源URL | 
| $8 | HTTP/1.1 | 协议 | 
| $9 | 200 | 返回状态,%s | 
| $10 | 1961 | 发送给客户端的总字节数,%b | 
| $11 | - | 此页面的链接地址(Referer),%{Referer}i\ | 
| $12 | Mozilla/5.0 ... | 客户端使用的浏览器信息,%{User-Agent}i\ | 
Web日志统计举例
查看访问IP
cat access_log | awk '{print $1}'awk '{print $1}' - 每行按空格或TAB分割,输出文本中的第1项,因为在access_log中的IP是第一项,所以这里用$1表示
对IP排序
cat access_log | awk '{print $1}' | sort打印每一重复行出现的次数
cat access_log | awk '{print $1}' | sort | uniq -cuniq用于检查及删除文本中重复出现的行列,一般与sort结合使用
-c - 在每列旁边显示该行重复出现的次数

排序并统计行数
cat access_log | awk '{print $1}' | sort | uniq -c | sort -rn | wc -lsort 用于对文本文件内容进行排序,默认以ASCII码的次序排列
-r 以相反的顺序来排序
-n 依照数值的大小排序
wc用于打印文件的文本行数、单词数、字节数等
-l 打印指定文件的文本行数
显示访问前10位的IP地址
cat access_log | awk '{print $1}' | sort | uniq -c | sort -rn | heade -10显示指定时间以后的日志
cat access_log | awk '$4>="[10/Apr/2022:01:00:01]"' access_log找出访问量最大的IP,并封掉
cat access_log | awk '{print $1}' | sort | uniq -c | sort -rn | more
iptables -I INPUT -s 192.168.1.10 -j DROP
iptables -I INPUT -s 192.168.1.0/24 -j DROP找出下载最多的文件
cat access_log | awk '($7 ~/.exe/){print $10 "" $1 "" $4 "" $7}' | sort -n | uniq -c | sort -nr | head -10或找出文件大于10MB的文件:
cat access_log | awk '($10 > 10000000 && $7 ~/.exe){print $7}' | sort -n | uniq -c | sort -nr | head -10简单统计流量
cat access_log | awk '{sum+=$10}'统计401访问拒绝的数量
cat access_log | awk '(/401/)' | wc -l查看某一时间内的IP连接情况
grep "2022:04" access_log | awk '{print $4}' | sort | uniq -c | sort -nrApache错误日志分析
默认的错误日志位置/var/log/httpd/error_log
错误日志记录了服务器运行期间遇到的各种故障,以及一些普通的诊断信息,如服务器启动/关闭的时间
日志文件记录信息级别的高低,控制日志文件记录信息的数量和类型,这是通过LogLevel指令实现的,该指令默认设置的级别是error
级别越高,记录的信息越多,日志量越大
| 紧急程序 | 等级 | 说明 | 
|---|---|---|
| 0 | emerg | 出现紧急情况使得该系统不可用,如系统宕机 | 
| 1 | alert | 需要立即引起注意的情况 | 
| 2 | crit | 关键错误,危险情况的警告,由于配置不当所致 | 
| 3 | error | 一般错误 | 
| 4 | warn | 警告信息,不算是错误信息,主要记录服务器出现的某种信息 | 
| 5 | notice | 需要引起注意的情况 | 
| 6 | info | 值得报告的一般消息,如服务器重启 | 
| 7 | debug | 由运行于debug模式的程序所产生的消息 | 
最常见的错误日志文件有两类:
-  文档错误 文档错误和服务器应答中的400系列代码对应,最常见的是404错误 
-  CGI错误 CGI程序输出到STDERR(Standard Error,标准错误设备)的所有内容都将直接进入错误日志 










