小项目 :读取解析Apache日志分析提取(及正则表达式处理))

本文以Apache的access_log日志文件为例,介绍如何解析日志内容,包括客户端IP、请求时间、HTTP状态码等关键信息。通过正则表达式对日志进行分片处理,实现日志数据的提取和分析。文章还涵盖了代码实现过程,包括正则处理、文件打开、滑动窗口以及外部配置文件的使用。
摘要由CSDN通过智能技术生成

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
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值