@@ -37,7 +37,7 @@ def is_in(self, log_list):
3737
3838def check (log_file , duration_to_count , log_count_threshold , log_format ):
3939 recent_log_list = []
40- unique_frequent_log_list = []
40+ unique_frequent_log_list = {}
4141
4242 with open (log_file , "r" ) as f :
4343 for full_message in f .readlines ():
@@ -62,12 +62,9 @@ def check(log_file, duration_to_count, log_count_threshold, log_format):
6262 except ValueError :
6363 continue
6464
65- # skip if the log is already considered as frequent
66- if recent_log .is_in (unique_frequent_log_list ):
67- continue
6865 recent_log_list .append (recent_log )
6966
70- # remove obsolete or already frequent log
67+ # remove obsolete log
7168 for log in recent_log_list [:]:
7269 duration = timestamp - log .timestamp
7370 if duration_to_count < duration :
@@ -76,32 +73,45 @@ def check(log_file, duration_to_count, log_count_threshold, log_format):
7673 # extract duplicated (= frequent) log
7774 for i in range (len (recent_log_list )):
7875 log_count = 0
79- if recent_log_list [i ].is_in (unique_frequent_log_list ):
80- continue
81-
8276 for j in range (len (recent_log_list )):
8377 if i <= j :
8478 continue
8579 if recent_log_list [i ].is_same (recent_log_list [j ]):
8680 log_count += 1
8781
8882 if log_count_threshold <= log_count :
89- unique_frequent_log_list .append (recent_log_list [i ])
83+ contained_frequent_log = None
84+ for frequent_log in unique_frequent_log_list :
85+ if frequent_log .is_same (recent_log_list [i ]):
86+ contained_frequent_log = frequent_log
87+ break
88+
89+ if contained_frequent_log :
90+ # update the existing value
91+ unique_frequent_log_list [contained_frequent_log ] = max (
92+ unique_frequent_log_list [contained_frequent_log ], log_count
93+ )
94+ else :
95+ # add a new key and value
96+ unique_frequent_log_list [recent_log_list [i ]] = log_count
9097
9198 if len (unique_frequent_log_list ) == 0 :
9299 print (
93100 "No frequent log. The log format designated by the `-f` option may be different from the actual log format."
94101 )
95102 else :
96103 for frequent_log in unique_frequent_log_list :
97- print (frequent_log .full_message )
104+ log_count = unique_frequent_log_list [frequent_log ]
105+ print (f"{ frequent_log .full_message [:- 1 ]} \t { log_count } " )
98106
99107
100108def main ():
101109 parser = argparse .ArgumentParser (description = "frequent log checker" )
102110 parser .add_argument ("log_file" , help = "launch log file" )
103- parser .add_argument ("-d" , "--log-duration" , default = 1.0 , help = "duration to count log" )
104- parser .add_argument ("-c" , "--log-count" , default = 2 , help = "log count threshold" )
111+ parser .add_argument (
112+ "-d" , "--log-duration" , default = 2.0 , type = float , help = "duration to count log"
113+ )
114+ parser .add_argument ("-c" , "--log-count" , default = 5 , type = int , help = "log count threshold" )
105115 parser .add_argument ("-f" , "--log-format" , default = "1" , help = "log format" )
106116 args = parser .parse_args ()
107117
0 commit comments