目录
Apache日志解析(以access_log日志文件为例)
Apache 日志是什么
当我们安装并启动Apache后,Apache会自动生成两个日志文件,这两个日志文件分别是访问日志access_log(在Windows上是access.log)和错误日志error_log(在Windows上是error.log)。如果使用 SSL 服务的话,还可能存在 ssl_access_log和ssl_error_log 和 ssl_request_log 三种日志文件
日志内容与格式
这是随机取的一条日志文件
183.69.210.164 - - [07/Apr/2017:09:32:39 +0800] “GET /member/ HTTP/1.1” 302 31 “-” “Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.221 Safari/537.36 SE 2.X MetaSr 1.0”
一共九项 我们拆开来解决看
183.69.210.164
-
-
[07/Apr/2017:09:32:39 +0800]
"GET /member/ HTTP/1.1‘’
302
31
"-"
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36
(KHTML, like Gecko) Chrome/49.0.2623.221 Safari/537.36 SE
2.X MetaSr 1.0"
日志内容正则分析
(1)183.69.210.164
这是一个请求到apache服务器的客户端ip,默认的情况下,第一项信息只是远程主机的ip地址,但我们如果需要apache查出主机的名字
(2)-
这一项是空白,使用"-"来代替,这个位置是用于标注访问者的标示
(3) -
这一项又是为空白,不过这项是用户记录用户HTTP的身份验证,如果某些网站要求用户进行身份雁阵,那么这一项就是记录用户的身份信息
(4)==[07/Apr/2017:09:32:39 +0800] ==
第四项是记录请求的时间,格式为[day/month/year:hour:minute:second zone],最后的+0800表示服务器所处的时区为东八区
(5)GET /member/ HTTP/1.1
这一项是最有用的信息,它告诉我们的服务器收到的是一个GET请求,其次,是客户端请求的资源路径
(6)302
是一个状态码,由服务器端发送回客户端,它告诉我们客户端的请求是否成功,或者是重定向,或者是碰到了什么样的错误,这项值为302 这项值以2开头的表示请求成功,以3开头的表示重定向,以4开头的标示客户端存在某些的错误,以5开头的标示服务器端
(7)31
这项表示服务器向客户端发送了多少的字节,在日志分析统计的时侯,把这些字节加起来就可以得知服务器在某点时间内总的发送数据量是多少
(8) -
没有值时是直接打开网页的原因,而有值时告诉服务器我是从哪个页面链接过来的
(9) “Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36
(KHTML, like Gecko) Chrome/49.0.2623.221 Safari/537.36 SE
2.X MetaSr 1.0”
这项主要记录客户端的浏览器信息
代码正则分片处理
处理好的正则表达式
(?P([\d]+.){3}\d) - - [(?P
代码组合
我把下面每一个阶段进行切割,以便于更方便搞清每一个方面的作用
注意事项
因为我写的只是一个模拟 采取的基本是绝对路径 所以我把所有的文件放在了一起,切记
调用的模块
import re
import datetime
import time
import json
import logging
import configparser#装载配置文件的读取
日志生成
#日志生成
def logger(logname):
logger = logging.getLogger("analy_log")
logger.setLevel(logging.INFO)
handler = logging.FileHandler(logname,mode ="a")
formater = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")
handler.setFormatter(formater)
logger.addHandler(handler)
return logger
正则处理
#正则处理
def patch(line):
patter = '''(?P<ip>([\d]+\.){3}\d) - - \[(?P<time>.*)\] \"(?P<method>\w+) \/(?P<url>\S+|.?) (?P<protocol>\S+)\" (?P<status>\d+) (?P<length>\d+) \"(?P<domain>\S+)\" \"(?P<useragent>.*)\"'''
regex = re.compile(patter)
match = regex.match(line