2014-09-04 17 views
2

로그 파일을 구문 분석하려고합니다. 아래 주어진 구조와 같습니다. 파이썬으로 처리하고 데이터베이스에 추출 된 데이터를 저장하고 싶습니다. 어떻게해야합니까?python을 사용하여 로그 파일을 구문 분석하고 데이터를 데이터베이스에 저장하는 방법은 무엇입니까?

간단한 키 값 쌍을 구문 분석 할 수 있지만 문제가 있습니다.

1 : 어떻게하면 중첩 된 구조를 구문 분석 할 수 있습니까? 예를 들어 샘플 파일의 컨텍스트 필드가 기본 그룹에 중첩되어 있습니까?

2 : 구분 기호가 문자열 인 경우 조건을 처리하는 방법. key : value 쌍 구분 기호는 콜론 (:)이며 "site"키에는 키가 있습니다. 값 쌍 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를 사용하여 반환 된 dict이 올바른지 확인하기 위해 출력을 사람이 읽을 수 있도록합니다.

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입니다. 그것은 선을 읽고 완벽한 파싱 가능한 객체가 있는지를 봅니다. 그렇지 않으면 다음 행을 읽고 마지막 행과 연결합니다. 파싱 ​​할 수있는 객체가로드 될 때까지 계속됩니다. 그런 다음 모든 라인이 소비되고 모든 객체가 발견 될 때까지이 작업을 반복합니다.

pprint.pprint(json_data) 

내가 DICT을 pprint하지만 정상 DICT 통과를 사용하는 등 데이터를 처리 할 수있는 표준 파이썬 사전입니다 : 코드의이 시점에서

당신은 json_data에 완전한 JSON 객체를 읽고 .

json_data['context']['course_id'] 

또는 통해 host : 예를 들어, 당신은 같은과 course_id를 검색 할 수 있습니다 귀하의 제안에 대한

json_data['host'] 
+0

감사 마이클 어떤 생각이 우리가 어떻게 데이터베이스에이 값을 입력 할 수 있습니다 어떻게해야합니까? – rajsinghaniaful

+0

작업 할 데이터베이스를 선택해야합니다. Mysql, Postgres, Sqlite 등 (목록은 https://wiki.python.org/moin/DatabaseInterfaces에서 찾을 수 있습니다). 데이터베이스가 선택되면이를 구성해야합니다. 일단 이것이 끝나면 다른 StackOverflow 질문에 남을 가능성이 더 높은 프로그래밍 연습입니다. MySql은 일반적인 선택이며 이미 많은 질문이 있다는 것을 알았습니다. http://stackoverflow.com/questions/372885/how-do-i-connect-to-a-mysql-database-in-python –

1

데이터는 JSON 형식입니다. 모듈을 구문 분석하려면 표준 라이브러리에 json 모듈을 사용하십시오.

그러나 데이터는 서로 연결된 몇 개의 JSON dicts로 보입니다. 다행히도 여러 개별 항목을 붙여 넣었 으면 좋겠다. 그렇지 않으면 구문 분석을 시작하기 전에 일부 데이터 정리를해야 할 것이다. 이들은 개별 파일을 가정하면

, I는 data 변수로로드 된 "username": "raeha" 세트의 일례주지 (문자열로)

>>> 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 데이터를 얻어와 그것을 파이썬 데이터 유형으로 포맷합니다. 일반적으로 가장 바깥 쪽 형식은 dict이며 각 키는 문자열이며 각 값은 True, False 또는 None과 같이 문자열, 목록, 사전, 숫자 값 또는 항목이 될 수 있습니다. JSON에서는 true, falsenull에 해당합니다.