这是《Apache日志》系列文章的最后一篇,除了补充说明前面几篇文章之外,另外讨论了三个问题:如何将日志记录写入指定的程序而不是日志文件,如何轮换日志防止磁盘空间不足,多虚拟主机环境下的日志文件管理。
一、把日志记录写入到指定程序
在这个《Apache日志》系列文章的前一篇中,我们讨论了几种日志文件分析工具。应当补充说明的是,它并没有列出全部的分析工具。在 Google上简单地搜索一下“apache log reporting”或类似的关键词,返回有关该主题的页面多达数百个,有许多供应商在为这个相对简单的问题推销自己特有的方案。
日志记录并非只能写入到文件,它还可以写入到指定的进程。当我们想要把日志信息写入数据库、或者是某些能够实时显示网站流量统计信息的程序时,这一点是非常有用的。
那么,如何实现这一点呢?使用TransferLog或者CustomLog指令,我们能够指定“|”,后面再加上接收日志信息的程序名字。例如:
CustomLog |/usr/bin/apachelog.pl common
其中/usr/bin/apachelog.pl是一个程序,这个程序知道如何处理Apache日志文件的记录。事实上,这个程序非常简单,比如它可以是一个按照某种方式处理日志记录的Perl程序,或者是一个将日志记录写入数据库的程序。
在采用这种记录日志数据的方法时,安全问题是最必须关注的问题。日志文件是以启动服务器的用户所具有的权限打开的,通常是root。对于将日志记录写入数据库的程序,这一点也同样有效,所以应当确保用于记录日志数据的程序具有充分的安全保证。
如果日志数据通过一个不安全的程序记录(这个程序可能被非root用户侵入和修改),那么系统就面临着日志记录程序被其他怀有恶意的程序替换的危险。例如,如果/usr/bin/apachelog.pl可被全世界的用户修改,那么任何用户都将能够编辑这个文件关闭Web服务器,把密码文件发送到某个信箱,或者删除某些重要的文件,因为root用户具有进行所有这些操作的权限。
如果你要把日志记录写入到某个程序,建议先找找是否有现成的具备自己想要功能的模块。请访问http://modules.apache.org/,该网站收集了许多面向Apache完成各类实际任务的模块。
二、轮换日志
日志文件会越来越大,如果不小心把日志文件放到了/var之类位置,日志文件可能写满分区,从而导致服务器被迫停止运行。这种事情确实曾经发生过。
防止出现这种问题的办法是,在日志文件变得太大之前把它们移到其他具有足够空间的位置。这可以通过几种方法实现。某些Unix变种提供一个 logrotate脚本,它能够帮助我们完成这个任务。例如RedHat就已经预先配置,它会根据日志文件的大小或者日志文件的使用时间,每隔几日轮换日志文件。
如果要自己实现这方面的功能,我们可以使用称为Logfile::Rotate的Perl模块(可从CPAN下载)。下面的代码就具有这种功能,它由cron按照一定的间隔周期(比如一星期)运行,为了节省空间。每一个备份的日志文件都经过压缩。
use Logfile::Rotate;
$logfile = new Logfile::Rotate(
File => &single;/usr/local/apache/logs/access_log&single;,
Count => 5,
Gzip => &single;/bin/gzip&single;,
Signal => sub {
`/usr/local/apache/bin/apachectl restart`;
}
);
代码不多,Perl模块Logfile::Rotate负责了所有具体操作任务。运行这个程序,我们将得到名为access_log.1.gz、 access_log.2.gz等的文件。它可以帮助我们避免磁盘空间的不足,使得我们能够保存任意多的档案文件。
三、多个虚拟主机的日志
曾经有好几个人问起,当同一台机器上运行着多个虚拟主机时应该如何分析日志?我想,他们是先把所有虚拟主机的日志记录都保存到了同一台机器,然后又企图把这个日志文件按照虚拟主机的不同分割成多个部分。
彻底解决这个问题的方法是一开始就不要把所有虚拟主机的日志记录都写入到同一个文件。虽然我知道确实存在这样的工具,它们能够把多个虚拟主机混合的日志记录根据虚拟主机配置分开,指出哪些请求针对哪个虚拟主机发出,然后分别生成报表。然而,这种方法看起来实在是太麻烦了。
为每一个虚拟主机分别指定日志文件时,我们只需在每个VirtualHost区域指定该主机的日志文件。此后,当需要制作报表时,我们就可以分别地处理各个日志文件。
但这里必须注意一下可用文件句柄的问题。也就是说,如果某台服务器上运行的虚拟主机多达数百个,每个虚拟主机都有单独的日志文件,系统可能会出现可用文件句柄不足的问题,它可能导致系统不稳定甚至导致系统崩溃。然而,只有当服务器上运行的虚拟主机数量非常庞大时,我们才有关注这个问题的必要。
《Apache日志》系列文章到此已经全部结束。在这五篇文章中,我们讨论了Apache日志功能的方方面面,从标准日志(访问日志,错误日志)到定制日志、日志分析等等,希望这些内容能够对你有所帮助。