使用 Shell - 分析日志文件

作者:Dave Taylor

如果您正在运行 Apache(您很可能正在运行),您的服务器上会有一个名为 access_log 的文件,可能位于 /etc/httpd 或类似的目录中。找到它(您可以使用locatefind如果需要)。

首先,让我们看看您收到了多少次点击——也就是说,有多少个单独的文件被提供过。 使用 wc 程序来执行此操作

$ wc -l access_log
   83764 access_log

很有趣,但这是一个小时还是一个月的数据? 找出答案的方法是查看 access_log 本身的第一行和最后一行,这很容易通过 head 和 tail 命令完成

$ head -1 access_log
140.192.64.26 - - [11/Jul/2006:16:00:59 -0600]
 ↪"GET /favicon.ico HTTP/1.1" 404 36717 "-" "-"
$ tail -1 access_log
72.82.44.66 - - [11/Jul/2006:22:15:14 -0600]
 ↪"GET /individual-entry-javascript.js HTTP/1.1"
 ↪200 2374 "http://www.askdavetaylor.com/
↪sync_motorola_razr_v3c_with_windows_xp_via_bluetooth.html"
↪"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1;
↪.NET CLR 1.1.4322; .NET CLR 2.0.50727)"

这些日志文件行可能会令人困惑,所以如果您看到它们并完全困惑,请不要惊慌。 好消息是,没有必要了解每个字段的详细信息。 事实上,我们只关心方括号中的日期和时间,以及“GET”行之后请求的单个文件的名称。

在这里,您可以看到访问日志中的第一行来自 7 月 11 日 16:00:59,最后一行来自 7 月 11 日 22:15:14。 计算一下,我们讨论的是大约 6 小时 15 分钟或 375 分钟的窗口。 将总点击数除以这段时间,我们看到每分钟 223 次点击,或者每秒 3.7 次点击的相当可观的流量水平。

发送最多的文件

第二个常见的查询是确定哪些文件被请求的频率最高,我们可以通过快速调用 awk 从日志文件行中拆分该字段来确定,然后将 sort 和 uniq 及其非常有用的 -c 选项组合起来。

让我们一次完成一步。

如果您回到上面显示的日志文件行,您会发现包含该值的是第七个字段,这意味着我们可以像这样提取它

$ head access_log | awk '{print $7}'
/favicon.ico
/0-blog-pics/itunes-pc-advanced-importing-prefs.png
/0-blog-pics/itunes-pc-importing-song.png
/styles-site.css
/individual-entry-javascript.js
/motorola_razr_v3c_and_mac_os_x_transfer_pictures_and_wallpaper.html
/Graphics/header-paper2.jpg
/Graphics/pinstripebg.gif
/0-blog-pics/bluetooth-razr-configured.png
/0-blog-pics/itunes-pc-library-sting.png

当您有一个长长的数据列表时,您可以通过对所有内容进行排序,然后使用 uniq 命令来找出每一行发生的频率,从而找出最受欢迎的单个事件。 然后再次使用 sort,这次从该数据中排序数据,并以最大数值到最小数值为前缀。

这是一个中间结果,可以帮助您了解正在发生的事情

$ awk '{print $7}' access_log | sort | uniq -c | head
 535 /
26 //favicon.ico
   6 //signup.cgi
   1 /0-blog-pics/MVP-Combo_picture.jpg
   2 /0-blog-pics/address-book-import.jpg
   4 /0-blog-pics/adwords-psp-bids.png
  28 /0-blog-pics/aim-congrats-account.png
  28 /0-blog-pics/aim-create-screen-name.png
  38 /0-blog-pics/aim-delete-screenname-mac.png
  29 /0-blog-pics/aim-forget-password.png

剩下的就是按最受欢迎程度排序,然后删除除最匹配的几个之外的所有匹配项

$ awk '{print $7}' access_log | sort | uniq -c | sort -rn | head
6176 /favicon.ico
5807 /styles-site.css
5733 /Graphics/header-paper2.jpg
5655 /Graphics/pinstripebg.gif
5512 /individual-entry-javascript.js
5458 /Graphics/marker-tray.gif
5366 /Graphics/help-button.jpg
5363 /Graphics/digman.gif
5359 /Graphics/delicious.gif
5323 /0-blog-pics/starbucks-hot-coffee.jpg

您首先会注意到这与页面无关,而是与图形有关。 这并不奇怪,因为就像大多数网站一样,我自己的 AskDaveTaylor.com 的图形在所有页面上共享,这使得图形的请求频率高于任何给定的 HTML 页面。

幸运的是,我们可以通过简单地使用 grep 程序来过滤过滤器序列的最终结果来强制结果为 HTML 页面

$ awk '{print $7}' access_log | sort | uniq -c | sort -rn
 ↪| grep "\.html" | head
 446 /motorola_razr_v3c_and_mac_os_x_transfer_pictures_and_wallpaper.html
 355 /how_to_create_new_screen_names_on_aol_america_online.html
 346 /how_do_i_cancel_my_america_online_aol_account.html
 293 /pc_to_sony_psp_how_do_i_download_music.html
 206 /how_do_i_get_photos_and_music_onto_my_sony_psp.html
 198 /how_do_i_get_my_wireless_wep_password_for_my_sony_psp.html
 195 /cant_get_standalone_music_player_to_work_on_myspace.html
 172 /convert_wma_from_windows_media_player_into_mp3_files.html
 166 /sync_motorola_razr_v3c_with_windows_xp_via_bluetooth.html
 123 /how_do_i_create_a_new_screen_name_in_aol_america_online_90.html

(是的,是的,我知道这个网站上的 URL 非常长!)

现在,最后,我可以看到有关 Motorola RAR 手机、AOL 屏幕名称和 Sony PSP 的文章是该网站上最受欢迎的文章。 请记住,这只是大约六个小时的一小部分,因此 RAZR 文章实际上以令人印象深刻的每分钟一次左右的速度被请求。 确实受欢迎!

我现在要在这里停止,因为您已经了解了如何组合基本的 Linux 命令来从 Apache 日志文件中提取有用且有趣的数据。 下个月,我们将研究另一个统计数据:我们传输了多少聚合数据。 然后,我们将开始研究如何构建一个 shell 脚本,可以轻松地完成这些计算。

Dave Taylor 是一位拥有 26 年经验的 UNIX 老手,Elm 邮件系统的创建者,也是最近畅销的 Wicked Cool Shell ScriptsTeach Yourself Unix in 24 Hours 的作者,他著有 16 本技术书籍。 他的主要网站是 www.intuitive.com

加载 Disqus 评论