辉克's Blog

创造机会的人是勇者;等待机会的人是愚者

解决Apache日志文件ACCESS.LOG膨胀

apache服务器使用单个文件来记录这些访问信息,所以当服务运行几天后该文件可能几十兆、几百兆,要删除该文件又必须停止apache服务才允许删除。
httpd.conf中CustomLog logs/access.log common 改成
CustomLog "|/usr/local/apache/bin/rotatelogs /usr/local/apache/logs/%Y_%m_%d.access.log 86400 480" common
WINDOWS:
CustomLog "|D:/Apache2.2/bin/rotatelogs.exe d:/Apache2.2/logs/access_%Y_%m_%d.log 86400 480" common
rotatelogs.exe 就是apache提供用来做多日志文件的处理程序,从上面配置来看,apache实际上是通过“管道”(由命令前的竖线|判断)将要输出的日志信息传给rotatelogs.exe程序,由该程序负责日志的分割。

重启Apache

采取第三方软件进行日志分割和轮循
apache的默认方式的日志随着时间的增长,也越来越大,到了单个文件2G的时候(Linux文件系统的限制)开始影响到apache的运行速度。
采用轮循的方式可以避免这个现象的出现。
我使用的是第三方的日志轮循工具 cronolog
http://httpd.apache.org/docs/2.2/logs.html#piped
http://www.cronolog.org/
使用方式只要 configure -> make -> make install

访问日志文件的位置实际上是一个配置选项。如果我们检查httpd.conf配置文件,可以看到
该文件中有如下这两行内容:
说明一下:/home1/opt/apache2/是我的apache安装的位置

# vi /home1/opt/apache2/conf/httpd.conf
ErrorLog logs/error_log
CustomLog logs/access_log common

注意,对于版本较早的Apache服务器,这行内容可能略有不同。它使用的可能不是
CustomLog指令,而是TransferLog指令。
将其修改为:
ErrorLog “|/usr/local/sbin/cronolog /home1/opt/apache2/logs/%w/error_log”
CustomLog “|/usr/local/sbin/cronolog /home1/opt/apache2/logs/%w/access_log” common

如果有配置了虚拟主机,须:
在apache中修改每个虚拟主机中的配置,增加日志配置形式如下:
ErrorLog “|/usr/local/sbin/cronolog /home1/opt/apache2/logs/网址/%w/error_log”
CustomLog “|/usr/local/sbin/cronolog /home1/opt/apache2/logs/网址/%w/access_log” common
这里的/usr/local/sbin/cronolog是cronolog安装的主程序目录,/home1/opt/apache2/是我的
apache安装的位置
# /home1/opt/apache2/bin/apachectl restart //重启apache服务器
这里我是按照一个星期7天轮循的方式构建的,那个%w就是周几,例如目录logs/1是周一,
logs/2是周二,logs/0是周日……我试了一下,如果到下一个周二,该天的日志会自动覆盖上一个周二的,从而实现轮循……还可以有多种方式。看日志增长情况了。。

本想定时自动删除前xx天的日志,但是用cron添加计划任务不成功……我想轮循也能实现
这个要求吧……
以下步骤未成功,省略:
保存7天的日志,用root用户添加cron为
/usr/bin/find /opt/apache2/logs -name \*access_log -mtime +6 | xargs rm -rf
/usr/bin/find /opt/apache2/logs -name \*error_log -mtime +6 | xargs rm -rf
其中 -mtime +6 表示 6×24小时前修改的文件找出来,然后删除掉。。
如果需要对日志用诸如webalizer这样的日志分析软件,可以在0点的时候把昨天的日志文件拷贝磁盘中的另外一个目录中,然后在负载较轻的时候分析即可。

发表回复