Happy New Year!

python 网站日志过滤分析

 

 

1.筛选日志 python filter_logs.py access.log --path "/a/passport/usernameIsExist" --output "filter1.log"

#!/usr/bin/env python
# -*- coding: utf-8 -*-

"""
筛选日志文件中包含特定URL路径的请求
"""

import os
import sys
from datetime import datetime

def filter_logs(log_file, target_path, output_file=None):
    """
    筛选日志文件中包含特定URL路径的请求
    
    Args:
        log_file (str): 日志文件路径
        target_path (str): 要筛选的URL路径
        output_file (str, optional): 输出文件路径,如果不提供则输出到控制台
    
    Returns:
        int: 匹配的日志条数
    """
    if not os.path.exists(log_file):
        print(f"错误: 日志文件 '{log_file}' 不存在")
        return 0
    
    count = 0
    output_handle = open(output_file, 'w', encoding='utf-8') if output_file else sys.stdout
    
    try:
        print(f"正在筛选包含 '{target_path}' 的日志...")
        with open(log_file, 'r', encoding='utf-8', errors='ignore') as f:
            for line_num, line in enumerate(f, 1):
                if target_path in line:
                    output_line = f"[行号: {line_num}] {line.strip()}"
                    print(output_line, file=output_handle)
                    count += 1
                
                # 每处理100000行显示进度
                if line_num % 100000 == 0:
                    print(f"已处理 {line_num} 行...")
    
    except Exception as e:
        print(f"处理日志时出错: {str(e)}")
    finally:
        if output_file and output_handle != sys.stdout:
            output_handle.close()
    
    print(f"\n筛选完成! 共找到 {count} 条匹配的日志记录")
    if output_file:
        print(f"结果已保存到: {output_file}")
    
    return count

if __name__ == "__main__":
    import argparse
    
    # 创建命令行参数解析器
    parser = argparse.ArgumentParser(description='筛选日志文件中包含特定URL路径的请求')
    parser.add_argument('log_file', help='日志文件路径')
    parser.add_argument('--path', '-p', default='/a/passport/usernameIsExist', 
                        help='要筛选的URL路径 (默认: /a/passport/usernameIsExist)')
    parser.add_argument('--output', '-o', help='输出文件路径 (默认输出到控制台)')
    
    args = parser.parse_args()
    
    # 生成默认输出文件名 (如果未指定)
    if not args.output:
        timestamp = datetime.now().strftime('%Y%m%d_%H%M%S')
        path_part = args.path.replace('/', '_').strip('_')
        args.output = f"filtered_{path_part}_{timestamp}.log"
    
    # 执行筛选
    filter_logs(args.log_file, args.path, args.output)

 

2.计算日志里面的ip 分析 (python count_ips.py d:\Downloads\logs\filter1.log)

#!/usr/bin/env python
# -*- coding: utf-8 -*-

"""
统计日志文件中的唯一IP地址数量
"""

import re
import sys
from collections import Counter

def count_unique_ips(log_file):
    """
    统计日志文件中的唯一IP地址数量
    
    Args:
        log_file (str): 日志文件路径
    
    Returns:
        tuple: (唯一IP地址数量, IP地址计数字典)
    """
    # IP地址正则表达式模式
    ip_pattern = r'^(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})'
    
    # 存储IP地址的集合和计数器
    ip_set = set()
    ip_counter = Counter()
    
    try:
        with open(log_file, 'r', encoding='utf-8', errors='ignore') as f:
            for line in f:
                # 跳过行号前缀
                if line.startswith('[行号:'):
                    # 提取实际日志内容
                    log_content = line.split('] ', 1)[1] if '] ' in line else line
                else:
                    log_content = line
                
                # 匹配IP地址
                match = re.match(ip_pattern, log_content.strip())
                if match:
                    ip = match.group(1)
                    ip_set.add(ip)
                    ip_counter[ip] += 1
    
    except Exception as e:
        print(f"处理日志时出错: {str(e)}")
        return 0, {}
    
    return len(ip_set), ip_counter

def print_ip_stats(ip_counter, top_n=10):
    """
    打印IP地址统计信息
    
    Args:
        ip_counter (Counter): IP地址计数器
        top_n (int): 显示前N个最常见的IP地址
    """
    print("\n最常见的IP地址:")
    for ip, count in ip_counter.most_common(top_n):
        print(f"{ip}: {count}次")

if __name__ == "__main__":
    import argparse
    
    # 创建命令行参数解析器
    parser = argparse.ArgumentParser(description='统计日志文件中的唯一IP地址数量')
    parser.add_argument('log_file', help='日志文件路径')
    parser.add_argument('--top', '-t', type=int, default=10, help='显示前N个最常见的IP地址 (默认: 10)')
    
    args = parser.parse_args()
    
    # 统计IP地址
    unique_ips_count, ip_counter = count_unique_ips(args.log_file)
    
    # 打印结果
    print(f"\n日志文件中共有 {unique_ips_count} 个唯一IP地址")
    
    # 打印最常见的IP地址
    print_ip_stats(ip_counter, args.top)

 

日志文件中共有 110 个唯一IP地址

最常见的IP地址:
123.133.242.250: 15次
223.74.68.152: 12次
180.233.70.253: 12次
180.98.168.153: 11次
113.63.2.138: 9次
115.195.68.112: 9次
223.104.206.174: 9次
49.90.9.194: 8次
60.177.192.44: 8次

 

posted @ 2025-10-28 09:46  义美-小义  阅读(3)  评论(0)    收藏  举报
返回顶部小火箭
世界很公平,想要最好,就一定得付出!
x
github主页