2014-09-04 38 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

相关问题