fix: sécurisation de l'écriture des logs (atomique) et gestion de la corruption JSON dans AdvancedLogger

This commit is contained in:
Mathis 2026-03-28 22:05:55 +01:00
parent 16263d88bc
commit 148ddbe9bc

View file

@ -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:
existing_logs = json.load(f) try:
else: existing_logs = json.load(f)
existing_logs = [] 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.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:
existing_logs = json.load(f) try:
else: existing_logs = json.load(f)
existing_logs = [] 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.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"""