2016-12-25 57 views
-1

我已經給各種請求。其中兩個請求是作爲例子給出的。的Http日誌分析在C++中

過濾器:

  1. REQUEST_TYPE:和過濾器在以下格式給出| POST | PUT | DELETE GET
  2. RELATIVE_URL:/主/指數或/等
  3. IP:111.119 .206.2或127.0.0.1等
  4. REQUEST_FORMAT:JS或JSON或HTML或null /空白等(注意:空/空白請求格式應視爲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. GET
  2. /終端/ is_on?TS = 1448979663546 & B =鉻& V = 46.0 &時間戳= 1448979524369 & SL = 1421 & tabOpened = 1448979396.012
  3. 127.0.0.1
  4. JSON
  5. 200 OK

輸出:

2 
1 
2 
2 
2 

回答

0

首先,您需要的文件,充分指定日誌文件格式。使用EBNF表示法是記錄這種格式的一種便捷方式。你不能僅僅通過提供示例(或即使有一些不明確的「模板」像你請求格式定義的文件格式:;你不解釋什麼是<REQUEST_FORMAT><LOG_LINE>真的;件事你應該指定好了很多輸入你應該記錄在某個地方;比如到底什麼是<REQUEST_FORMAT>,可以包含下劃線,美元符號,數字)。

一旦你有完全指定的格式(與所有的細節),你可以使用標準parsing技術(也許你可能需要一些lexer第一)。可能有些簡單的recursive descent parser就足夠了(編碼很簡單,只要你有指定輸入syntax)。否則,請閱讀Dragon Book的前半部分以瞭解關於解析的更多信息。或考慮使用一些parser generator,如ANTLRbison + flex

您可以查看現有的Web服務器日誌文件格式,例如here。您可以使用regular expressions。也許編寫一些GNU awk腳本可能足以滿足您的分析需求。

+0

更新了問題中的請求格式 – myst552

+0

然後使用標準解析技術。但我不認爲你的解釋是真正指定請求格式。你應該(至少在紙上)寫一些EBNF。一旦你完成了格式的規範,編寫解析器就是標準做法。 –

+0

我只需要在C++中編寫一個簡單的實現。你告訴的事情可能需要一些時間。 – myst552