Apache日志轮询配置详解
1、apache日志轮询作用
随着服务器的不断运行,日志文件会越来越大,如果不小心把日志文件放到了/var之类位置,日志文件可能写满分区,从而导致服务器被迫停止运行。这种事情确实曾经发生过。为了防止出现这种问题,可以在日志文件变得太大之前把它们移到其他具有足够空间的位置。这可以通过几种方法实现。某些Unix变种提供一个logrotate脚本,它能够帮助我们完成这个任务。例如RedHat就已经预先配置,它会根据日志文件的大小或者日志文件的使用时间,每隔一段时间来轮换日志文件,从而让单个日志文件不会太大,从而方便保存、查看及分析。
2、把日志记录写入到指定程序
日志记录并非只能写入到文件,它还可以写入到指定的进程。当我们想要把日志信息写入数据库、或者是某些能够实时显示网站流量统计信息的程序时,这一点是非常有用的。 要实现这个功能可以使用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完成各类实际任务的模块。
3、多个虚拟主机的日志
当同一台机器上运行着多个虚拟主机时,先把所有虚拟主机的日志记录都保存到了同一台机器,然后又企图把这个日志文件按照虚拟主机的不同分割成多个部分。 彻底解决这个问题的方法是一开始就不要把所有虚拟主机的日志记录都写入到同一个文件。虽然我知道确实存在这样的工具,它们能够把多个虚拟主机混合的日志记录根据虚拟主机配置分开,指出哪些请求针对哪个虚拟主机发出,然后分别生成报表。然而,这种方法看起来实在是太麻烦了。
我们为每一个虚拟主机分别指定日志文件时,我们只需在每个VirtualHost区域指定该主机的日志文件。此后,当需要制作报表时,我们就可以分别地处理各个日志文件。
但这里必须注意一下可用文件句柄的问题。也就是说,如果某台服务器上运行的虚拟主机多达数百个,每个虚拟主机都有单独的日志文件,系统可能会出现可用文件句柄不足的问题,它可能导致系统不稳定甚至导致系统崩溃。然而,只有当服务器上运行的虚拟主机数量非常庞大时,我们才有关注这个问题的必要。
4、apache日志轮询技术实现
(1)首先先下载安装apache的日志轮询工具cronolog
[root@localhost ~]# yum -y install gcc gcc-c++
[root@localhost ~]# wget https://files.cnblogs.com/files/crazyzero/cronolog-1.6.2.tar.gz
[root@localhost ~]# tar zxvf cronolog-1.6.2.tar.gz
[root@localhost ~]# cd cronolog-1.6.2
[root@localhost ~]# mkdir -p /usr/local/cronolog
[root@localhost cronolog-1.6.2]# ./configure --prefix=/usr/local/cronolog
[root@localhost cronolog-1.6.2]# make && make install
(2)cronolog日志轮询配置说明
如果没有虚拟主机,配置日志轮询需要修改Apache的主配置文件httpd.conf
如果配置了虚拟主机,需要修改配置文件httpd-vhosts.conf
按天轮询(生产环境常见用法,推荐)
CustomLog "|/usr/local/cronolog/sbin/cronolog logs/access_www_%Y%m%d.log" combined
ErrorLog "|/usr/local/cronolog/sbin/cronolog logs/error_www_%Y%m%d.log"
(提示:cronolog轮询日志的正确写法,被轮询的日志路径要写全路径 (按天记录日志,日志不会自动覆盖))
按小时轮询(生产环境常见的用法)
CustomLog "|/usr/local/cronolog/sbin/cronolog logs/access_www_%Y%m%d%H.log" combined
ErrorLog "|/usr/local/cronolog/sbin/cronolog logs/error_www_%Y%m%d%H.log"
(提示:如果需要及时的详细分析apache的日志,此配置可能比较适用)
按分钟轮询
CustomLog "|/usr/local/cronolog/sbin/cronolog logs/access_www_%Y%m%d%H%M.log" combined
ErrorLog "|/usr/local/cronolog/sbin/cronolog logs/error_www_%Y%m%d%H%M.log"
按周轮询(生产环境比较常用的方法)
CustomLog "|/usr/local/cronolog/sbin/cronolog logs/access_www_%w.log" combined
ErrorLog "|/usr/local/cronolog/sbin/cronolog logs/error_www_%w.log"
虚拟主机配置轮询方式
ServerAdmin [email protected]
DocumentRoot "/var/html/blog"
ServerName www.blog.com
ErrorLog "|/usr/local/cronolog/sbin/cronolog logs/error_www_%Y%m%d.log"
CustomLog "|/usr/local/cronolog/sbin/cronolog logs/access_www_%Y%m%d.log" combined