您好我已经有一个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]
混淆的原因在于,他说自己称之为无关紧要的日子,例如top5log 25< apache.log
但是脚本的例子只是粘贴到BASH
中#!的/ usr / bin中/蟒蛇
2
3导入重新
4导入sys
这是一个新手如何使用我的新.pl PERL脚本并在运行之前将其保存到某个地方以及如何按需运行它?
我的日志文件中的示例行是
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统计数据,这看起来像一个好的脚本。
非常感谢任何帮助。
由于
罗布
答案 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(和Perl)脚本的有用信息。至于理解正则表达式,这里有一篇关于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;