2014-11-25 125 views
0

嗨,我已經有一個WordPress插件
[https://wordpress.org/plugins/strictly-system-check/]Srictly系統檢查[1],讓我知道當我的服務器/網站出現故障時。服務器負載爲2.50,Swap爲X,內存使用量爲X,頁面加載時間過長,當檢索期望的頁面時檢測不到200狀態碼,頁面上沒有找到文本,數據庫連接過多,查詢速度過慢,打開連接,查詢沒有索引內存使用情況,PHP內存使用情況等等。PERL/PHP解析APACHE訪問日誌

但是我希望能夠解析我的Apache和錯誤日誌文件,並將它們連接在一起,以便更清楚地瞭解停機時正在發生的事情,例如此頁面被命中X次,此IP也觸發很多次等等,所以我可以在停機時間去 當服務器負載爲3.00並且正在交換到磁盤X RAM並且頁面花費了60秒加載,平均查詢等待時間爲20秒這也是 - IP地址前10位是IP地址(帶反向IP &地理位置) - 如果可能的話,前10位引用者是... - 頂級10位NON SERP IP(忽略已知安全BOT IO的列表) - 最後十位錯誤時間範圍內的錯誤,例如10分鐘+/-是

所以我有這些問題(和我是一個PERL小白 - 可以做PHP雖然)]]

-Taking上解析Apache日誌文件爲例[http://www.leancrew.com/all-this/2013/07/parsing-my-apache-logs/][1]

  1. 這篇文章能對我只需將PERL腳本直接運行到BASH即可獲得結果?
  2. 我可以將它保存爲一個文件,然後構建成按需運行的插件作爲調用usage.pl?

原因的困惑是,在頂部,他說,他通過在無天的傳遞給它如top5log 25 < apache.log

稱之爲但隨後的腳本的例子僅僅是一個糊到BASH

#!的/ usr/bin中/ Python的 3進口重新 4種進口SYS

所以AA新手我怎麼把我的新特等PERL腳本和T在什麼地方保存母雞運行它,如何按需運行?

  1. 如何找到我自己的日誌文件格式,因爲我沒有看到與我使用的通用日誌格式相匹配的日誌文件格式。

從我的日誌文件的一個例子是線

12.201.2.12 - - [25 /月/ 2014:03:20:01 0000]「GET /wp-cron.php?doing_wp_cron HTTP/1.1" 200 26‘ - ’‘StrictlyCron’2971379分之2

我如何找到 一)在我的格式定義(在Apache的配置檢查) b)和它涉及到如(Apache的2條線是什麼日誌文件)

遠程IP - [請求日期] [VERB請求的頁面/文件] [狀態]? [/]/GET/2014/08/somepage-of-mine/HTTP/1.1「200 18956」 - 「」Mozilla/5.0(compatible; bingbot/2。0; + http://www.bing.com/bingbot.htm)「1/1457264 5.9.40.98 - - [25/Nov/2014:03:23:44 +0000]」GET/2014/11/somepage/HTTP/1.1「200 16653」 - 「」Mozilla/5.0 (Windows NT 6.0; rv:13.0)Gecko/20100101 Firefox/13.0.1「0/901549

因此,一旦我知道我需要轉換的格式已經找到,我只需要修改他的腳本正則表達式,一旦我知道每一段的意思。

# Regex for the Apache common log format. 
parts = [ 
r'(?P<host>\S+)',     # host %h 
r'\S+',        # indent %l (unused) 
r'(?P<user>\S+)',     # user %u 
r'\[(?P<time>.+)\]',    # time %t 
r'"(?P<request>.*)"',    # request "%r" 
r'(?P<status>[0-9]+)',    # status %>s 
r'(?P<size>\S+)',     # size %b (careful, can be '-') 
r'"(?P<referrer>.*)"',    # referrer "%{Referer}i" 
r'"(?P<agent>.*)"',     # user agent "%{User-agent}i" 
] 

現在我已經習慣了在大多數語言,但從來沒有在PERL也是如此R '「(?P)\ S +)'」使用正則表達式,等同於 R' 「()」 ',==捕獲組OR或者隱藏在'「(和)」' (?P ==商店組? (?P ==通過OR引用組的名稱,例如[0]或[2]是否可以通過索引執行? (ΔP。)==組的內容,所以真的「‘()’」

之間「‘和’」一切有一次,我可以重新洗牌要我自己的格式他正則表達式模式,其是不常見的,那麼我認爲我可以處理其餘的代碼 - 只需要一些保存和運行.pl或PERL腳本的指針。

此外,如果我可以從我的網絡服務器運行SHELL_EXEC什麼是運行perl腳本的最佳方式是它的文件名或長行由行分隔的文件,如在示例中?

這看起來像一個很好的腳本,如果我能得到它的工作,看到我沒有CGI安全漏洞的AWE Stats。

任何幫助將不勝感激。

感謝

羅布

回答

0

首先,文章中的腳本的Python,Perl的不是。您可以通過頂部的#!/usr/bin/python行來判斷。其次,本文的建議是將腳本保存爲一個名爲「top5log」的文件,該文件位於$ PATH的某處,比如說/ usr/local/bin/top5log,然後標記爲可執行文件,您可以通過運行chmod +x /usr/local/bin/top5log。完成之後,您可以通過鍵入「top5log」從系統上的任何位置運行腳本。

接下來,筆者建議你運行該腳本是這樣的:

top5log 25 < apache.log 

這告訴殼給數字「25」的劇本作爲第一個參數,並將阿帕奇的內容。請以腳本STDIN的身份登錄到腳本。

這應該對保存和運行Python(和Per​​l)腳本有幫助。就理解正則表達式而言,這裏有一篇關於Python和命名捕獲組的文章:http://www.regular-expressions.info/named.html

祝你好運!

0

有Perl的大量的Perl模塊來解析的CPAN各種格式的日誌,例如Logfile::Access

use Logfile::Access; 

my $log = new Logfile::Access; 

open (IN, $filename); 
while (<IN>) 
{ 
    $log->parse($_); 
    warn $log->remote_host; 
} 
close IN; 
+0

好的,謝謝,我怎麼在我的控制檯運行此。我認爲我需要首先以某種方式打開perl,然後再複製它,而不像BASH腳本? – MonkeyMagix 2015-01-06 12:50:45