2014-11-25 198 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