fix: sécurisation de l'écriture des logs (atomique) et gestion de la corruption JSON dans AdvancedLogger
This commit is contained in:
parent
16263d88bc
commit
148ddbe9bc
1 changed files with 38 additions and 14 deletions
|
|
@ -125,45 +125,69 @@ class AdvancedLogger:
|
||||||
return None
|
return None
|
||||||
|
|
||||||
def _write_log(self, log_type: str, data: Dict):
|
def _write_log(self, log_type: str, data: Dict):
|
||||||
"""Write log data to appropriate file"""
|
"""Write log data to appropriate file safely with atomic write"""
|
||||||
date_str = datetime.now().strftime("%Y-%m-%d")
|
date_str = datetime.now().strftime("%Y-%m-%d")
|
||||||
log_file = f"{self.logs_dir}/{log_type}_{date_str}.json"
|
log_file = f"{self.logs_dir}/{log_type}_{date_str}.json"
|
||||||
|
temp_file = f"{log_file}.tmp"
|
||||||
|
|
||||||
|
existing_logs = []
|
||||||
try:
|
try:
|
||||||
# Append to existing file or create new
|
|
||||||
if os.path.exists(log_file):
|
if os.path.exists(log_file):
|
||||||
with open(log_file, 'r', encoding='utf-8') as f:
|
with open(log_file, 'r', encoding='utf-8') as f:
|
||||||
|
try:
|
||||||
existing_logs = json.load(f)
|
existing_logs = json.load(f)
|
||||||
else:
|
except json.JSONDecodeError as e:
|
||||||
|
# Handle corrupted file by backing it up and starting fresh
|
||||||
|
corrupted_backup = f"{log_file}.corrupted"
|
||||||
|
os.rename(log_file, corrupted_backup)
|
||||||
|
kuby_logger.warning(f"Corrupted log file detected and backed up to {corrupted_backup}: {e}. Starting new log.")
|
||||||
existing_logs = []
|
existing_logs = []
|
||||||
|
|
||||||
existing_logs.append(data)
|
existing_logs.append(data)
|
||||||
|
|
||||||
with open(log_file, 'w', encoding='utf-8') as f:
|
# Atomic write using a temporary file
|
||||||
|
with open(temp_file, 'w', encoding='utf-8') as f:
|
||||||
json.dump(existing_logs, f, indent=2, ensure_ascii=False)
|
json.dump(existing_logs, f, indent=2, ensure_ascii=False)
|
||||||
|
|
||||||
|
os.replace(temp_file, log_file)
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
kuby_logger.error(f"Error writing log for {log_type}: {e}")
|
kuby_logger.error(f"Error writing log for {log_type}: {e}")
|
||||||
|
if os.path.exists(temp_file):
|
||||||
|
try: os.remove(temp_file)
|
||||||
|
except: pass
|
||||||
|
|
||||||
def _write_member_log(self, member_id: int, data: Dict):
|
def _write_member_log(self, member_id: int, data: Dict):
|
||||||
"""Write member-specific log"""
|
"""Write member-specific log safely with atomic write"""
|
||||||
member_log_file = f"{self.member_logs_dir}/{member_id}.json"
|
member_log_file = f"{self.member_logs_dir}/{member_id}.json"
|
||||||
|
temp_file = f"{member_log_file}.tmp"
|
||||||
|
|
||||||
|
existing_logs = []
|
||||||
try:
|
try:
|
||||||
# Append to existing file or create new
|
|
||||||
if os.path.exists(member_log_file):
|
if os.path.exists(member_log_file):
|
||||||
with open(member_log_file, 'r', encoding='utf-8') as f:
|
with open(member_log_file, 'r', encoding='utf-8') as f:
|
||||||
|
try:
|
||||||
existing_logs = json.load(f)
|
existing_logs = json.load(f)
|
||||||
else:
|
except json.JSONDecodeError as e:
|
||||||
|
# Handle corrupted file by backing it up and starting fresh
|
||||||
|
corrupted_backup = f"{member_log_file}.corrupted"
|
||||||
|
os.rename(member_log_file, corrupted_backup)
|
||||||
|
kuby_logger.warning(f"Corrupted member log detected and backed up to {corrupted_backup}: {e}. Starting new log.")
|
||||||
existing_logs = []
|
existing_logs = []
|
||||||
|
|
||||||
existing_logs.append(data)
|
existing_logs.append(data)
|
||||||
|
|
||||||
with open(member_log_file, 'w', encoding='utf-8') as f:
|
# Atomic write using a temporary file
|
||||||
|
with open(temp_file, 'w', encoding='utf-8') as f:
|
||||||
json.dump(existing_logs, f, indent=2, ensure_ascii=False)
|
json.dump(existing_logs, f, indent=2, ensure_ascii=False)
|
||||||
|
|
||||||
|
os.replace(temp_file, member_log_file)
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
kuby_logger.error(f"Error writing member log for {member_id}: {e}")
|
kuby_logger.error(f"Error writing member log for {member_id}: {e}")
|
||||||
|
if os.path.exists(temp_file):
|
||||||
|
try: os.remove(temp_file)
|
||||||
|
except: pass
|
||||||
|
|
||||||
async def send_leave_notification(self, member: discord.Member, channel: discord.TextChannel):
|
async def send_leave_notification(self, member: discord.Member, channel: discord.TextChannel):
|
||||||
"""Send notification when member leaves"""
|
"""Send notification when member leaves"""
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue