Files
mkdocs/docs/Obsidian笔记体系/Resources/工具/脚本库/log_analyzer.py
renjianbo 8a4717277d 测试
2026-01-12 17:14:58 +08:00

101 lines
3.3 KiB
Python

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# log_analyzer.py
# 日志分析工具
import re
import sys
from collections import Counter
from datetime import datetime
def analyze_logs(log_file):
"""分析日志文件"""
errors = []
warnings = []
patterns = {
'crash': r'FATAL|crash|exception',
'anr': r'ANR|Application Not Responding',
'oom': r'OutOfMemory|OOM',
'nullpointer': r'NullPointerException',
'illegalstate': r'IllegalStateException',
}
pattern_matches = {key: [] for key in patterns.keys()}
print(f"Analyzing log file: {log_file}")
print("=" * 60)
try:
with open(log_file, 'r', encoding='utf-8', errors='ignore') as f:
for line_num, line in enumerate(f, 1):
# 检查错误
if 'E/' in line or 'ERROR' in line.upper():
errors.append((line_num, line.strip()))
# 检查警告
if 'W/' in line or 'WARN' in line.upper():
warnings.append((line_num, line.strip()))
# 检查特定模式
for pattern_name, pattern in patterns.items():
if re.search(pattern, line, re.IGNORECASE):
pattern_matches[pattern_name].append((line_num, line.strip()))
# 输出统计信息
print(f"\nSummary:")
print(f" Total lines analyzed: {line_num}")
print(f" Errors: {len(errors)}")
print(f" Warnings: {len(warnings)}")
for pattern_name, matches in pattern_matches.items():
if matches:
print(f" {pattern_name.upper()}: {len(matches)}")
# 显示错误示例
if errors:
print(f"\nFirst 10 errors:")
for line_num, line in errors[:10]:
print(f" Line {line_num}: {line[:100]}")
# 显示模式匹配示例
for pattern_name, matches in pattern_matches.items():
if matches:
print(f"\n{pattern_name.upper()} occurrences (first 5):")
for line_num, line in matches[:5]:
print(f" Line {line_num}: {line[:100]}")
# 生成报告文件
report_file = log_file + ".report.txt"
with open(report_file, 'w', encoding='utf-8') as f:
f.write(f"Log Analysis Report\n")
f.write(f"Generated: {datetime.now()}\n")
f.write(f"Source file: {log_file}\n")
f.write("=" * 60 + "\n\n")
f.write(f"Errors: {len(errors)}\n")
f.write(f"Warnings: {len(warnings)}\n\n")
if errors:
f.write("Errors:\n")
for line_num, line in errors:
f.write(f" Line {line_num}: {line}\n")
print(f"\nReport saved to: {report_file}")
except FileNotFoundError:
print(f"Error: File not found: {log_file}")
return 1
except Exception as e:
print(f"Error: {e}")
return 1
return 0
if __name__ == '__main__':
if len(sys.argv) < 2:
print("Usage: python log_analyzer.py <log_file>")
sys.exit(1)
log_file = sys.argv[1]
exit_code = analyze_logs(log_file)
sys.exit(exit_code)