【问题标题】:How to parse log file using python and store data in database?如何使用python解析日志文件并将数据存储在数据库中?
【发布时间】:2014-09-04 05:36:15
【问题描述】:

我正在尝试解析一个日志文件。其中包含如下所示的结构 我想用 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
    }

【问题讨论】:

    标签: python parsing logging logfiles log-files


    【解决方案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 数据类型。通常,最外层的类型是 dict,每个键都是字符串,每个值可以是字符串、列表、字典、数值或 TrueFalseNone 等项。这些对应于 JSON 中的 truefalsenull

    【讨论】:

      【解决方案2】:

      正如已经指出的,这是一个 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)
      

      这段代码有点杂乱无章。它读取一行并查看我们是否有一个完整的可解析对象。如果不是,它会读取下一行并将其与最后一行连接起来。这一直持续到可以加载可解析的对象为止。然后它会一遍又一遍地执行此操作,直到所有行都被消耗并找到所有对象。

      此时代码中您已将完整的 JSON 对象读入json_data

      pprint.pprint(json_data)
      

      我将字典打印出来,但它是一个标准的 Python 字典,可以像使用普通字典遍历一样处理数据。例如,您可以使用以下内容检索course_id

      json_data['context']['course_id']
      

      host 通过:

      json_data['host']
      

      【讨论】:

      • 感谢您的建议 michael 您知道我们如何在数据库中输入这些值吗?
      • 您需要选择要使用的数据库。 Mysql、Postgres、Sqlite 等(可以在此处找到列表:wiki.python.org/moin/DatabaseInterfaces)。选择数据库后,您必须对其进行配置。一旦完成,这是一个编程练习,最好留给另一个 StackOverflow 问题。 MySql 是一个常见的选择,我看到已经有很多这样的问题。 stackoverflow.com/questions/372885/…
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-20
      • 1970-01-01
      相关资源
      最近更新 更多