【问题标题】:Http log parsing in c++c++中的Http日志解析
【发布时间】:2016-12-25 08:43:20
【问题描述】:

我有各种各样的要求。以其中两个请求为例。过滤器的格式如下:

过滤器:

  1. REQUEST_TYPE:GET|POST|PUT|DELETE
  2. RELATIVE_URL:/main/index 或 / 等。
  3. IP:111.119.206.2或127.0.0.1等
  4. REQUEST_FORMAT:JS or JSON or HTML or null/blank等(注意:null/blank请求格式应视为HTML。)
  5. RESPONSE_CODE:“200 OK”或“401 Unauthorized”或“422 Unprocessable Entity”等

过滤器示例如下请求。如果请求中存在这些过滤器,我必须解析请求并检查这些过滤器和输出。每个过滤器的输出应包含 5 行,每行表示每个请求中每个过滤器的出现次数。

请建议我在收到输入时如何接受输入和处理,以便在最短的时间内完成此活动。

请求格式:

    Started <REQUEST_TYPE> <RELATIVE_URL> for <IP> at <REQUEST_TIMESTAMP>
          Processing by <CONTROLLER>#<ACTION> as <REQUEST_FORMAT>
          Parameters: <Key Value pair for each parameters>
        <LOG_LINE_1>
        <LOG_LINE_2>
        ...
        ...
        <LOG_LINE_N>
        Rendered <SOME_TEMPLATE_0> (<TIMETAKEN_0>)
        Rendered <SOME_TEMPLATE_1> (<TIMETAKEN_1>)
        ...
        ...
        Rendered <SOME_TEMPLATE_N> (<TIMETAKEN_N>)
        Completed <RESPONSE_CODE> in <OVERALL_TIME_TAKEN> (Views: <TIME_VIEWS> | ActiveRecord: <TIME_ACTIVE_RECORD> | Sphinx: <TIME_SPHINX>)

请求 1:

    Started GET "/terminal/is_on?ts=1448979876581&b=Chrome&v=46.0&timestamp=1448979524369&sl=1421&tabOpened=1448979396.012" for 127.0.0.1 at Tue Dec 01 19:54:36 +0530 2015
          Processing by TerminalController#is_on as JSON
          Parameters: {"tabOpened"=>"1448979396.012", "v"=>"46.0", "b"=>"Chrome", "ts"=>"1448979876581", "sl"=>"1421", "timestamp"=>"1448979524369"}
        [BS_SESSION_LOG 218] 3 : Tue Dec 01 19:54:37 +0530 2015 : /terminal/is_on : before request
        LIVE SESSION LOGS [Tue Dec 01 14:24:37 UTC 2015] [SummaryLog Transition] - User: 3 - Inside terminal#is_on - sl - 1421 - Session: 627632189903c04da7801aafbac4d992 - bs_session_id: 218
        UnLocking session id 627632189903c04da7801aafbac4d992, bs_session id: 627632189903c04da7801aafbac4d992
        [BS_SESSION_LOG 218] 3 : Tue Dec 01 19:54:37 +0530 2015 : /terminal/is_on : after request : true
        Completed 200 OK in 446ms (Views: 11.1ms | ActiveRecord: 14.0ms | Sphinx: 0.0ms)

请求 2:

    Started GET "/status/is_new?ts=1448979876581" for 127.0.0.1 at Tue Dec 01 20:01:18 +0530 2015
          Processing by TerminalController#is_on as JSON
          Parameters: {"tabOpened"=>"1448979396.012", "v"=>"46.0", "b"=>"Chrome", "ts"=>"1448980278551", "sl"=>"1421", "timestamp"=>"1448979524369"}
        [BS_SESSION_LOG 218] 3 : Tue Dec 01 20:01:19 +0530 2015 : /terminal/is_on : before request
        LIVE SESSION LOGS [Tue Dec 01 14:31:19 UTC 2015] [SummaryLog Transition] - User: 3 - Inside terminal#is_on - sl - 1421 - Session: 627632189903c04da7801aafbac4d992 - bs_session_id: 218
        UnLocking session id 627632189903c04da7801aafbac4d992, bs_session id: 627632189903c04da7801aafbac4d992
        [BS_SESSION_LOG 218] 3 : Tue Dec 01 20:01:19 +0530 2015 : /terminal/is_on : after request : true
        Completed 200 OK in 539ms (Views: 9.0ms | ActiveRecord: 22.4ms | Sphinx: 0.0ms)

过滤器是:

  1. 获取
  2. /terminal/is_on?ts=1448979663546&b=Chrome&v=46.0&timestamp=1448979524369&sl=1421&tabOpened=1448979396.012
  3. 127.0.0.1
  4. JSON
  5. 200 正常

输出:

2
1
2
2
2

【问题讨论】:

    标签: c++ http parsing logging


    【解决方案1】:

    您需要首先记录并完全指定日志文件格式。使用EBNF 表示法是记录这种格式的便捷方式。您不能仅通过举例来定义文件格式(或者甚至使用一些定义不明确的“模板”,例如您的 Request Format: 事物;您无法解释 &lt;REQUEST_FORMAT&gt;&lt;LOG_LINE&gt; 是什么确实如此;您应该更好地指定输入,并且应该在某处记录它;例如,&lt;REQUEST_FORMAT&gt; 到底是什么,它可以包含下划线、美元符号、数字吗?)。

    一旦你完全指定了格式(包括所有细节),你就可以使用标准的parsing技术(可能你首先需要一些lexer)。可能一些简单的recursive descent parser 就足够了(一旦你指定了输入syntax,编码就很简单了)。否则,请阅读Dragon Book 的前半部分以了解有关解析的更多信息。或者考虑使用一些parser generator,例如ANTLRbison + flex

    您可能会查看现有的 Web 服务器日志文件格式,例如here.

    您可以使用regular expressions。也许写一些GNU awk 脚本可能足以满足您的解析需求。

    【讨论】:

    • 然后使用标准解析技术。但我不觉得你的解释真的是指定请求格式。你应该(至少在纸上)写一些 EBNF。完成格式规范后,编写解析器是标准做法。
    • 我只需要用c++写一个简单的实现。你告诉的事情可能需要一些时间。
    • 但它们是任务所必需的。一旦你理解了基本概念并完全指定了语法,编写解析器就很简单了。
    猜你喜欢
    • 2023-04-01
    • 2021-04-09
    • 2022-12-28
    • 2012-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多