Как написать скрипт, который читает файл журнала и группирует журналы по ключевым словам и считает его за час - PullRequest
0 голосов
/ 27 сентября 2019

У меня есть данные моего файла журнала с INFO, WARNING, ERROR, OTHER (FATAL, DEBUG).

посмотрите мой отредактированный файл журнала ниже

10:00:00 INFO    
10:00:00 INFO   
10:01:51 WARNING    
10:02:05 ERROR      
10:05:20 INFO 
10:06:01 WARNING
10:07:08 ERROR 
10:44:00 DEBUG  
10:51:01 FATAL
10:52:05 ERROR  
11:01:59 INFO  
11:08:01 WARNING  
11:59:05 ERROR 
12:02:00 INFO
12:09:01 WARNING 
12:18:05 ERROR 
12:31:00 INFO 
12:40:01 FATAL 
12:55:05 DEBUG 
13:05:36 INFO 
13:26:01 WARNING
13:30:05 ERROR

Мне нужно подсчитать общее количествочисло INFO, WARNING, ERROR, OTHER в час.

OUTPUT должен выглядеть следующим образом:

10:00 3, 2,3,2 

11:00 1,1,1,0

10: 00 в выходных данных - это интервал времени с 10:00:00 до 10: 59: 59

Импортировал панд и itertools и использовал группу, но не смог получить.Я не хочу путать вас с моим кодом.

РЕДАКТИРОВАТЬ: Я сожалею, на самом деле мои журналы содержат еще один файл с сообщением lof файл выглядит как

10:00:00 INFO hi  
10:00:00 INFO hello
10:01:51 WARNING careful
10:02:05 ERROR failed
10:05:20 INFO hi
10:06:01 WARNING careful man
10:07:08 ERROR you failed
10:44:00 DEBUG do it again
10:51:01 FATAL dead
10:52:05 ERROR you have problem
11:01:59 INFO hello
11:08:01 WARNING careful
11:59:05 ERROR problem
12:02:00 INFO how are you
12:09:01 WARNING take care
12:18:05 ERROR problems
12:31:00 INFO good good
12:40:01 FATAL die
12:55:05 DEBUG about to die

Ответы [ 4 ]

2 голосов
/ 27 сентября 2019

С вашими образцами данных:

df = pd.read_csv('logfile.log', sep='\s+', header=None)
df[0] = pd.to_datetime(df[0])
pd.crosstab(df[0].dt.hour, df[1])

Выход:

1   DEBUG  ERROR  FATAL  INFO  WARNING
0                                     
10      1      3      1     3        2
11      0      1      0     1        1
12      1      1      1     2        1
13      0      1      0     1        1

Обновление: иметь OTHER:

# read log file
df = pd.read_csv('logfile.log', header=None)

# extract the messages
df = df[0].str.extract('([\d:]+) (\w+)')

# convert to datetime
df[0] = pd.to_datetime(df[0])

df.loc[~df[1].isin(['INFO','WARNING','ERROR']), 1] = 'OTHER'
pd.crosstab(df[0].dt.hour, df[1])

Выход:

1   ERROR  INFO  OTHER  WARNING
0                              
10      3     3      2        2
11      1     1      0        1
12      1     2      2        1
13      1     1      0        1
1 голос
/ 27 сентября 2019

Ваш df:

df

time     event
10:00:00 INFO    
10:00:00 INFO   
10:01:51 WARNING    
10:02:05 ERROR      
10:05:20 INFO 
10:06:01 WARNING
10:07:08 ERROR 
10:44:00 DEBUG  
10:51:01 FATAL
10:52:05 ERROR  
11:01:59 INFO  
11:08:01 WARNING  
11:59:05 ERROR 
12:02:00 INFO
12:09:01 WARNING 
12:18:05 ERROR 
12:31:00 INFO 
12:40:01 FATAL 
12:55:05 DEBUG 
13:05:36 INFO 
13:26:01 WARNING
13:30:05 ERROR

вам нужно сгруппировать по времени и функции события и использовать DataFrame.Groupby.count :

df['time']=pd.to_datetime(df['time'])
count=df.groupby([df['time'].dt.hour,'event']).count().unstack()
print(count)

       time                         
event DEBUG ERROR FATAL INFO WARNING
time                                
10      1.0   3.0   1.0  3.0     2.0
11      NaN   1.0   NaN  1.0     1.0
12      1.0   1.0   1.0  2.0     1.0
13      NaN   1.0   NaN  1.0     1.0

count.columns=count.columns.droplevel()
count['OTHER']=count[['ERROR','INFO','WARNING']].sum(axis=1)
count=count[['DEBUG','FATAL','OTHER']].fillna(0)
print(count)


event  DEBUG  FATAL  OTHER
time                      
10       1.0    1.0    8.0
11       0.0    0.0    3.0
12       1.0    1.0    4.0
13       0.0    0.0    3.0
1 голос
/ 27 сентября 2019

Вам нужно:

df['time'] = pd.to_datetime(df['time'])
df.loc[df['type'].isin(['ERROR', 'INFO', 'WARNING']), 'type'] = 'OTHER'
df.groupby([df['time'].dt.hour, df['type']]).size().unstack().fillna(0)

Вывод:

type  DEBUG  FATAL  OTHER
time                     
10      1.0    1.0    8.0
11      0.0    0.0    3.0
12      1.0    1.0    4.0
13      0.0    0.0    3.0
0 голосов
/ 27 сентября 2019

Без преобразования в дату и время:

df = pd.read_csv('log_ex.txt', sep=' ', header=None, names=["time", "type"])
df['time'] = df['time'].apply(lambda x: x[:2])
df_new = pd.crosstab(df["time"], df["type"])


df_new["OTHER"] = df_new["FATAL"] + df_new["DEBUG"]
del df_new["FATAL"]
del df_new["DEBUG"]

Вывод:

df_new 

type    ERROR   INFO    WARNING OTHER
time                
10  3   3   2   2
11  1   1   1   0
12  1   2   1   2
13  1   1   1   0
...