PERL / PHP解析APACHE访问日志

时间:2014-11-25 04:09:46

标签: regex apache perl logfile

您好我已经有一个WordPress插件
[https://wordpress.org/plugins/strictly-system-check/]Srictly系统检查[1]让我知道我的服务器/网站何时停机。服务器负载为2.50,Swap为X,RAM使用率为X,页面加载时间太长,爬网所需页面进行测试时没有200状态代码,页面上找不到文本,DB连接太多,查询速度太慢,查询运行,打开连接,没有索引内存使用的查询,PHP内存使用等等。

但是我希望能够解析我的Apache和错误日志文件并将它们链接在一起,以便更清楚地了解停机时发生的情况,例如此页面被点击X次,此IP命中太多时间等所以我可以去 在服务器负载为3.00并且正在交换到磁盘X RAM并且页面花费60秒加载时的停机时间,平均查询等待时间为20秒 - 排名前10位的IP收视率(反向IP& geo) - 如果可能的话,十个引用者是...... -Top十个非SERP IP(忽略已知的安全BOT IO列表) - 在错误的时间跨度内的最后十个错误,例如10分钟+/-

所以我有这些问题(我是PERL noob - 虽然可以做PHP)]]

- 本文以解析apache日志文件为例[http://www.leancrew.com/all-this/2013/07/parsing-my-apache-logs/][1]

  1. 我可以直接将PERL脚本运行到BASH中以获得结果吗?
  2. 我可以将其保存为文件,然后构建到插件中,以便按需运行,作为call usage.pl?
  3. 混淆的原因在于,他说自己称之为无关紧要的日子,例如top5log 25< apache.log

    但是脚本的例子只是粘贴到BASH

    #!的/ usr / bin中/蟒蛇   2
      3导入重新   4导入sys

    这是一个新手如何使用我的新.pl PERL脚本并在运行之前将其保存到某个地方以及如何按需运行它?

    1. 如何查找我自己的日志文件格式,因为我看不到的任何一种格式与我拥有的E.G常用日志格式相匹配。
    2. 我的日志文件中的示例行是

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

      我怎么找到 a)我的格式定义(在Apache配置中检查) b)以及它与例如(来自apache日志文件的2行)的相关内容

      远程IP - - [请求日期] [VERB请求的页面/文件] [状态]? [?] [user-agent] secs / ms(guess) 207.46.13.19 - - [25 / Nov / 2014:03:20:36 +0000]“GET / 2014/08 / somepage-of-mine / HTTP / 1.1”200 18956“ - ”“Mozilla / 5.0(兼容; 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'“()”',==捕获组或''(和)''之间的内容 (?P ==商店组? (?P == OR的名称引用组可以通过索引例如[0]或[2]来实现吗? (?P。)==该组的内容真的'“(。)”''和“之间的所有内容”

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

      此外,如果我可以从我的网络服务器运行SHELL_EXEC,那么运行perl脚本的最佳方式是文件名还是逐行分隔文件,如示例所示?

      如果我能看到我没有针对CGI安全漏洞的AWE统计数据,这看起来像一个好的脚本。

      非常感谢任何帮助。

      由于

      罗布

2 个答案:

答案 0 :(得分:0)

首先,文章中的脚本是Python,而不是Perl。您可以通过顶部的#!/usr/bin/python行告诉。

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

接下来,作者建议你像这样运行脚本:

top5log 25 < apache.log

告诉shell给出数字&#34; 25&#34;将脚本作为第一个参数发送到脚本,并将脚本的STDIN作为脚本发送到脚本中。

这应该是有关保存和运行Python(和Per​​l)脚本的有用信息。至于理解正则表达式,这里有一篇关于Python和命名捕获组的文章:http://www.regular-expressions.info/named.html

祝你好运!

答案 1 :(得分:0)

有很多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;
相关问题