每当我们在开发服务器上创build新的虚拟主机时,我们总是需要手动指定单独的访问和错误日志:
ErrorLog logs/mysite/dev1-error.log CustomLog logs/mysite/dev1-access.log "common"
有没有办法使Apache自动分裂日志,而不是每次都指定它们?
我觉得你的痛苦,作为一个Web开发人员,我可能有超过200个虚拟主机在我的本地开发 – 我个人不关心日志并将它们全部logging到主/ var / log / apache …
然而,我所做的是编写一个shell脚本来添加/pipe理我所有的虚拟主机 – 所有你需要做的就是调整它来写日志到任何你喜欢的地方…
#!/bin/bash ARGS=1 if [ "$1"X = "X" ]; then echo "Must enter domain name" exit 0 fi if [ "$2"X = "X" ]; then echo "Must enter domain suffix" exit 0 fi if [ "$3"X = "X" ]; then echo "you must type "restart" if you want apache restarted "no" if not!" exit 0 fi domain=$1.$2; #echo $domain; #exit 0 rm $domain.conf echo "<VirtualHost *:80>" >> $domain.conf; echo " ServerAdmin [email protected]" >> $domain.conf; echo " ServerName $1.network.local" >> $domain.conf; echo " DocumentRoot /Data/vhome/$1.$2/httpdocs" >> $domain.conf; echo " HostnameLookups Off" >> $domain.conf; echo " UseCanonicalName Off" >> $domain.conf; echo " ServerSignature On" >> $domain.conf; echo " ScriptAlias /cgi-bin/ "/Data/vhome/$1.$2/cgi-bin/"" >> $domain.conf; echo " ErrorLog /var/log/apache2/error_log" >> $domain.conf; echo " CustomLog /var/log/apache2/access_log combined" >> $domain.conf; echo " <Directory "/Data/vhome/$1.$2/cgi-bin">" >> $domain.conf; echo " AllowOverride All" >> $domain.conf; echo " Options +ExecCGI -Includes" >> $domain.conf; echo " Order allow,deny" >> $domain.conf; echo " Allow from all" >> $domain.conf; echo " </Directory>" >> $domain.conf; echo " <Directory "/Data/vhome/$1.$2/httpdocs">" >> $domain.conf; echo " Options Indexes FollowSymLinks" >> $domain.conf; echo " AllowOverride All" >> $domain.conf; echo " Order allow,deny" >> $domain.conf; echo " Allow from all" >> $domain.conf; echo " </Directory>" >> $domain.conf; echo " # #XSS prevention" >> $domain.conf; echo " # RewriteEngine On" >> $domain.conf; echo " # RewriteCond %(REQUEST_METHOD) ^TRACE" >> $domain.conf; echo " # RewriteRule .* -[F]" >> $domain.conf; echo "</VirtualHost>" >> $domain.conf; if [ "$3" = "restart" ]; then rcapache2 restart; fi chmod 666 $domain.conf cat $domain.conf echo "Created!"; exit 0
希望能帮助到你。
-Sean
当我还在使用apache的时候,我从同事那里学到了一个技巧。 他通过awk脚本pipe理全局访问日志。 awk脚本反过来会照顾创build不同的日志文件。
在httpd.conf中:
LogFormat "%V %p %a %l %u %t \"%r\" %s %b \"%200{Referer}i\" \"%200{User-agent}i\" \"%{cookie}n\"" awklogpipe CustomLog "|/usr/local/bin/apacheawklogpipe" awklogpipe env=!dontlog
脚本/ usr / local / bin / apacheawklogpipe:
#!/bin/gawk -f BEGIN { months["Jan"] = "01"; months["Feb"] = "02"; months["Mar"] = "03"; months["Apr"] = "04"; months["May"] = "05"; months["Jun"] = "06"; months["Jul"] = "07"; months["Aug"] = "08"; months["Sep"] = "09"; months["Oct"] = "10"; months["Nov"] = "11"; months["Dec"] = "12"; } { # HEADS UP: SET THIS!!!! LOGBASE="/var/log/httpd/access" SSL="" # Automagicly set first SITE=tolower($1); PORT=$2 if ($2 == 443) { SSL="-ssl" } # Extract all but first two fields (vhostname vhostport to be exactly) into LINE LINE=substr($0,index($0,$3)); # No matter where it is, we will find an apache datestamp. match(LINE,/\[[0-9]+\/[AZ][az]+\/[0-9]+:[0-9]+:[0-9]+:[0-9]+[\t ]+[+-][0-9]+\]/); split(substr(LINE,RSTART + 1,RLENGTH - 2), ap_log_time, /[\/: ]/); #ap_rotatelog= LOGBASE "/" SITE ":" PORT "/access-log" SSL "-" ap_log_time[3] "-" months[ap_log_time[2]] ap_log_time[1]; ap_rotatelog= LOGBASE "/" SITE "/access_log" SSL; if (system("test -d " LOGBASE "/" SITE ) == 0) { print LINE >> ap_rotatelog; close(ap_rotatelog); } else { print SITE "\t" SSL "\t" LINE >> LOGBASE "/w3logrotate-error.log"; close(LOGBASE "/w3logrotate-error.log"); } }
确保/ usr / local / bin / apacheawklogpipe是可执行文件。 所有你需要照顾这个脚本,是创build一个目录在/var/log/httpd/access对应的虚拟主机名。 我有一个脚本,将创build一个虚拟主机configuration和创build日志目录。
另一种select。 不要将它们拆分到httpd.conf中。 相反,将所有内容logging到您的主要访问日志中,然后使用分割日志文件等程序将其分割 。 这有助于简化日志configuration。
这在http://httpd.apache.org/docs/2.2/logs.html#virtualhost中有描述
通过将虚拟主机的信息添加到日志格式string中,可以将所有主机logging到同一个日志中,然后将日志分成单独的文件。 例如,请考虑以下指令。
LogFormat "%v %l %u %t \"%r\" %>s %b" comonvhost CustomLog logs/access_log comonvhost%v用于logging提供请求的虚拟主机的名称。 然后像split-logfile这样的程序可以用来后处理访问日志,以便将其按照虚拟主机分成一个文件。
也许看看mod_macro 。 这有一个更一般的方法,但我想这可以帮助你,否则。