apache 日志:customlog配置的piped log program \'/log.sh\' failed unexpectedly错误->解决

来源:互联网 发布:php 反射机制 编辑:程序博客网 时间:2024/06/08 03:00

如果想自己处理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会再次调用的.

原创粉丝点击