Skip to content

Commit f30dc24

Browse files
committed
Log filter script added.
1 parent bea2b2f commit f30dc24

File tree

1 file changed

+92
-0
lines changed

1 file changed

+92
-0
lines changed

userlog-analysis/log-filter.py

+92
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
#!/usr/bin/env python3
2+
3+
import argparse
4+
import glob
5+
import os.path
6+
import sys
7+
import gzip
8+
import csv
9+
from datetime import datetime
10+
from dateutil import parser as dateparser
11+
12+
13+
def get_files(prefix):
14+
files = []
15+
files += glob.glob(prefix + '*.gz')
16+
files = list(map(lambda s: s.replace('\\', '/'), files))
17+
files.sort()
18+
if os.path.isfile(prefix):
19+
files.append(prefix)
20+
return files
21+
22+
23+
def _text_max_ts(r, max_ts):
24+
if r:
25+
if int(r[1]) > max_ts:
26+
exit(0)
27+
return r
28+
else:
29+
return None
30+
31+
32+
def make_filters(min_time, max_time, seconds, convert_time):
33+
filters = []
34+
35+
if min_time:
36+
min_dt = dateparser.parse(min_time)
37+
min_ts = int(min_dt.timestamp())
38+
filters.append(lambda r: r if r and int(r[1]) >= min_ts else None)
39+
if seconds:
40+
max_ts = min_ts + int(seconds)
41+
filters.append(lambda r: _text_max_ts(r, max_ts))
42+
43+
if max_time:
44+
max_dt = dateparser.parse(max_time)
45+
max_ts = int(max_dt.timestamp())
46+
filters.append(lambda r: _text_max_ts(r, max_ts))
47+
48+
if convert_time:
49+
filters.append(lambda r: [r[0], datetime.fromtimestamp(
50+
int(r[1])).strftime('%Y-%m-%d %H:%M:%S')] + r[2:] if r else None)
51+
52+
return filters
53+
54+
55+
def process_file(file, filters, writer):
56+
if file.endswith('.gz'):
57+
fp = gzip.open(file, 'rt', encoding='utf-8')
58+
else:
59+
fp = open(file, 'r', encoding='utf-8')
60+
61+
reader = csv.reader(fp, delimiter=',')
62+
for row in reader:
63+
for filter in filters:
64+
row = filter(row)
65+
if not row:
66+
continue
67+
if row:
68+
writer.writerow(row)
69+
70+
fp.close()
71+
72+
73+
if __name__ == "__main__":
74+
sys.stdin.reconfigure(encoding='utf-8')
75+
sys.stdout.reconfigure(encoding='utf-8')
76+
sys.stderr.reconfigure(encoding='utf-8')
77+
78+
# Process program arguments...
79+
parser = argparse.ArgumentParser()
80+
parser.add_argument("--log", type=str, help="Prefix path to user actions log ('./user_actions.log' is default)")
81+
parser.add_argument('--after', type=str, help="Show records after given time.")
82+
parser.add_argument('--before', type=str, help="Show records before given time.")
83+
parser.add_argument('--seconds', type=str, help="If 'after' is set, then time window of given seconds is listed.")
84+
parser.add_argument('--convert-time', action='store_true',
85+
help="If set, unix ts will be converted to readable format.")
86+
args = parser.parse_args()
87+
88+
writer = csv.writer(sys.stdout, delimiter=',')
89+
filters = make_filters(args.after, args.before, args.seconds or 0, args.convert_time)
90+
files = get_files(args.log or './user_actions.log')
91+
for file in files:
92+
process_file(file, filters, writer)

0 commit comments

Comments
 (0)