如果想自己处理apache日志,有一个方法就是把日志重定向到自己写的程序上,如php或是其它脚本类.
在conf配置文件中使用customlog命令即可;
使用|即可使用管道命令.
CustomLog "|/var/www/log.sh" common
但是我在定向到一个bash 脚本时,它的error.log日志总是提示标题上的错误.
经过测试发现它已经成功调用sh了,但是不明白什么原因,
发现它运行sh时是使用
/bin/sh -c /var/www/log.sh ddd形式运行的,且使用了root权限运行.所以不会是因为权限不足问题.
经过测试是必须消耗掉管道输入stdin的内容.
如sh可以这样用
while read line # 消耗stdin
do
echo "$line"
if [ "$loop" -gt 999999 ];then
exit 0;
fi
let "loop +=1"
`echo "line $line " >> /var/log/apache2/log.log`
done
就不会提示出错,但是还是没办法获取到日志内容.
有人说这个必须使用守护进程才行.
经过测试并非如此,只要消耗stdin即可(看一眼c实现代码没看完没搞明白它是怎么判断这个的)
整个简单的sh可以这样写
----------------sh 代码----------
#! /bin/sh
loop=0
while read line
do
if [ "$loop" -gt 999999 ];then # if deal loop exit
exit 0;
else
loop=$loop+1
fi
`echo $line >> /var/log/apache2/log.log`
done
echo "sh runing" #start apache will see this echo
exit 0
------------代码结束----------
另一个需要注意的地方是:如果测试无效可以暂时换回文件路径方式记录而非管道,看看 是不是普通方式也没日志输出,如果是就是说明暂时管道脚本并没有问题.然后发现这个命令放到virtualhost标签中才有输出,前面测试我一直放在全局apache,且发现切换到普通文件方式也没有任何东西时,再看一下access.log也是用到customlog命令,一般到管理方式时即可看到访问记录往这个sh中灌了.
#CustomLog /var/log/apache2/access.log combined
CustomLog "|/var/www/log.sh" combined
.........
</VirtualHost>
然后这个脚本会在结束后,apache会再次调用的.