广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Python 关于日志的分析
  • 238
分享到

Python 关于日志的分析

日志Python 2023-01-31 02:01:16 238人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

项目情况介绍:基于python 3.6.6 ,实现对Nginx访问的日志分析代码,实现了对日志中code的占比统计和浏览器类型和访问情况统计实现的代码段有:1.编写窗户函数,实现在一定的时间内对数据进行分析2.通过正则表达式对日志进行匹配,

项目情况介绍:
基于python 3.6.6 ,实现对Nginx访问的日志分析代码,实现了对日志中code的占比统计和浏览器类型和访问情况统计
实现的代码段有:
1.编写窗户函数,实现在一定的时间内对数据进行分析
2.通过正则表达式对日志进行匹配,加载日志文件,提取出文本里每行的日志信息
3.编写消费端代码,即使得提取到的数据能够按照消费端的代码进行处理
4.消息分发代码实现,通过queue,将提取的的文本放到队列里,供消费端代码处理
项目代码如下

import random
import datetime
import time
from queue import Queue
import threading
import re
from pathlib import Path
from user_agents import parse
"""
这段代码,实现了再一段时间内获得数据,通过不同的handler(即消费端函数)
对获取到的同一份数据进行处理,主要是两段消费函数,网页返回的code的统计和浏览器的分析
这段代码,窗口函数中,data = src.get(),使得没有新的数据产生时,该代码会阻塞,直到有新的数据生成,再次进行处理
"""
pattern = '''(?P<remote>[\d.]{7,}\s-\s-\s\[(?P<datetime>[^\[\]]+)\])\s\
"(?P<method>.*)\s(?P<url>.*)\s(?P<protocol>.*)"\s(?P<status>\d{3})\s(?P<size>\d+)\s"[^"]+"\s"(?P<useragent>[^"]+)"'''

#编译
regex = re.compile(pattern)

#构造字典
ops = {
    'datetime': lambda datestr: datetime.datetime.strptime(datestr, '%d/%b/%Y:%H:%M:%S %z'),
    'status': int,
    'size': int,
    'useragent': lambda ua: parse(ua)
}

#提取信息
def extract(line: str) -> dict:
    matcher = regex.match(line)
    if matcher:
        return {name: ops.get(name, lambda x: x)(data) for name, data in matcher.groupdict().items()}

# 打开文件
def openfile(path: str):
    """装载日志文件"""
    with open(path) as f:
        for line in f:
            fields = extract(line)
            if fields:
                yield fields
            else:
                continue

#装载文件,判断文件类型已经是否存在
def load(*paths):
    for item in paths:
        p = Path(item)
        if not p.exists():
            continue
        if p.is_dir():
            for file in p.iterdir():
                if file.is_file():
                    yield from openfile(str(file))
        elif p.is_file():
            yield from openfile(str(p))

# 随机生成100以内的数字
def source(second=1):
    """生成数据"""
    while True:
        yield {
            'datetime': datetime.datetime.now(datetime.timezone(datetime.timedelta(hours=8))),
            'value': random.randint(1, 100)
        }
        time.sleep(second)

# 滑动窗口函数
def window(src: Queue, handler, width: int, interval: int):
    '''
    窗口函数,表示间隔一段时间取出一定的数据进行处理
    :param src:数据源,这里是缓存队列,用于获取数据
    :param handler:数据处理的函数
    :param width:时间窗口函数,秒
    :param interval:处理时间间隔,秒
    '''
    start = datetime.datetime.strptime('20170101 000000 +0800', '%Y%m%d %H%M%S %z')
    current = datetime.datetime.strptime('20170101 010000 +0800', '%Y%m%d %H%M%S %z')
    buffer = []
    delta = datetime.timedelta(seconds=width - interval)

    while True:
        # 从数据源获取数据
        data = src.get()  # 这个代码会阻塞,等待数据输入,没有数据输入就阻塞
        if data:
            buffer.append(data)
            current = data['datetime']  # 存入临时缓冲等待计算

        # 每隔interval重新计算buffer中的一次数据
        if (current - start).total_seconds() >= interval:
            ret = handler(buffer)
            start = current
            # 清除超出width的数据
            buffer = [x for x in buffer if x['datetime'] > current - delta]

