使用Python自动创建logrotate配置文件

By | 2018年2月13日

默认情况下,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中替换。

最后的结果:

麻麻再也不用担心我管理不好日志文件咯。