1 | #!/usr/bin/env python3<br># log_analyzer.py - 日志分析工具<br><br>import argparse<br>import re<br>from collections import Counter<br><br>def analyze_log(filename, pattern=None, top_n=10, output=None):<br> """分析日志文件"""<br> with open(filename, 'r', encoding='utf-8') as f:<br> lines = f.readlines()<br> <br> # 过滤匹配的行<br> if pattern:<br> regex = re.compile(pattern)<br> lines = [line for line in lines if regex.search(line)]<br> <br> # 统计IP地址<br> ip_pattern = re.compile(r'\b(?:[0-9]{1,3}\.){3}[0-9]{1,3}\b')<br> ips = []<br> for line in lines:<br> ips.extend(ip_pattern.findall(line))<br> <br> ip_counts = Counter(ips).most_common(top_n)<br> <br> # 输出结果<br> result = f"\n分析结果 ({len(lines)} 行匹配):\n"<br> result += "="*40 + "\n"<br> result += "Top {} IP 地址:\n".format(top_n)<br> for ip, count in ip_counts:<br> result += f" {ip}: {count} 次\n"<br> <br> if output:<br> with open(output, 'w') as f:<br> f.write(result)<br> print(f"结果已保存到: {output}")<br> else:<br> print(result)<br><br>def main():<br> parser = argparse.ArgumentParser(<br> prog='log_analyzer',<br> description='Web日志分析工具 - 统计访问IP和请求',<br> epilog='示例: log_analyzer access.log --pattern "404" --top 5'<br> )<br> <br> parser.add_argument('logfile', help='日志文件路径')<br> parser.add_argument('-p', '--pattern', help='过滤正则表达式')<br> parser.add_argument('-t', '--top', type=int, default=10, help='显示前N个IP (默认: 10)')<br> parser.add_argument('-o', '--output', help='输出结果到文件')<br> parser.add_argument('-v', '--verbose', action='store_true', help='详细模式')<br> <br> args = parser.parse_args()<br> <br> if args.verbose:<br> print(f"开始分析: {args.logfile}")<br> <br> analyze_log(args.logfile, args.pattern, args.top, args.output)<br><br>if __name__ == '__main__':<br> main()
|