解析 CMS 登录的 Apache 访问日志的有效方法

解析 CMS 登录的 Apache 访问日志的有效方法

我一直在研究一种解析大型多访问日志(有时大小达到两位数 GB)的方法,用于 CMS。目前我只需要 WordPress 和 Joomla,但我知道类型会随着时间的推移而增长。目前我有两个单行代码(它们最终将进入 BASH 脚本,因此只要 BASH 可以解释它,就可以使用任何脚本语言):

echo -e "\n=== WordPress ===\n"; grep --no-messages wp-login.php /usr/local/apache/domlogs/* | grep POST | grep "$(date +"%d/%b/%Y")" | cut --fields=1 --delimiter=: | sort | uniq --count | sort --reverse --numeric-sort | head | sed 's/^ *//g'

echo -e "\n=== Joomla ===\n"; grep --no-messages '/administrator/index.php' /usr/local/apache/domlogs/* | grep POST | grep "$(date +"%d/%b/%Y")" | cut --fields=1 --delimiter=: | sort | uniq --count | sort --reverse --numeric-sort | head | sed 's/^ *//g'

我正在尝试找到一种方法来加快速度并将它们合并起来,这样我只需要进行一次传递,然后将它们放入单独的列表中。因此,例如,输出将如下所示:

=== WordPress ===

896 /usr/local/apache/domlogs/blogp.com
52 /usr/local/apache/domlogs/blogt.com
9 /usr/local/apache/domlogs/blog.com

=== Joomla ===

65778 /usr/local/apache/domlogs/bloge.com
478 /usr/local/apache/domlogs/blogq.com
83 /usr/local/apache/domlogs/blogh.com

我知道有比 grep 更快的解析方法,但我的知识非常有限,因此非常感谢您的帮助。

答案1

这取决于你如何配置 Apache格式化您的access_log。如果您使用常见的“CLF”日志格式:

LogFormat "%h %l %u %t \"%r\" %>s %b" common
CustomLog logs/access_log common

然后第 7 个字段包含请求 URL。其中的一小部分awk始终存在,并且在解析文本时相当高效。(Linux 几乎总是有扩展的GNU awk作为默认值;在 Solaris 上你最好确保gawk)这允许你在一次传递中执行多项操作:

awk '
   $7 ~ /wp-login.php/ {print $0 }
   $7 ~ /\/administrator\/index.php/ {print $0}
' access_log

将使用正斜杠括起来的$7正则表达式搜索第 7 个字段。找到匹配项后,将执行括号括起来的操作。简单操作是包含匹配项的整行。~/{}$print$0

结合 END 块更新计数器的稍微复杂的操作:

awk '
   $7 ~ /wp-login.php/ {++wp }
   $7 ~ /\/administrator\/index.php/ {++jl}
   END   { print wp , " WordPress Logins found.\n" , jl , " Joomla logins found.\n" }
' access_log

笔记:学习一种合适的脚本语言。这对于专业的系统管理员来说几乎是必需的。实际的语言是没那么重要,通常商店已经建立了内部脚本标准,然后您可以让某人指导您。除了 grep 之外,对和各种命令行实用程序的基本了解只能让您走这么远。在 Windows 环境中,可以使用诸如、
、甚至 PowerShell 之类的东西来补充这一点。bash sedawkperlpythonrubyphp

相关内容