2016-10-28 2 views
2

У меня есть файлы, которые имеют много строк в форме входа:Log файл панды Dataframe

LogLevel [13/10/2015 00:30:00.650] [Message Text] 

Моя цель состоит в том, чтобы преобразовать каждую строку в файл журнала в хороший кадр данных. Я устал это делать, разделив строки на [персонаж, однако я все еще не получаю аккуратный фрейм данных.

Мой код:

level = [] 
time = [] 
text = [] 

    with open(filename) as inf: 
    for line in inf: 
     parts = line.split('[') 
     if len(parts) > 1: 
      level = parts[0] 
      time = parts[1] 
      text = parts[2] 
     print (parts[0],parts[1],parts[2]) 

s1 = pd.Series({'Level':level, 'Time': time, 'Text':text}) 
df = pd.DataFrame(s1).reset_index() 

Heres мой печататься кадр данных:

Info  10/08/16 10:56:09.843] In Function CCatalinaPrinter::ItemDescription()] 

Info  10/08/16 10:56:09.843] Sending UPC Description Message ] 

Как я могу улучшить это, чтобы лишить пробельные и другой ']' характер

Спасибо

+0

@ atkawa7 nope that did not work – ukbaz

ответ

2

Вы можете использовать read_csv с сепаратором \s*\[ - пробельные [:

import pandas as pd 
from pandas.compat import StringIO 

temp=u"""LogLevel [13/10/2015 00:30:00.650] [Message Text] 
LogLevel [13/10/2015 00:30:00.650] [Message Text] 
LogLevel [13/10/2015 00:30:00.650] [Message Text] 
LogLevel [13/10/2015 00:30:00.650] [Message Text]""" 
#after testing replace StringIO(temp) to filename 
df = pd.read_csv(StringIO(temp), sep="\s*\[", names=['Level','Time','Text'], engine='python') 

Затем удалить ] по strip и преобразующему колонку Timeto_datetime:

df.Time = pd.to_datetime(df.Time.str.strip(']'), format='%d/%m/%Y %H:%M:%S.%f') 
df.Text = df.Text.str.strip(']') 

print (df) 
     Level     Time   Text 
0 LogLevel 2015-10-13 00:30:00.650 Message Text 
1 LogLevel 2015-10-13 00:30:00.650 Message Text 
2 LogLevel 2015-10-13 00:30:00.650 Message Text 
3 LogLevel 2015-10-13 00:30:00.650 Message Text 

print (df.dtypes) 
Level   object 
Time  datetime64[ns] 
Text    object 
dtype: object 
+0

работает отлично, пока я не заменил temp на имя файла, возможно, потому что мой файл является .log, а не .csv? – ukbaz

+1

нужно заменить 'StringIO (temp)' на 'filenam.log', это не проблема, она может закончиться' .log' – jezrael

+0

разбила его! спасибо @jezrael – ukbaz

0

мне пришлось разобрать мину вручную, так как мой сепаратор появился в моем теле сообщения и тело сообщения будет охватывать несколько строк, например, если исключение выбрано из моего приложения Flask и записанного трека стека.

Вот мой формат создание журнала ...

logging.basicConfig(filename="%s/%s_MyApp.log" % (Utilities.logFolder , datetime.datetime.today().strftime("%Y%m%d-%H%M%S")) , level=logging.DEBUG, format="%(asctime)s,%(name)s,%(process)s,%(levelno)u,%(message)s", datefmt="%Y-%m-%d %H:%M:%S") 

И код синтаксического анализа в моем модуле Utilities

Utilities.py 

import re 
import pandas 

logFolder = "./Logs" 

logLevelToString = { "50" : "CRITICAL", 
        "40" : "ERROR" , 
        "30" : "WARNING" , 
        "20" : "INFO" , 
        "10" : "DEBUG" , 
        "0" : "NOTSET" } # https://docs.python.org/3.6/library/logging.html#logging-levels 

def logFile2DataFrame(filePath) : 
    dfLog = pandas.DataFrame(columns=[ 'Timestamp' , 'Module' , 'ProcessID' , 'Level' , 'Message' ]) 
    tsPattern = "^[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}," 

    with open(filePath , 'r') as logFile : 
     numRows = -1 
     for line in logFile : 
      if re.search(tsPattern , line) : 
       tokens = line.split(",") 
       timestamp = tokens[0] 
       module = tokens[1] 
       processID = tokens[2] 
       level  = logLevelToString[ tokens[3] ] 
       message = ",".join(tokens[4:]) 
       numRows += 1 
       dfLog.loc[ numRows ] = [ timestamp , module , processID , level , message ] 
      else : 
       # Multiline message, integrate it into last record 
       dfLog.loc[ numRows , 'Message' ] += line 
    return dfLog 

Я на самом деле создал это вспомогательное сообщение, чтобы позволить мне осмотреть мои журналы прямо из моих Flask, поскольку у меня есть удобный шаблон, который отображает DataFrame. Должно ускорить отладку связки с момента включения flaskapp на сервере Tornado WSGI, предотвращает показ нормальной страницы отладки из Flask при вызове исключения. Если кто-нибудь знает, как восстановить эту функциональность в таком использовании, пожалуйста, поделитесь.