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
|
||||
|
||||
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:
|
||||
existing_logs = json.load(f)
|
||||
else:
|
||||
existing_logs = []
|
||||
|
||||
try:
|
||||
existing_logs = json.load(f)
|
||||
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:
|
||||
existing_logs = json.load(f)
|
||||
else:
|
||||
existing_logs = []
|
||||
|
||||
try:
|
||||
existing_logs = json.load(f)
|
||||
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"""
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue