Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-cloud-platform/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Shell 通过脚本传输Apache日志-不适用于错误日志_Shell_Logging_Apache2_Lamp - Fatal编程技术网

Shell 通过脚本传输Apache日志-不适用于错误日志

Shell 通过脚本传输Apache日志-不适用于错误日志,shell,logging,apache2,lamp,Shell,Logging,Apache2,Lamp,我正在构建一个LAMP服务器,供多个用户使用mod_userdir进行web开发,并编写了脚本,将访问和错误日志分解为用户主目录中的日志目录 access_log.sh脚本工作正常(日志行同时写入主服务器日志文件和用户的日志文件),但error_log.sh仅更新主日志文件。这是错误_log.sh: #!/bin/bash IFS=' ' userlogfile=error.log syslogfile=/var/log/apache2/cs-web_error.log homedirs=

我正在构建一个LAMP服务器,供多个用户使用mod_userdir进行web开发,并编写了脚本,将访问和错误日志分解为用户主目录中的日志目录

access_log.sh脚本工作正常(日志行同时写入主服务器日志文件和用户的日志文件),但error_log.sh仅更新主日志文件。这是错误_log.sh:

#!/bin/bash

IFS='
'

userlogfile=error.log
syslogfile=/var/log/apache2/cs-web_error.log

homedirs=`ls -d /home/*`

while read logline; do
    echo -e ${logline} >> ${syslogfile}
    #echo -e "writing ${logline} to ${syslogfile}" #TESTING

    for homedir in $homedirs; do
        userlogpath="${homedir}/logs/${userlogfile}"
        if echo $logline | grep ${homedir} > /dev/null; then
            echo -e ${logline} >> ${userlogpath}
            #echo -e "writing ${logline} to ${userlogpath}" #TESTING
        fi
    done
done
Apache的日志记录配置为:

CustomLog "| ${APACHE_LOG_DIR}/access_log.sh" common
ErrorLog "| ${APACHE_LOG_DIR}/error_log.sh"
如果我取消对#TESTING语句的注释,则在通过脚本传递错误日志时会得到如下输出:

writing [Fri Sep 06 12:15:11 2013] [error] [client 193.61.230.178] PHP Parse error:
syntax error, unexpected 'select' (T_STRING) in /home/ginny/htdocs/test.php on line 12 
to /var/log/apache2/cs-web_error.log
writing [Fri Sep 06 12:15:11 2013] [error] [client 193.61.230.178] PHP Parse error:  
syntax error, unexpected 'select' (T_STRING) in /home/ginny/htdocs/test.php on line 12 
to /home/ginny/logs/error.log
。。。这表明grep语句正在工作。此外,通过这样手动运行,将创建文件并将其写入:

root@cs-web:~# ls -l /home/ginny/logs/
total 16
-rw-r--r-- 1 root root 2213 Sep  6 12:53 access.log
-rw-r--r-- 1 root root 9984 Sep  6 12:49 error.log
我很难理解的是,为什么这适用于访问日志,而不适用于错误日志-唯一的区别是:

root@cs-web:/var/log/apache2# diff access_log.sh error_log.sh
6,7c6,7
< userlogfile=access.log
< syslogfile=/var/log/apache2/cs-web_access.log
---
> userlogfile=error.log
> syslogfile=/var/log/apache2/cs-web_error.log
12a13
>     #echo -e "writing ${logline} to ${syslogfile}"
15,17c16,17
<         homedir=${homedir#/home/}
<         userlogpath="/home/${homedir}/logs/${userlogfile}"
<         if echo $logline | egrep "/(~|users/)${homedir}/" > /dev/null; then
---
>         userlogpath="${homedir}/logs/${userlogfile}"
>         if echo $logline | grep ${homedir} > /dev/null; then
18a19
>             #echo -e "writing ${logline} to ${userlogpath}"
root@cs-web:/var/log/apache2#diff access_log.sh error_log.sh
6,7c6,7
userlogfile=error.log
>syslogfile=/var/log/apache2/cs-web_error.log
12a13
>#echo-e“将${logline}写入${syslogfile}”
15,17c16,17
/dev/null;然后
---
>userlogpath=“${homedir}/logs/${userlogfile}”
>如果echo$logline | grep${homedir}>/dev/null;然后
18a19
>#echo-e“将${logline}写入${userlogpath}”

非常感谢您的建议。

请正确引用您的变量,并改用数组
readarray
也比依赖字拆分和可能通过路径名扩展生成更好

#!/bin/bash

#IFS=$'\n'  ## No longer needed.

userlogfile=error.log
syslogfile=/var/log/apache2/cs-web_error.log

readarray -t homedirs < <(ls -d /home/*)

while read logline; do
    echo -e "${logline}" >> "${syslogfile}"
    #echo -e "writing ${logline} to ${syslogfile}" #TESTING

    for homedir in "${homedirs[@]}"; do
        userlogpath="${homedir}/logs/${userlogfile}"
        if echo "$logline" | grep "${homedir}" > /dev/null; then
            echo -e "${logline}" >> "${userlogpath}"
            #echo -e "writing ${logline} to ${userlogpath}" #TESTING
        fi
    done
done
为了安全起见,我建议您在其他脚本中也使用相同的概念

更新

在第二个脚本中,您不再尝试使用
/home/
修剪
$homedir
,这意味着如果
“$homedir”
不是以
/home/
开头,
$userlogpath
将是
/logs/${userlogfile}
,而在第一个脚本中仍然是
/home//loglogs/${userfile}
。尝试在
错误日志.sh
中使用这些行

     homedir=${homedir#/home/}
     userlogpath="/home/${homedir}/logs/${userlogfile}"

正确引用变量并使用数组。
readarray
也比依赖单词拆分和可能通过路径名扩展生成更好

#!/bin/bash

#IFS=$'\n'  ## No longer needed.

userlogfile=error.log
syslogfile=/var/log/apache2/cs-web_error.log

readarray -t homedirs < <(ls -d /home/*)

while read logline; do
    echo -e "${logline}" >> "${syslogfile}"
    #echo -e "writing ${logline} to ${syslogfile}" #TESTING

    for homedir in "${homedirs[@]}"; do
        userlogpath="${homedir}/logs/${userlogfile}"
        if echo "$logline" | grep "${homedir}" > /dev/null; then
            echo -e "${logline}" >> "${userlogpath}"
            #echo -e "writing ${logline} to ${userlogpath}" #TESTING
        fi
    done
done
为了安全起见,我建议您在其他脚本中也使用相同的概念

更新

在第二个脚本中,您不再尝试使用
/home/
修剪
$homedir
,这意味着如果
“$homedir”
不是以
/home/
开头,
$userlogpath
将是
/logs/${userlogfile}
,而在第一个脚本中仍然是
/home//loglogs/${userfile}
。尝试在
错误日志.sh
中使用这些行

     homedir=${homedir#/home/}
     userlogpath="/home/${homedir}/logs/${userlogfile}"

哦,我的小信仰-抱歉之前的怀疑,konsolebox-我尝试了你的改变,它的工作。不得不说我真的不明白为什么这能解决问题,但它确实解决了。“比你强。”罗布霍格不用担心。欢迎:)哦,我的一点信心-很抱歉之前的疑问,konsolebox-我尝试了你的改变,它的工作。不得不说我真的不明白为什么这能解决问题,但它确实解决了。“比你强。”罗布霍格不用担心。欢迎:)