我可以使用日志分析器,但通常我需要解析最近的网络日志以查看当前发生的情况。
我有时会做一些事情,比如找出请求某个文件的前 10 个 ip
cat foo.log | grep request_to_file_foo | awk '{print $1}' | sort -n | uniq -c | sort -rn | head
你的工具箱里有什么?
我可以使用日志分析器,但通常我需要解析最近的网络日志以查看当前发生的情况。
我有时会做一些事情,比如找出请求某个文件的前 10 个 ip
cat foo.log | grep request_to_file_foo | awk '{print $1}' | sort -n | uniq -c | sort -rn | head
你的工具箱里有什么?
您可以仅使用 awk 对 apache 日志文件执行任何操作。Apache 日志文件基本上是用空格分隔的,您可以假装引号不存在,并通过列号访问您感兴趣的任何信息。唯一出现这种情况的情况是,如果您具有组合日志格式并且对用户代理感兴趣,此时您必须使用引号 (") 作为分隔符并运行单独的 awk 命令。下面将向您显示每个请求索引页面的用户按点击次数排序:
$7 是请求的网址。您可以在开头添加任何您想要的条件。将 '$7 == "/" 替换为您想要的任何信息。
如果替换 (ipcount[$1]++) 中的 $1,则可以按其他条件对结果进行分组。使用 $7 将显示访问了哪些页面以及访问频率。当然,你会想在一开始就改变条件。以下将显示用户从特定 IP 访问了哪些页面:
您还可以通过 sort 管道输出以按顺序获取结果,可以作为 shell 命令的一部分,也可以在 awk 脚本本身中:
如果您决定扩展 awk 脚本以打印出其他信息,后者会很有用。这完全取决于你想知道什么。这些应该作为您感兴趣的任何内容的起点。
由于我无法想象的原因,我从未见过其他人做的一件事是将 Apache 日志文件格式更改为更易于解析的版本,其中包含对您而言真正重要的信息。
例如,我们从不使用 HTTP 基本身份验证,因此我们不需要记录这些字段。我对每个请求的服务时间很感兴趣,因此我们将其添加进去。对于一个项目,我们还想知道(在我们的负载均衡器上)是否有任何服务器服务请求的速度比其他服务器慢,所以我们记录名称我们代理回的服务器。
这是一个服务器的 apache 配置的摘录:
您无法从中真正看出的是,每个字段之间是一个文字制表符 (\t)。这意味着如果我想在 Python 中进行一些分析,例如可能显示非 200 状态,我可以这样做:
或者如果我想做“谁在盗链图像?” 这将是
对于访问日志中的 IP 计数,前面的示例:
变成这样:
更容易阅读和理解,而且计算成本要低得多(没有正则表达式),在 9 GB 的日志上,它需要多长时间有很大的不同。如果你想为用户代理做同样的事情,这真的很整洁。如果您的日志是用空格分隔的,则必须手动进行一些正则表达式匹配或字符串搜索。使用这种格式,很简单:
和上面的完全一样。其实,任何你想做的总结,本质上都是一模一样的。
为什么我要把系统的 CPU 用在 awk 和 grep 上,而 cut 将完全按照我想要的速度快几个数量级?
忘记 awk 和 grep。查看asql。当您可以使用类似 sql 的语法来查询日志文件时,为什么还要编写不可读的脚本。例如。
这是一个从最近的 N 个日志条目中查找顶级 url、顶级引用和顶级用户代理的脚本
资源
对于访问日志中的 IP 计数:
这有点难看,但它有效。我还将以下内容与 netstat 一起使用(查看活动连接):
它们是我最喜欢的“单衬里” :)
这是我的“sed”示例,它读取 apache 日志的默认格式并将其转换为更方便自动处理的格式。整行定义为正则表达式,变量被保存并以“#”作为分隔符写入输出。
输入的简化表示法是: %s %s %s [%s] "%s" %s %s "%s" "%s"
示例输入行:xx.xx.xx.xx - - [29/Mar/2011:12:33:02 +0200] "GET /index.html HTTP/1.0" 200 9443 "-" "Mozilla/4.0"
示例输出行:xx.xx.xx.xx#-#-#29/Mar/2011:12:33:02 +0200#GET /index.html HTTP/1.0#200#9443#-#Mozilla/4.0
感受正则表达式的力量:-)
建立一个常见问题列表将是这个问题的答案的一个很好的索引。我的常见问题是:
我通过监视服务器状态页面(通过 mod_status)的命中率以及活动和最近完成的请求的大致响应时间来注意到这些变化(我完全清楚我错过了一大堆数据,但样本已经足够好了)。
我使用以下 LogFormat 指令(%T 非常有用)
我正在寻找因果关系以及首先发生的事情......通常是关于我的日志中特定的模式子集,因此对于任何给定的模式/正则表达式,我需要了解以下内容:
我通常使用 perl,因为最终它变得足够复杂以至于值得。
一个非 perl 示例将是非 200 状态代码的每分钟快速命中率:
是的,我在用那个 grep 作弊,假设 quote-space-200-space 只匹配 http 状态代码......可以使用 awk 或 perl 来隔离该字段,但请记住它可能不准确。
perl 中更复杂的示例可能是可视化模式的命中率变化。
下面的脚本有很多内容需要细细琢磨,尤其是如果您不熟悉 perl。
代码如下:
如果您只想处理标准指标,请查看
谁在热链接您的图像:
我通过拖尾或 cat'ing 文件来大量使用 awk。每天晚上,我都会为每台服务器提供一份网络报告。根据您的日志文件和您的 LogFormat,您需要编辑其中一些为您工作的衬垫......
这是一个简单的例子:
如果我只想在我的服务器上跟踪日志以获取 404/500 状态代码,我会这样做:
<剪辑>
</snip>
我大部分时间都在做的事情是根据时间读取日志的各个部分,所以我使用 sed 编写了以下脚本来提取我感兴趣的时间段,它适用于我来到的每个日志文件并且还可以处理归档日志。