默认情况下,Apache的所有网站的log文件都存在相同目录下,比如默认的:/var/log/apache2。然后logrotate定期去转储,然后会生成很多很多很多文件。。
如果需要查看某个网站的error文件或者access文件,会很麻烦,看得你眼花。
为了能更好的管理Apache Httpd产生的日志文件,在配置虚拟主机时对需要对每个网站的日志文件都做详细的分类。
简单的说,每个网站的log文件存放地址都使用以网站名称加端口(80或443)的目录下。比如:
############## 本站的80端口虚拟主机 <VirtualHost *:80> ServerAdmin email@qq.com DocumentRoot "/var/www/html/wp" ServerName coderecord.cn ServerAlias *.coderecord.cn devonios.com www.devonios.com ErrorLog ${APACHE_LOG_DIR}/coderecord_80/coderecord.error.log CustomLog ${APACHE_LOG_DIR}/coderecord_80/coderecord.access.log combined </VirtualHost> ############## 本站的443端口虚拟主机 <VirtualHost *:443> SSLEngine on ServerAdmin email@qq.com DocumentRoot "/var/www/html/wp" ServerName www.coderecord.cn ErrorLog ${APACHE_LOG_DIR}/coderecord_443/coderecord_443.error.log CustomLog ${APACHE_LOG_DIR}/coderecord_443/coderecord_443.access.log combined SSLCertificateFile /etc/apache2/cert/www.coderecord.cn/public.pem SSLCertificateKeyFile /etc/apache2/cert/www.coderecord.cn/21498787654678.key SSLCertificateChainFile /etc/apache2/cert/www.coderecord.cn/chain.pem <FilesMatch "\.(cgi|shtml|phtml|php)$"> SSLOptions +StdEnvVars </FilesMatch> </VirtualHost>
实际的目录存放样子:
这样一来,每个网站的日志,都非常清楚了。
现在我们希望logrotate能对这些目录下的log文件做自动归档,可以看到这里有很多目录。
logrotate程序会自动读取/etc/logrotate.d目录下所有文件的配置,默认只有一个apache2文件,如果把每个目录的配置都写在一个文件里,那就更乱了。
如果能分成一个网站一个文件,即根据log下的目录来配置,log下有几个目录,/etc/logrotate.d下就有几个配置文件,那就很清楚了,修改时也很方便。
所以,本文的重点来了,使用python脚本自动读取log目录下有哪些目录,然后使用目录名称自动创建配置文件,代码如下:
# -*- coding: utf-8 -*- import os logpath = "/var/www/logs/" def get_content(): with open("/opt/tool/new_logrotate_config.txt","r") as f: data = f.read() return data tempdata = get_content() for file in os.listdir(logpath): file_path = os.path.join(logpath, file) logfile = "/etc/logrotate.d/site_%s" % file if os.path.isdir(file_path) and not(os.path.exists(logfile)): currentdata = tempdata currentdata = currentdata.replace("{dirpath}",file_path) with open(logfile,"w+") as w: w.write(currentdata) print("成功创建logrotate配置文件:%s" % logfile)
代码中用到了一个模版文件:new_logrotate_config.txt,这个文件保存了logrotate的默认配置(根据需要自行修改配置),内容如下:
{dirpath}/*.log { weekly #monthly #daily missingok rotate 4 nocompress #compress #delaycompress notifempty dateext create 640 root adm sharedscripts postrotate if /etc/init.d/apache2 status > /dev/null ; then \ /etc/init.d/apache2 reload > /dev/null; \ fi; endscript prerotate if [ -d /etc/logrotate.d/httpd-prerotate ]; then \ run-parts /etc/logrotate.d/httpd-prerotate; \ fi; \ endscript }
其中第一行的目录位置使用了{dirpath}字符串,这样好在python中替换。
最后的结果:
麻麻再也不用担心我管理不好日志文件咯。