PERL / PHP 解析 APACHE 访问日志



嗨,我已经有一个WordPress插件了
[https://wordpress.org/plugins/strictly-system-check/]Srictly 系统检查[1],让我知道我的服务器/站点何时出现故障。服务器负载为 2.50,交换为 X,RAM 使用率为 X,页面加载时间过长,爬网所需页面进行测试时状态代码不是 200,页面上找不到文本,数据库连接过多,慢查询太多,查询运行,打开连接,没有索引的查询内存使用情况,PHP 内存使用情况等。

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

所以我有这些问题(我是一个 PERL 菜鸟 - 虽然可以做 PHP)]]

-以这篇关于解析 apache 日志文件的文章为例 [http://www.leancrew.com/all-this/2013/07/parse-my-apache-logs/][1]

  1. 我可以直接在 BASH 中运行 PERL 脚本以获得结果吗?
  2. 我可以将其另存为文件,然后构建到插件中以按需作为调用 usage.pl 运行吗?

混淆的原因是,在顶部,他说他通过传递天数来调用它,例如top5log 25

但是脚本的示例只是粘贴到 BASH 中

#!/usr/bin/python 阿拉伯数字
3 导入再 4 导入系统

所以一个新手我如何获取我的新.pl PERL 脚本并将其保存在某个地方,然后再运行它,以及如何按需运行它?

  1. 如何找出我自己的日志文件格式,因为我看不到的格式都与我拥有的格式不匹配,例如通用日志格式。

我的日志文件中的示例行是

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 - - [请求日期] [动词请求的页面/文件] [状态] ?[?][用户代理] 秒/毫秒(猜测)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 (兼容;冰机器人/2.0;+http://www.bing.com/bingbot.htm)" 1/14572645.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) 壁虎/20100101火狐/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 == 名称到引用组,或者你可以按索引来做,例如 [0] 或 [2]?(?P.) == 组的内容,所以真的是"(.)"'"和"之间的所有内容

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

另外,如果我可以从我的网络服务器运行SHELL_EXEC,那么运行perl脚本的最佳方法是通过文件名还是像示例中那样逐行分隔的文件?

这看起来是一个很好的脚本,如果我能让它工作,因为我没有 CGI 安全泄漏的 AWE 统计数据。

任何帮助将不胜感激。

谢谢

首先,本文中的脚本是 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作为脚本的 STDIN

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

祝你好运!

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;

最新更新