Regex PERL/PHP解析APACHE访问日志

Regex PERL/PHP解析APACHE访问日志,regex,apache,perl,logfile,Regex,Apache,Perl,Logfile,嗨,我已经有一个WordPress插件了 [系统检查[1]这让我知道我的服务器/站点何时宕机。服务器负载为2.50,交换为X,RAM使用率为X,页面加载太长,在爬网所需页面进行测试时没有200状态代码,页面上找不到文本,太多的DB连接,太多的慢速查询,运行的查询,打开的连接,没有索引的查询内存使用率,PHP内存使用率等等 但是,我希望能够解析我的Apache和错误日志文件,并将它们链接在一起,以便更清楚地了解停机时发生的情况,例如,此页面被点击X次,此IP点击次数过多,等等,这样我就可以继续了

嗨,我已经有一个WordPress插件了 [系统检查[1]这让我知道我的服务器/站点何时宕机。服务器负载为2.50,交换为X,RAM使用率为X,页面加载太长,在爬网所需页面进行测试时没有200状态代码,页面上找不到文本,太多的DB连接,太多的慢速查询,运行的查询,打开的连接,没有索引的查询内存使用率,PHP内存使用率等等

但是,我希望能够解析我的Apache和错误日志文件,并将它们链接在一起,以便更清楚地了解停机时发生的情况,例如,此页面被点击X次,此IP点击次数过多,等等,这样我就可以继续了 停机时,服务器负载为3.00,正在切换到disk X RAM,页面加载时间为60秒,平均查询等待时间为20秒 -前十名IP地址命中率为反向IP和geo -如有可能,前十名推荐人是。。。。 -前十名非SERP IP忽略了已知安全机器人操作系统的列表 -错误时间范围内的最后十个错误(例如10分钟+/-)为

所以我有这些问题,我是一个PERL noob,但我可以做PHP]]

-以这篇关于解析apache日志文件的文章为例[

我可以直接在BASH中运行PERL脚本以获得结果吗? 我可以将其保存为一个文件,然后构建到插件中,作为call usage.pl按需运行吗? 造成混淆的原因是,在顶部,他说他通过传递天数来调用它,例如top5log25 但是脚本的示例只是粘贴到BASH中

!/usr/bin/python 2. 3进口稀土 4进口系统

那么,一个新手,在运行新的.pl PERL脚本之前,如何将其保存在某个地方,以及如何按需运行它

我如何找到我自己的日志文件格式,因为我看不到与我现有的日志文件格式(例如通用日志格式)不匹配的日志文件格式。 我的日志文件中的一行示例是

12.201.2.12---[25/Nov/2014:03:20:01+0000]GET/wp cron.php?doing_wp_cron HTTP/1.1200 26-StrictlyCron 2/2971379

我怎么找到你呢 在Apache配置中,我的格式是在其中定义的 b以及它与apache日志文件中的2行相关的内容

远程IP---[请求日期][动词请求的页面/文件][状态]?[?][用户代理]秒/秒 207.46.13.19---[25/Nov/2014:03:20:36+0000]GET/2014/08/somepage of mine/HTTP/1.1200 18956-Mozilla/5.0兼容;bingbot/2.0;+1/1457264 5.9.40.98---[25/Nov/2014:03:23:44+0000]GET/2014/11/somepage/HTTP/1.120016653-Mozilla/5.0WindowsNT6.0;rv:13.0Gecko/20100101 Firefox/13.0.10/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“”,==捕获组或“和”之间的内部 ?P==门店群? ?P==引用组的名称,或者您可以通过索引(例如[0]或[2])来完成吗? ?P.==组中的内容非常真实。'

一旦我可以将他的正则表达式模式重新调整为我自己的格式(这不是常见的格式),那么我想我可以完成其余的代码——只需要一些关于保存和运行.pl或PERL脚本的指针

另外,如果我可以从我的Web服务器上运行SHELL_EXEC,那么运行perl脚本的最佳方式是使用文件名还是像示例中那样的以行分隔的长文件

这看起来像是一个很好的脚本,如果我能让它工作,看到我没有对CGI安全漏洞的敬畏统计

任何帮助都将不胜感激

谢谢


Rob

首先,本文中的脚本是Python,而不是Perl。您可以从顶部的!/usr/bin/Python行看出

其次,本文建议将脚本保存为$PATH中某个名为top5log的文件,比如/usr/local/bin/top5log,然后将其标记为可执行文件,这可以通过运行chmod+x/usr/local/bin/top5log来完成。完成后,可以通过键入top5log从系统的任何位置运行脚本

接下来,作者建议您按如下方式运行脚本:

top5log 25 < apache.log
这告诉shell将数字25作为第一个参数提供给脚本,并将apache.log的内容作为脚本的参数发送给脚本

这应该是关于保存和运行Python和Perl脚本的有用信息


祝你好运!

在CPAN上有很多Perl模块可以解析各种格式的日志,例如:


好的,谢谢,我该如何在我的控制台中运行它。我想我需要先打开perl,然后再将它复制到BASH脚本中?
use Logfile::Access;

my $log = new Logfile::Access;

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