Apache日志分析
想要知道什么人在什么时候浏览了网站的哪些内容吗?查看Apache的访问日志就可以知道。访问日志是Apache的标准日志,本文详细解释了访问日志的内容以及相关选项的配置。
一、web日志分析原理
web服务器日志记录了web服务器接受处理请求及运行时错误等各种原始信息。通过对日志进行统计、分析和综合,就能有效的掌握服务器的运行情况、发现和排出错误原因、了解客户访问分布等,更好地加强系统的维护和管理。Web服务器模式主要有以下三个步骤:
服务请求,包含用户端的众多基本信息,如IP地址、浏览器类型、目标URL等。
服务响应,web服务器接收到请求后,按照用户要求运行相应的功能,并将信息返回给用户。如果出现错误,将返回错误代码。
追加日志,服务器将用户对访问进程中的相关信息以追加的方式保存到日志文件中。
1、日志类型
1.3版本Apache标准中规定了四类日志:
- 错误日志
- 访问日志
- 传输日志
- Cookie日志
其中传输日志和Cookie日志被Apache2.0认为已经过时。所以本文仅讨论错误日志和访问日志。同时错误日志和访问日志被Apache2.0默认设置。
错误日志包含:
- 获知失效链接
- 获知CGI(公共网关接口)错误
- 获知用户认证错误
访问日志包含:
- 访问服务器的远程机器的地址:可以得知浏览者来自何方
- 浏览者访问的资源:可以得知网站中那些部分最受欢迎
- 浏览者的浏览时间:可从浏览时间对网站内容进行条形
- 浏览者使用的浏览器:可以根据大多数浏览者使用的浏览器对站点进行优化
日志的位置:
如果Apache的安装方式是默认安装,服务器一运行就会有两个日志文件生成。这两个文件是access_log和error_log(在Win上是access.log和error.log)。采用默认安装方式时,这些文件可以在/usr/local/apache/logs下找到;对于Windows系统,这些日志文件将保存在Apache安装目录的logs子目录。不同的包管理器会把日志文件放到各种不同的位置,所以你可能需要找找其他的地方,或者通过配置文件查看这些日志文件配置到了什么地方。
总结:访问日志和错误日志的 位置 和 名字 :
Windows: <Apache安装目录>logsaccess.log | error.log
Linux: /usr/local/apache/logs/access_log | error_log
2.访问日志
①.访问日志分类:
为了便于分析Apache的访问日志,Apache的默认配置文件中,按记录的信息不同(用不同格式昵称说明不同的信息)将访问日志分为四类(安装时默认使用普通型common日志记录访问信息):
- 普通日志格式(commonlog format,CLF)common 大多数日志分析软件都支持这种格式
- 参考日志格式(refererlog format)referrer 记录客户访问站点的用户身份
- 代理日志格式(agentlog format)agent 记录请求的用户代理
- 综合日志格式(combinedlog format)combined 结合以上三种日志信息
②.典型的记录
正如名字所示,acces_log记录了所有对Web服务器的访问活动。下面是日志种一个典型的记录:
192.168.1.7 - - [04/Apr/2020:22:09:07 +0800] "GET / HTTP/1.1" 200 2307
日志个字段所代表的内容如下
- 远程主机的IP:表明访问网站的IP。
- 空白(E-mail):为了避免用户的邮箱被垃圾软件骚扰,第二项就用“ -”取代了。
- 空白(登录名):用于记录浏览者进行身份验证时提供的名字
- 请求时间:用方括号保卫,而且采用‘公用日志格式’或者‘标准英文格式’。时间信息最后的‘+0800’表示服务器所处时区位于UTC之后的8小时。
- 方法+资源+协议:服务器收到的是一个什么样的请求。该项信息的典型格式是“METHOD RESOURCE PROTOCOL”,即“方法 资源 协议”。
METHOD | GET | POST | HEAD |
RESOURCE | index.html | default | index.php |
PROTOCOL | HTTP+版本号 |
- 状态代码:请求是否成功,或者遇到了什么样的错误。大多时候该数值为200,表示服务器已经成功的响应浏览器的请求
状态码
- 发送字节数:表示发送给客户端的总字节数。它告诉我们传输是否被打断(该数值是否和文件的大小相同)。把日志记录中的这些数值加起来就可以得知服务器在一天、一周、一月内发送了多少数据。
③.配置Apache访问日志格式命令参数
配置Apache访问日志格式主要有两个参数,即LogFormat指令和CustomLog指令
LogFormat指令:定义格式并为格式指定一个名字,以后可以直接引用这个名字。
CustomLog指令:设置日志文件,并指明日志文件所用的格式(通常通过格式的名字指定)。
在apache的配置文件httpd.conf中,有几行是这么配置的。
LogFormat "%h %l %u %t "%r" %>s %b" common 定义格式和名字 CustomLog "logs/access.log" common 普通文件记录
格式说明符 | %h | %I | %u | %t | %r | %>s |
%b |
含义 | 远端主机 | 远端登录名 | 远程用户名 | 时间 | HTTP请求的首行信息 | 状态 | 传送字节 |
举例 | 192.168.1.1 | - | - | 14/Oct/2008:19:54:51 +0800 | 典型格式即“方法 资源 协议” | 404 | 1185 |
LogFormat "%h %l %u %t "%r" %>s %b "%{Referer}i" "%{User-Agent}i"" combined CustomLog logs/access_log combined 复合日志记录
格式说明符 | %{Referer}i | "%{User-Agent}i" |
含义 | 指明请求来源 | 客户端浏览器提供的浏览器识别信息 |
举例 | - |
3.错误日志
①典型的记录
[Fri Aug 18 22:36:26 2000] [error] [client 192.168.1.6] File does not exist: /usr/local/apache/bugletdocs/Img/south-korea.gif
说明:1.日期和时间 2.记录等级 3.客户IP 4.错误信息
LogLevel
LogLevel用于调整记录错误日志中的信息的详细程度
等级 | 应急说明 | 级别 |
emerg | 出现紧急情况使得该系统不可用,如系统宕机等 | 1 |
alert | 需要立即引起注意的情况 | 2 |
crit | 危险情况的警告 | 3 |
error | 除了emerg、alert、crit的其他错误 | 4 |
warn | 警告信息 | 5 |
notice | 需要引起注意的情况,但不如error、warm中腰 | 6 |
info | 值得报告的一般消息 | 7 |
debug | 由运行debug模式的程序所产生的消息 | 8 |
Nginx日志分析
1.Nginx日志
nginx的log日志分为access.log和error.log
access log:记录了哪些用户,哪些页面以及用户浏览器、ip和其他的访问信息。
error log:记录服务器错误日志。
2.日志位置
我们可以在配置文件中查看或者更改日志的存放位置
windows
Linux(Centos7)
#日志位置 /var/log/nginx/access.log #nginx配置文件位置 vim /etc/nginx/nginx.conf(可能有所不一样) #配置文件中关于日志的字段(日志格式+日志存放位置) log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx/access.log main;
3.日志分析
192.168.33.254 - - [20/Feb/2020:22:57:27 +0800] "POST /pikachu-master/vul/burteforce/bf_form.php HTTP/1.1" 200 4899 "http://192.168.33.254/pikachu-master/vul/burteforce/bf_form.php" "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:72.0) Gecko/20100101 Firefox/72.0"
字段值 | 字段名称 | 含义 |
192.168.2.184 | $remote_addr | 客户端(用户)的IP地址 |
-- | - $remote_user | 客户端的用户名,匿名访问为- |
[20/Apr/2020:17:59:09+800] | [$time_local] | 访问时间 |
"GET/index.html HTTP/1.1" | “$request” | 请求方式以及请求的资源URI地址 |
200 | $status | 状态码 |
612 | $body_bytes_sent | 请求的页面大小 |
"-" | "$http_referer" | 来源页面,即从哪个页面转到本页 |
"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:75.0) Gecko/20100101 Firefox/75.0" |
"$http_user_agent" | 浏览器信息,操作系统信息 |
"-" | "$http_x_forwarded_for" | 获取到真实IP,获取不到则显示未- |
4.自定义日志记录字段
如果我们想要获取的信息并没有记录下来,例如:服务器的处理时间等等。那么我们可以在配置文件中添加以下内容,从而获取到我们想要的信息。
$request_time #记录请求处理时间(以秒为单位,携带毫秒的解决方案),从读取客户端第一个字节开始算起,到发送最后一个字节给客户端的时间间隔 $upstream_response_time #记录nginx从后端服务器(upstream server)获取响应的时间(以秒为单位,携带毫秒的解决方案),多个请求的时间以逗号分隔 $request_length #记录请求长度(包括请求行,请求头,请求体) $bytes_sent #发送给客户端的字节数,不同于$body_bytes_sent(发送给客户端的响应体字节数)
IIS日志分析
1.日志所在位置
在IIS中选择想要查看日志的网站,右键属性,启用日志模块,找到相应的日志存储位置。
2.日志分析
一段完整的日志如下
#Software: Microsoft Internet Information Services 6.0 #Version: 1.0 #Date: 2020-04-10 09:59:37 #Fields: date time s-sitename s-ip cs-method cs-uri-stem cs-uri-query s-port cs-username c-ip cs(User-Agent) sc-status sc-substatus sc-win32-status 2020-04-10 09:59:37 W3SVC845183278 192.168.233.146 GET /Default.asp - 8002 - 192.168.233.146 Mozilla/5.0+(Windows+NT+5.2;+rv:17.0)+Gecko/20100101+Firefox/17.0 200 0 0
字段含义如下
字段值 | 字段名称 | 含义 |
2020-04-10 |
日期 (date) |
活动发生的日期 |
09:59:37 |
时间 (time) |
活动发生的时间 |
W3SVC8 |
服务器 (s-sitename) |
客户端所访问的该站点的Internet服务和实例的号码 |
- |
服务器名 (s-computername) |
生成日志项的服务器IP地址 |
192.168.233.146 |
服务器IP (s-ip) |
生成日志项的服务器IP地址 |
GET |
方法 (cs-method) |
客户端执行的操作 |
/default.asp |
请求访问的页面 (cs-uri-stem) |
客户端访问的文件 |
- | 访问的查询字符串(cs-uri-query) | 客户端正在尝试执行的查询(此时没有显示为-) |
8002 |
服务器端口 (s-port) |
客户端连接服务器的端口 |
- |
客户端用户名 (cs-username) |
匿名用户登录,显示为- |
192.168.233.146 |
客户端IP (c-ip) |
真实的访问服务器的客户端IP地址 |
Mozilla/5.0+<br> |
用户代理 (cs(User-Agent)) |
在客户端使用的浏览器 |
200 |
协议返回状态 (sc-staus) |
|
0 |
HTTP子协议的状态 (sc-substatus) |
|
0 |
win32状态 sc-win32-status |