1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
| #!/usr/bin/env python3
"""Process log files and output statistics."""
import argparse
import json
import logging
import sys
from collections import Counter
from pathlib import Path
def setup_logging(verbose):
logging.basicConfig(
level=logging.DEBUG if verbose else logging.INFO,
format='%(levelname)s: %(message)s'
)
def parse_args():
parser = argparse.ArgumentParser(
description=__doc__,
formatter_class=argparse.RawDescriptionHelpFormatter
)
parser.add_argument(
'logfiles',
nargs='+',
type=Path,
help='Log files to process'
)
parser.add_argument(
'-o', '--output',
type=argparse.FileType('w'),
default=sys.stdout,
help='Output file (default: stdout)'
)
parser.add_argument(
'-f', '--format',
choices=['json', 'text'],
default='text',
help='Output format'
)
parser.add_argument(
'-v', '--verbose',
action='store_true',
help='Enable verbose output'
)
return parser.parse_args()
def analyze_logs(logfiles):
stats = Counter()
for logfile in logfiles:
logging.info(f"Processing {logfile}")
if not logfile.exists():
logging.warning(f"File not found: {logfile}")
continue
for line in logfile.read_text().splitlines():
if 'ERROR' in line:
stats['errors'] += 1
elif 'WARNING' in line:
stats['warnings'] += 1
stats['total'] += 1
return dict(stats)
def output_results(stats, output, fmt):
if fmt == 'json':
json.dump(stats, output, indent=2)
output.write('\n')
else:
for key, value in stats.items():
output.write(f"{key}: {value}\n")
def main():
args = parse_args()
setup_logging(args.verbose)
try:
stats = analyze_logs(args.logfiles)
output_results(stats, args.output, args.format)
return 0
except Exception as e:
logging.error(f"Failed: {e}")
return 1
if __name__ == '__main__':
sys.exit(main())
|