首页 > 编程语言 >Python统计web日志中每天用户访问情况

Python统计web日志中每天用户访问情况

时间:2024-08-15 12:54:04浏览次数:8  
标签:count web log Python ip file 日志 name

背景

统计web日志中每天用户访问情况

日志目录

import os
from concurrent.futures import ProcessPoolExecutor
from multiprocessing import Manager

# 全局日志目录配置
LOG_DIR = "/var/log/nginx"

def get_log_access(file_name, count_dict):
    """
    处理单个日志文件,统计总访问次数和唯一 IP 数量,并将结果存储在共享字典中。
    
    参数:
    - file_name: 日志文件的名称
    - count_dict: 用于存储结果的共享字典
    """
    ip_set = set()
    total_count = 0

    # 检查并生成文件路径
    file_path = os.path.join(LOG_DIR, file_name)

    try:
        # 读取日志文件并处理每一行
        with open(file_path, 'r', encoding='utf-8') as file_object:
            for line in file_object:
                if not line.strip():
                    continue

                # 提取用户 IP 地址
                user_ip = line.split(' - -', maxsplit=1)[0].split(',')[0]
                total_count += 1

                if user_ip not in ip_set:
                    ip_set.add(user_ip)

        # 将统计结果保存到共享字典中
        count_dict[file_name] = {"total": total_count, "ip": len(ip_set)}

    except FileNotFoundError:
        print(f"Error: File {file_name} not found in {LOG_DIR}.")
    except Exception as e:
        print(f"Error processing file {file_name}: {e}")

def filter_log_files(log_dir):
    """
    过滤日志目录下的所有 .log 文件。
    
    参数:
    - log_dir: 日志文件所在的目录路径
    
    返回:
    - 符合条件的文件列表
    """
    try:
        return [f for f in os.listdir(log_dir) if f.endswith(".log")]
    except FileNotFoundError:
        raise FileNotFoundError(f"The directory {log_dir} does not exist.")
    except Exception as e:
        raise Exception(f"Error accessing directory {log_dir}: {e}")

def run():
    """
    主函数,使用多进程来并行处理多个日志文件,并输出结果。
    """
    # 检查日志目录是否存在
    log_files = filter_log_files(LOG_DIR)

    # 使用多进程池并行处理文件
    with Manager() as manager, ProcessPoolExecutor(max_workers=4) as pool:
        count_dict = manager.dict()

        # 提交任务到进程池
        for file_name in log_files:
            pool.submit(get_log_access, file_name, count_dict)

        # 进程池自动关闭,并等待任务完成
        pool.shutdown(wait=True)

        # 输出结果
        for file_name, result in count_dict.items():
            print(f"{file_name}: Total Requests = {result['total']}, Unique IPs = {result['ip']}")

if __name__ == '__main__':
    run()

运行示例

[root@nginx script]# python3 log_ip_analyzer.py
20240811.log: Total Requests = 20528, Unique IPs = 253
20240812.log: Total Requests = 25023, Unique IPs = 125
20240813.log: Total Requests = 22023, Unique IPs = 323
20240814.log: Total Requests = 26356, Unique IPs = 364
20240815.log: Total Requests = 15563, Unique IPs = 89

标签:count,web,log,Python,ip,file,日志,name
From: https://www.cnblogs.com/Unstoppable9527/p/18360685

相关文章

  • 【Python快速入门和实践011】Python常用脚本-目标检测之VOC格式转YOLO格式脚本
    一、数据集介绍        NEU-DET数据集是由东北大学(NortheasternUniversity,简称NEU)发布的一个用于钢材表面缺陷检测的数据集。这个数据集特别设计用于支持和促进工业领域中的缺陷检测研究。NEU-DET数据集的一些主要特点包括:多样性和复杂性:数据集包含了多种类型......
  • 40、Python之面向对象:扩展的对象属性解析顺序(描述符 + MRO)
    引言在上一篇文章中,我们简单回顾了Python中在继承语境下的属性解析顺序,同时补充了能够控制、影响属性解析的3个函数/方法(2个魔术方法+1个内置函数),相信对Python中属性的解析,相较于MRO,有了更进一步的认识。今天这篇文章中,我们将考虑属性描述符存在的情况下,对于Python中的属性......
  • WebApi 简单使用 JObject,可以省掉自定义的class类
    post提交的json数据:{"name":"Jason","age":18,"color":"blue"}usingNewtonsoft.Json.Linq;[HttpPost("testpost")]publicstringTestPost([FromBody]Objectinput){......
  • 学习009-01 Create a Standalone Web API Application(创建一个独立的 Web API 应用程
    CreateaStandaloneWebAPIApplication(创建一个独立的WebAPI应用程序)Thistopiccontainsstep-by-stepinstructionsonhowtocreateanapplicationwiththeWebAPI.FormoreinformationontheWebAPI,seethefollowingtopic:BackendWebAPIService......
  • python之numpy (5 分割和复制)
    分割分割指将矩阵分割为几个小部分,以便于后续的计算需要。splitimportnumpyasnpm=np.random.random((3,3))print(m)sp=np.split(m,3,axis=0)ssp=np.split(m,3,axis=1)print(sp,ssp,sep='\n')[[0.373247510.933194940.18961048][0.814330810.377225750.00708......
  • python之numpy(4 选择数据及合并)
    选择数据importnumpyasnpm=np.random.random((3,3))print(m)print(m[0],m[1][1],sep='\n')print(m[1,1])print(m[1,:])print(m[:,1])结果:[[0.25960570.047399260.76332494][0.865032270.290489970.79591841][0.50535280.201822340.19601046]][......
  • windows保姆级的pycharm+anaconda搭建python虚拟环境
    (一)pycharm安装1.下载(1)从官网下载 ,一般来说选择社区版就够用了。我这里选择2024.1.6的windows版本OtherVersions-PyCharmGetpastreleasesandpreviousversionsofPyCharm.https://www.jetbrains.com/pycharm/download/other.html 2.安装(1)双击下载好的pycharm安......
  • PAT-1006 换个格式输出整数 python实现
    1.题目本题较为简单,只需要获取数字的各位数再分别按要求拼接到一起即可。2.代码如下  """输入:23423输出:BBSSS1234SS123"""#本题较为简单,只需要获取数字的各位数再分别按要求拼接到一起即可n=int(input())#获取输入的数字r......
  • Binance 如何使用 Quickwit 构建 100PB 日志服务(Quickwit 博客)
    三年前,我们开源了Quickwit,一个面向大规模数据集的分布式搜索引擎。我们的目标很宏大:创建一种全新的全文搜索引擎,其成本效率比Elasticsearch高十倍,配置和管理显著更简单,并且能够扩展到PB级别的数据。https://quickwit.io/blog/quickwit-first-release虽然我们知道Quickw......
  • python图片处理
    设置图片像素fromPILimportImagedefset_image(path,width=280):"""设置图片像素"""#打开图片image=Image.open(path)#原来大小original_width,original_height=image.size#设置新的图片大小new_width,new_height=w......