# 随机数平均的测算函数
source()
def handler(iterable):
    #return sum(map(lambda x: x['value'], iterable)) / len(iterable)
    print(sum(map(lambda x:x['value'],iterable))/len(iterable))

# 测试函数
def donothing_handler(iterable):
    #return iterable
    print(iterable)

# 状态码占比
def status_handler(iterable):
    # 时间窗口内的一批数据
    status = {}
    for item in iterable:
        key = item['status']
        status[key] = status.get(key, 0) + 1
    total = len(iterable)
    print({k:float( "{:.2f}".fORMat(status[k] / total)) for k, v in status.items()})
    return {k: status[k] / total for k, v in status.items()}

# 浏览器分析
allbrowsers = {}

def browser_handler(iterable):
    browsers = {}
    for item in iterable:
        ua = item['useragent']
        key = (ua.browser.family, ua.browser.version_string)
        browsers[key] = browsers.get(key, 0) + 1
        allbrowsers[key] = allbrowsers.get(key, 0) + 1

    print(sorted(allbrowsers.items(), key=lambda x: x[1], reverse=True)[:10])
    return browsers

# 分发器
def dispatcher(src):
    # 分发器中记录handler,同时保存各自的队列
    handlers = []
    queues = []

    def reg(handler, width: int, interval: int):
        """
        注册窗口处理函数
        :param handler:注册数据处理函数
        :param width:时间窗口宽度
        :param interval:时间间隔
        """
        q = Queue()
        queues.append(q)
        # 多线程,数据并行
        h = threading.Thread(target=window, args=(q, handler, width, interval))
        handlers.append(h)

    def run():
        # 启动线程处理数据
        for t in handlers:
            t.start()

        # 将获取到的数据分发到所有的队列中
        for item in src:
            for q in queues:
                q.put(item)
                # print(q.get())

    return reg, run

if __name__ == "__main__":
    import sys

    path = '/tmp/test.log'
    """
    以下的代码为测试用的,用于统计每隔5s统计10s内的随机数字的平均值
    reg, run = dispatcher(source())
    reg(handler, 10, 5)
    """

    reg, run = dispatcher(load(path))

    #每隔5s返回过去10s的数据,但是不做处理
    reg(donothing_handler, 10, 5)
    #每隔5s统计10s内的返回状态码的占比情况
    reg(status_handler, 10, 5)
    # 每隔5s统计10s内的浏览器类型占比情况,展示排行10s内访问量前十的浏览器
    reg(browser_handler,10,5)
    run()

--结束END--

本文标题: Python 关于日志的分析

