Ein Ansatz für Logverzeichnisse im Format /log/<yyyy>/<mm>/<dd>/<div. logsfiles>
#!/usr/bin/env python
import gzip
import shutil
import os
import datetime
import time
#############################################
# Config
#############################################
# Path of Logfiles
# Structure is /opt/log/<YYYY>/<MM>/<DD>/
gpath='/opt/log/'
# hold logs for x days
hold_time=180
#############################################
def get_immediate_subdirectories(a_dir):
return [name for name in os.listdir(a_dir) if os.path.isdir(os.path.join(a_dir, name))]
def delete_files(f):
# delete file if older than hold time
nowx = time.time()
for file in os.listdir(f):
if os.stat(f+file).st_mtime < nowx - hold_time * 86400:
f_path = f+file
print "delete %s " % f_path
os.remove(f_path)
try:
os.rmdir(f)
except:
pass
def compress_files(lpath):
# Compress files
print "Working on: " + lpath
obj = os.listdir(lpath)
for f in obj:
if os.path.isfile(lpath+f) and ".gz" not in f:
with open(lpath+f,'rb') as f_in:
with gzip.open(lpath+f+".gz",'wb') as f_out:
shutil.copyfileobj(f_in, f_out)
os.remove(lpath+f)
#compress everything which ist older than now
now = datetime.datetime.now()
years = get_immediate_subdirectories(gpath)
for year in years:
# delete empty directories
if not os.listdir(gpath+year):
os.rmdir(gpath+year)
else:
months = get_immediate_subdirectories(gpath+year)
for month in months:
# delete empty directories
if not os.listdir(gpath+year+"/"+month):
os.rmdir(gpath+year+"/"+month)
else:
days = get_immediate_subdirectories(gpath+year+"/"+month)
# Remove current day from compressing & cleaning
if month == str(now.month) and year == str(now.year):
if len(str(now.day)):
now_day = "0%s" % now.day
else:
now_day = str(now.day)
days.remove(now_day)
for day in days:
# delete empty directories
if not os.listdir(gpath+year+"/"+month+"/"+day+"/"):
os.rmdir(gpath+year+"/"+month+"/"+day+"/")
else:
# compress all files in folder
compress_files(gpath+year+"/"+month+"/"+day+"/")
# delete old files
delete_files(gpath+year+"/"+month+"/"+day+"/")
