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次

 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号 
         
        