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
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")
log_file = f"{self.logs_dir}/{log_type}_{date_str}.json"
temp_file = f"{log_file}.tmp"
existing_logs = []
try:
# Append to existing file or create new
if os.path.exists(log_file):
with open(log_file, 'r', encoding='utf-8') as f:
try:
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.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)
os.replace(temp_file, log_file)
except Exception as 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):
"""Write member-specific log"""
"""Write member-specific log safely with atomic write"""
member_log_file = f"{self.member_logs_dir}/{member_id}.json"
temp_file = f"{member_log_file}.tmp"
existing_logs = []
try:
# Append to existing file or create new
if os.path.exists(member_log_file):
with open(member_log_file, 'r', encoding='utf-8') as f:
try:
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.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)
os.replace(temp_file, member_log_file)
except Exception as 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):
"""Send notification when member leaves"""