import os import time import datetime import subprocess import mysql.connector # Docker容器名称 container_name = "containerName" # MySQL数据库连接配置 db_host = "localhost" db_user = "*********" db_password = "*********" db_database = "***********" # 连接到MySQL数据库 db_connection = mysql.connector.connect( host=db_host, user=db_user, password=db_password, database=db_database ) db_cursor = db_connection.cursor() # 创建错误日志表格 db_cursor.execute("CREATE TABLE IF NOT EXISTS error_logs (id INT AUTO_INCREMENT PRIMARY KEY, container_name VARCHAR(255), error_time DATETIME)") db_connection.commit() # 日志文件路径 #log_file = "/var/log/docker.log" # 定时检查间隔(秒) check_interval = 60 # 定义错误关键词 error_keywords = ["\x1b[1;31m[E]\x1b[0m"] # 定义容器重启次数 restart_count = 0 while True: # 获取当前时间 current_time = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") # 获取容器日志 logs_command = f"docker logs --tail 100 {container_name}" logs_process = subprocess.Popen(logs_command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) logs_output, _ = logs_process.communicate() logs = logs_output.decode("utf-8") # 检查日志中是否包含错误关键词 if 1:#any(keyword in logs.lower() for keyword in error_keywords): # 提取时间字符串 #log_lines = logs.split("\n") for line in logs.splitlines(): if error_keywords[0] in line: # 获取时间字符串 time_string = line[:19] # 解析时间字符串为datetime对象 error_time = datetime.datetime.strptime(time_string, "%Y/%m/%d %H:%M:%S") # 查询是否存在记录 db_cursor.execute("SELECT COUNT(*) FROM error_logs WHERE error_time = %s", (error_time,)) result = db_cursor.fetchone() count = result[0] # 判断是否存在记录 if count > 0: break print("存在记录,不重启docker") else: print("不存在记录,执行重启docker操作") # 记录错误时间到数据库 db_cursor.execute("INSERT INTO error_logs (container_name, error_time) VALUES (%s, %s)", (container_name, error_time)) db_connection.commit() # 重启容器 restart_command = f"docker restart {container_name}" subprocess.run(restart_command, shell=True) restart_count += 1 print(f"Detected error in logs. Restarted container. Restart count: {restart_count}") # 休眠一段时间,等待容器重启完成 break break # 休眠一段时间后继续检查 #time.sleep(check_interval)