File size: 4,117 Bytes
a757bd3 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 | #!/usr/bin/python
# coding: utf-8
# -----------------------------
# 宝塔docker容器日志切割脚本
# -----------------------------
import sys
import os
import time
import datetime
os.chdir("/www/server/panel")
sys.path.append('class/')
import public
import subprocess
class DkLogSpilt:
task_list = []
def __init__(self):
if not public.M('sqlite_master').db('docker_log_split').where('type=? AND name=?', ('table', 'docker_log_split')).count():
self.task_list = []
else:
self.task_list = public.M('docker_log_split').select()
for i in self.task_list:
# 使用 Docker 命令检查容器是否存在
result = subprocess.run(['docker', 'inspect', i['pid']], capture_output=True, text=True)
if result.returncode != 0:
public.M('docker_log_split').where('id=?', (i['id'],)).delete()
def run(self):
if not self.task_list:
print('无docker日志切割任务')
for task in self.task_list:
try:
if task['split_type'] == 'day':
self.day_split(task)
elif task['split_type'] == 'size':
self.size_split(task)
except:
print('{}切割日志失败!'.format(task['name']))
def day_split(self, task):
now_time = int(time.time())
exec_time = int(self.get_timestamp_of_hour_minute(task['split_hour'], task['split_minute']))
if now_time <= exec_time <= now_time + 300:
print("{}容器开始日志切割".format(task['name']))
split_path = '/var/lib/docker/containers/history_logs/{}/'.format(task['pid'])
if not os.path.exists(split_path):
os.makedirs(split_path)
os.rename(task['log_path'], split_path + task['pid'] + "-json.log" + '_' + str(int(time.time())))
public.writeFile(task['log_path'], '')
print("{}日志已切割到:{}".format(task['name'],split_path + task['pid'] + "-json.log" + '_' + str(int(time.time()))))
self.check_save(task)
else:
print('{}容器日志未到切割时间'.format(task['name']))
def size_split(self, task):
if not os.path.exists(task['log_path']):
print('日志文件不存在')
return
if os.path.getsize(task['log_path']) >= task['split_size']:
print("{}容器开始日志切割".format(task['name']))
split_path = '/var/lib/docker/containers/history_logs/{}/'.format(task['pid'])
if not os.path.exists(split_path):
os.makedirs(split_path)
os.rename(task['log_path'], split_path + task['pid'] + "-json.log" + '_' + str(int(time.time())))
public.writeFile(task['log_path'], '')
print("{}日志已切割到:{}".format(task['name'],split_path + task['pid'] + "-json.log" + '_' + str(int(time.time()))))
self.check_save(task)
else:
print('{}容器日志未到切割大小'.format(task['name']))
def check_save(self, task):
split_path = '/var/lib/docker/containers/history_logs/{}/'.format(task['pid'])
file_count = len(os.listdir(split_path))
if file_count > task['save']:
file_list = os.listdir(split_path)
file_list.sort()
for i in range(file_count - task['save']):
os.remove(split_path + file_list[i])
print('删除日志文件:{}'.format(split_path + file_list[i]))
print('已保留最新{}份日志'.format(task['save']))
def get_timestamp_of_hour_minute(self, hour, minute):
"""获取当天指定时刻的时间戳。
Args:
hour: 小时。
minute: 分钟。
Returns:
时间戳。
"""
current_time = datetime.datetime.now()
timestamp = current_time.replace(hour=hour, minute=minute, second=0, microsecond=0)
return int(timestamp.timestamp())
if __name__ == '__main__':
dk = DkLogSpilt()
dk.run()
|