diff --git a/src/advanced_logger.py b/src/advanced_logger.py index 54aaeba..085371c 100755 --- a/src/advanced_logger.py +++ b/src/advanced_logger.py @@ -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"""