"""
Module d'enregistrement d'un journal d'activité du process.
Ce fichier contient une classe principale :class:`Logger` permettant d'enregistrer les différentes étapes du process.
"""
from dataclasses import dataclass, field
from datetime import datetime
from typing import TextIO
from palm_tracer.Tools.Utils import print_error, print_warning
##################################################
[docs]
@dataclass
class Logger:
""" Classe du journal d'activité. """
filename: str = field(init=False, default="")
"""Fichier de log à ouvrir."""
file_handle: TextIO = field(init=False, default_factory=TextIO)
"""Gestionnaire de fichier."""
_isopen: bool = field(init=False, default=False)
"""Indicateur d'ouverture du fichier."""
##################################################
[docs]
def open(self, filename: str):
"""Ouvre le fichier de log."""
self.filename = filename
try:
self.file_handle = open(self.filename, "a", encoding="utf-8") # Ouverture en mode ajout
self._isopen = True
print(f"[{self._get_time()}] Log ouvert : {self.filename}")
except Exception as e:
print_error(f"Erreur lors de l'ouverture du fichier {self.filename} : {e}")
##################################################
[docs]
def close(self):
"""Ferme le fichier de log."""
if self._isopen:
self.file_handle.write("\n")
self.file_handle.flush()
self.file_handle.close()
print(f"[{self._get_time()}] Log fermé : {self.filename}")
else:
print_warning(f"[{self._get_time()}] Aucun fichier à fermer.")
self.filename = ""
self.file_handle = TextIO()
self._isopen = False
##################################################
[docs]
def add(self, msg: str):
"""Ajoute un message au log."""
timestamped_msg = f"[{self._get_time()}] {msg}"
print(timestamped_msg) # Affiche le message dans la console
if self._isopen:
try:
self.file_handle.write(timestamped_msg + "\n")
self.file_handle.flush() # S'assure que les données sont écrites immédiatement
except Exception as e:
print_error(f"Erreur lors de l'écriture dans le fichier {self.filename} : {e}")
else:
print_warning(f"[{self._get_time()}] Aucun fichier de log ouvert pour écrire.")
##################################################
[docs]
@staticmethod
def _get_time() -> str:
"""Renvoie la date et l'heure actuelles sous forme de chaîne formatée."""
return datetime.now().strftime("%d-%m-%Y %H:%M:%S")