我想解析访问日志文件并返回过去 7 天的请求量。我有这个命令
cut -d'"' -f3 /var/log/apache/access.log | cut -d' ' -f2 | sort | uniq -c | sort -rg
不幸的是,此命令会返回自文件创建以来的请求数量,并将其按 HTTP 代码类别进行排序。我想要的只是一个数字,没有类别,并且只针对过去 7 天。
答案1
我会设置每日日志轮换(具体如何操作取决于您的操作系统),然后对最近的 7 个日志使用上述相同命令。对于您现有的日志,要么使用 grep 之类的工具来提取您想要的日期,要么将该日志拆分为每天的日志。
如果您想要比这更优雅的东西,我只需寻找现有的无数日志解析工具之一。
以下是拆分现有日志的示例: 使用命令行工具按日期拆分 access.log 文件
答案2
这是 Microsoft 的一个实用程序,所以可能不是你想要的,但有一个名为 LogParser 的实用程序(关联) 将分析 Apache 日志文件并让您使用 SQL 风格的语法进行过滤、聚合等。
您需要将输入格式参数指定为 NCSA。
答案3
这应该是可能的,但我陷入了不起作用的 Bash 命令嵌套,我不明白为什么。
从概念上来说,这样做:
- 按照 Apache 日志中的格式查找 7 天前的日期
date -d "-7 days" +%d\/%b\/%Y
-> 2013 年 10 月 10 日
- 从第一行删除,直到第一次提到该日期
sed '1,/~pattern~/d' access_log
- 将结果输入到 wc 中以获取计数。
| wc -l
因此应该有一种方法将上述内容合并为一个命令:
$ sed '1,/10\Oct\/2013/d' access_log | wc -l
29
$ sed '1,/$(date -d "-7 days" +%d\/%b\/%Y)/d' access_log | wc -l
$
在嵌套的某个地方,我的 date 命令和 sed 运行不顺畅。我尝试了各种引号和转义符组合,但都没有任何效果。
我错过了什么?
答案4
看看 Splunk 或 Loggly 之类的工具怎么样?Loggly 有免费试用版,Splunk Storm (http://splunkstorm.com) 可以免费注册,除非您的日志文件超出其限制,否则对您的日志进行索引并对过去 7 天(或其他各种时间段)内的请求运行各种统计应该是小事一桩。