本文链接: https://www.lsjlt.com/news/186225.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Python 关于日志的分析
    项目情况介绍:基于Python 3.6.6 ,实现对nginx访问的日志分析代码,实现了对日志中code的占比统计和浏览器类型和访问情况统计实现的代码段有:1.编写窗户函数,实现在一定的时间内对数据进行分析2.通过正则表达式对日志进行匹配,...
    99+
    2023-01-31
    日志 Python
  • 关于Aborted connection告警日志的分析
    前言:  有时候,连接MySQL的会话经常会异常退出,错误日志里会看到"Got an error reading communication packets"类型的告警。本篇文章我们一起来讨论下该错误可能的原因以及如何来规避。 1...
    99+
    2015-11-24
    关于Aborted connection告警日志的分析
  • 关于mongodb的journal日志工作方式分析
    1、journal目录结构...
    99+
    2022-10-18
  • python分析nginx日志
    利用python脚本分析nginx日志内容,默认统计ip、访问url、状态,可以通过修改脚本统计分析其他字段。一、脚本运行方式python count_log.py -f med.xxxx.com.access.log二、脚本内容#!/us...
    99+
    2023-01-31
    日志 python nginx
  • python分析nginx日志的ip(来
    #!/usr/bin/env python #_*_coding:utf-8 _*_ __author__ = 'gaogd' import datetime,threading import sys, os, urllib2, json...
    99+
    2023-01-31
    日志 python nginx
  • 关于Thinkphp6的日志问题
    目录Thinkphp6的日志问题设置日志记录级别单一日志独立日志日志的写入时机日志通道Thinkphp6异常处理与日志异常处理日志手动记录日志关闭日志总结Thinkphp6的日志问题...
    99+
    2023-03-23
    Thinkphp6的日志 Thinkphp6日志 关于Thinkphp6日志
  • python 正则分析nginx日志
      有个需求要分析nginx日志,也懒得去研究logstach之类的开源工具,干脆直接写一个脚本,自己根据需求来实现:先看日志格式:我们跟别人的不太一样,所以没办法了:12.195.166.35 [10/May/2015:14:38:09 ...
    99+
    2023-01-31
    正则 日志 python
  • python分析nginx访问日志
    Web服务器的各种系统管理工作包括了多Nginx/Apache 日志的统计,python使这个任务变得极其简单,下面分享两个小脚本。一、统计Nginx的客户端缓存的命中率需要检查你的Nginx服务器拒绝客户请求的频率,服务器拒绝的原因是因为...
    99+
    2023-01-31
    日志 python nginx
  • python分析nginx日志的ip(来源)
    #!/usr/bin/env python #_*_coding:utf-8 _*_ __author__ = 'gaogd' import dateti...
    99+
    2022-10-18
  • python分析nginx日志的ip,url,status
    Python 脚本如下:#!/usr/bin/env python #_*_coding:utf-8 _*_ __author__ = 'lvnian' #!/us...
    99+
    2022-10-18
  • python打印日志实例分析
    这篇“python打印日志实例分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“python打印日志实例分析”文章吧。一、必...
    99+
    2023-07-02
  • mysql日志分析
    由于日志文件是掌握数据库运行状态的重要参考,因此日志文件的维护也有十分重要的意义。 mysql的日志类型有二进制日志,错误日志,通用日志,慢查询日志。 模块中添加日志分析log-bin=mysql_b...
    99+
    2022-10-18
  • 有哪些关于MySQL日志
    这篇文章主要讲解了“有哪些关于MySQL日志”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“有哪些关于MySQL日志”吧!MySQL日志说起MySQL的日志,...
    99+
    2022-10-18
  • 怎么用SARG日志分析器来分析Squid日志
    本篇内容介绍了“怎么用SARG日志分析器来分析Squid日志”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!  SARG是一款基于网络的工具,...
    99+
    2023-06-13
  • python解析基于xml格式的日志文件
    大家中午好,由于过年一直还没回到状态,好久没分享一波小知识了,今天,继续给大家分享一波Python解析日志的小脚本。 首先,同样的先看看日志是个啥样。 都是xml格式的,是不是看着就头晕了??没事,我们先...
    99+
    2022-06-04
    格式 文件 日志
  • 分析PostgreSQL日志相关的配置参数log_XXX
    本篇内容主要讲解“分析PostgreSQL日志相关的配置参数log_XXX”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“分析PostgreSQL日志相关的配置参...
    99+
    2022-10-18
  • 利用python分析access日志的方法
    前言 WAF上线之后,处理最多的是误报消除。 产生误报有多种原因,比如web应用源码编写时允许客户端提交过多的cookie;比如单个参数提交的数值太大。 把误报降低到了可接受的范围后,还要关注漏报。WA...
    99+
    2022-06-04
    方法 日志 python
  • python正则分析nginx的访问日志
    前言 本文的脚本是分析nginx的访问日志, 主要为了检查站点uri的访问次数的,检查的结果会提供给研发人员做参考,因为谈到分析嘛,那肯定要用到正则表达式了,所以请没有接触过正则的小伙伴自行补脑,因为涉及正...
    99+
    2022-06-04
    正则 日志 python
  • python 3.x 分析日志的模块(正
    #导入正则模块 import re auth="no_shutdown_" ''' 分析日志的模块,查找日志中标志性信息产生的次数 ''' #定义你需要查找的对象的正则表达式wordcheck #需要分析的日志的路径filesource d...
    99+
    2023-01-31
    模块 日志 python
  • mysqlbinlog工具基于日志恢复的示例分析
    这篇文章将为大家详细讲解有关mysqlbinlog工具基于日志恢复的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1)RESET MASTER在上面查看日志存放的...
    99+
    2022-10-18
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作