2014-09-04 108 views
2

我想解析一個日誌文件。它包含如下給出的結構 我想用python來完成它,並希望將提取的數據存儲在數據庫中我該怎麼做?如何使用python解析日誌文件並將數據存儲在數據庫中?

我能夠解析簡單的鍵值對,但面臨一些問題。

1:我怎樣才能解析嵌套結構的示例文件中的上下文字段嵌套在主組?

2:如果分隔符作爲字符串出現,如何處理條件。像鍵:值對分隔符是冒號(:),並在「網站」鍵有一個鍵:值對site_url:http://something.com這裏的URL還包含冒號(:),它給出了錯誤的答案。

{ 
     "username": "lavania", 
     "host": "10.105.22.32", 
     "event_source": "server", 
     "event_type": "/courses/XYZ/CS101/2014_T1/xblock 
/i4x:;_;_XYZ;_CS101;_video;_d333fa637a074b41996dc2fd5e675818/handler/xmodule_handler/save_user_state", 
     "context": { 
      "course_id": "XYZ/CS101/2014_T1", 
      "course_user_tags": {}, 
      "user_id": 42, 
      "org_id": "XYZ" 
     }, 
     "time": "2014-06-20T05:49:10.468638+00:00", 
     "site":"http://something.com", 
     "ip": "127.0.0.1", 
     "event": "{\"POST\": {\"saved_video_position\": [\"00:02:10\"]}, \"GET\": {}}", 
     "agent": "Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:18.0) Gecko/20100101 Firefox/18.0", 
     "page": null 
    } 

    { 
     "username": "rihana", 
     "host": "10.105.22.32", 
     "event_source": "server", 
     "event_type": "problem_check", 
     "context": { 
      "course_id": "XYZ/CS101/2014_T1", 
      "course_user_tags": {}, 
      "user_id": 40, 
      "org_id": "XYZ", 
      "module": { 
       "display_name": "" 
      } 
     }, 
     "time": "2014-06-20T06:43:52.716455+00:00", 
     "ip": "127.0.0.1", 
     "event": { 
      "submission": { 
       "i4x-XYZ-CS101-problem-33e4aac93dc84f368c93b1d08fa984fc_2_1": { 
        "input_type": "choicegroup", 
        "question": "", 
        "response_type": "multiplechoiceresponse", 
        "answer": "MenuInflater.inflate()", 
        "variant": "", 
        "correct": true 
       } 
      }, 
      "success": "correct", 
      "grade": 1, 
      "correct_map": { 
       "i4x-XYZ-CS101-problem-33e4aac93dc84f368c93b1d08fa984fc_2_1": { 
        "hint": "", 
        "hintmode": null, 
        "correctness": "correct", 
        "npoints": null, 
        "msg": "", 
        "queuestate": null 
       } 
      }, 
      "state": { 
       "student_answers": {}, 
       "seed": 1, 
       "done": null, 
       "correct_map": {}, 
       "input_state": { 
        "i4x-XYZ-CS101-problem-33e4aac93dc84f368c93b1d08fa984fc_2_1": {} 
       } 
      }, 
      "answers": { 
       "i4x-XYZ-CS101-problem-33e4aac93dc84f368c93b1d08fa984fc_2_1": "choice_0" 
      }, 
      "attempts": 1, 
      "max_grade": 1, 
      "problem_id": "i4x://XYZ/CS101/problem/33e4aac93dc84f368c93b1d08fa984fc" 
     }, 
     "agent": "Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:29.0) Gecko/20100101 Firefox/29.0", 
     "page": "x_module" 
    } 


    { 
     "username": "troysa", 
     "host": "localhost", 
     "event_source": "server", 
     "event_type": "/courses/XYZ/CS101/2014_T1/instructor_dashboard/api/list_instructor_tasks", 
     "context": { 
      "course_id": "XYZ/CS101/2014_T1", 
      "course_user_tags": {}, 
      "user_id": 6, 
      "org_id": "XYZ" 
     }, 
     "time": "2014-06-20T05:49:26.780244+00:00", 
     "ip": "127.0.0.1", 
     "event": "{\"POST\": {}, \"GET\": {}}", 
     "agent": "Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:29.0) Gecko/20100101 Firefox/29.0", 
     "page": null 
    } 

回答

0

正如已經指出的那樣,這是一個JSON數據結構。我寫了一些快速代碼,它將逐行讀取您的日誌文件並嘗試查找完整的多行json對象。一旦所有行被讀取完成。我在對象上使用pprint,以便輸出是人類可讀的,以確保返回的字典看起來正確。

import json 
import pprint 

with open("log.txt") as infile: 
    # Loop until we have parsed all the lines. 
    for line in infile: 
     # Read lines until we find a complete object 
     while (True): 
      try: 
       json_data = json.loads(line) 
       # We have a complete onject here 
       pprint.pprint(json_data) 
       # Try and find a new JSON object 
       break 
      except ValueError: 
       # We don't have a complete JSON object 
       # read another line and try again 
       line += next(infile) 

此代碼是一個kludge位。它讀取一行,看看我們是否有完整的可解析對象。如果不是,則讀取下一行並將其與最後一行連接。這一直持續到可以加載可解析的對象。然後它會一遍又一遍地重複這些操作,直到所有的行被消耗完,並找到所有的對象。

在代碼中的這一點上,你已經閱讀了完整的JSON對象爲json_data

pprint.pprint(json_data) 

我pprint的字典了,但它是一個可以對數據進行處理,如使用普通的字典遍歷一個標準的Python字典。

json_data['context']['course_id'] 

或通過host:例如,你可以用類似檢索course_id

json_data['host'] 
+0

感謝您的建議,邁克爾 你怎麼也知道怎樣才能在數據庫中輸入這些價值? – rajsinghaniaful 2014-09-04 10:51:13

+0

您將需要選擇一個數據庫來處理。 Mysql,Postgres,Sqlite等(列表可以在這裏找到:https://wiki.python.org/moin/DatabaseInterfaces)。一旦數據庫被選中,你將不得不對其進行配置。一旦完成,這是一個編程練習,可能更好地留給另一個StackOverflow問題。 MySql是一個常見的選擇,我看到有很多像這樣的問題ie。 http://stackoverflow.com/questions/372885/how-do-i-connect-to-a-mysql-database-in-python – 2014-09-04 11:04:50

1

您的數據是JSON的格式。使用標準庫中的json模塊解析它。

但是,您的數據似乎是幾個串聯在一起的JSON字典。希望你只是從幾個單獨的條目粘貼,否則你將不得不做一些數據清理,然後開始詳細解析。

假設這些是單獨的文件中,我將得到"username": "raeha"集合,其已經裝載到data變量的一個示例:

>>> import json 
>>> newdata = json.loads(data) 
>>> print(newdata["context"]) 
{'course_id': 'XYZ/CS101/2014_T1', 'course_user_tags': {}, 'org_id': 'XYZ', 'user_id': 40, 'module': {'display_name': ''}} 
>>> print(newdata["context"]["user_id"]) 
40 

json.loads()方法採用原始JSON數據(字符串)和將其格式化爲Python數據類型。通常,最外面的類型是字典,其中的每個鍵都是字符串,並且每個值可以是字符串,列表,字典,數字值或項目,如True,FalseNone。這些對應於JSON中的true,falsenull

相關問題