《云计算全栈》-python篇:分析apache访问日志

1 案例1:分析apache访问日志
1.1 问题

编写count_patt.py脚本,实现一个apche日志分析脚本:

统计每个客户端访问apache服务器的次数
将统计信息通过字典的方式显示出来
分别统计客户端是Firefox和MSIE的访问次数
分别使用函数式编程和面向对象编程的方式实现

1.2 方案

collections是python内建的一个集合模块,模块中提供了许多有用的集合类,其中counter类 是一个简单的计数器,以字典的键值对形式储存,其中搜索的元素作为键,出现的次数作为值

实现过程:

1.实例化一个计数器

2.实例化正则表达式

3.将文件以对象形式打开

4.通过正则表达式查找文件每一行

5.如果找到结果

6.将结果添加到计数器,通过update方法更新原有数据

7.返回计数器

8.将文件地址和正则表达式作为实参传递给函数
1.3 步骤

实现此案例需要按照如下步骤进行。

步骤一:编写脚本

    [root@localhost day08]# vim count_patt.py
    #!/usr/bin/env python3
    import re
    import collections
    #fname 文件地址  patt 正则表达式
    def count_patt(fname,patt):
        
        counter = collections.Counter()
       
        cpatt = re.compile(patt)
            with open(fname) as fobj:
            for line in fobj:
               
                m = cpatt.search(line)
               
                if m:
                  
                    counter.update([m.group()])
      
        return counter
    if __name__ == "__main__":
        fname = "access_log.txt"
        ip_patt = "^(\d+\.){3}\d+"
        a = count_patt(fname,ip_patt)
        print(a)
        br_patt = "Firefox|MSIE|Chrome"
        b = count_patt(fname,br_patt)
        print(b)

实现此案例还可通过面向对象方式实现:

实现过程:

1.创建类CountPatt()

2.定义构造方法 创建正则对象

3.定义类方法

4.创建计数器对象

5.打开文本文件

6.通过正则表达式查找文件每一行

7.如果找到结果

8.将结果添加到计数器,通过update方法更新原有数据

9.返回计数器

10.将文件地址和正则表达式作为实参传递给函数

    [root@localhost day08]# vim count_patt2.py
    #!/usr/bin/env python3
    import re
    import collections
    import re
    import collections
    class CountPatt(object):
        
        def __init__(self,patt):
            self.cpatt = re.compile(patt)
        
        def count_patt(self,fname):
            
            counter = collections.Counter()
           
            with open(fname) as fobj:
           
                for line in fobj:
           
                    m = self.cpatt.search(line)
            
                    if m:
            
                        counter.update([m.group()])
        
            return counter
    if __name__ == "__main__":
        fname = "access_log.txt"
        ip_patt = "^(\d+\.){3}\d+"
        br_patt = "Firefox|MSIE|Chrome"
        ip = CountPatt(ip_patt)
        print(ip.count_patt(fname))
        br = CountPatt(br_patt)
        print(br.count_patt(fname))

步骤二:测试脚本执行

[root@localhost day08]# python3 count_patt.py 
Counter({‘172.40.0.54’:391,‘172.40.50.116’:244,‘201.1.1.254’:173,‘127.0.0.1’:121,‘201.1.2.254’:119})
Counter({‘Firefox’:870,‘MSIE’:391,‘Chrome’:24})
[root@localhost day08]# python3 count_patt2.py 
Counter({‘172.40.0.54’:391,‘172.40.50.116’:244,‘201.1.1.254’:173,‘127.0.0.1’:121,‘201.1.2.254’:119})
Counter({‘Firefox’:870,‘MSIE’:391,‘Chrome’:24})
发布了275 篇原创文章 · 获赞 46 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/xie_qi_chao/article/details/104726299