chore(release): v0.7.6
Ajoute un fichier log texte rotatif (wgsecure.log) dans le dossier applicatif, en complément du journal JSON interne, pour diagnostiquer un échec (ex. split-DNS) sans dépendre de l'UI. Corrige le panneau Journal qui coupait les messages longs sans moyen de les lire en entier (défilement horizontal réactivé + infobulle). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
@@ -1,17 +1,48 @@
|
||||
"""Journal des événements de connexion WGSecure."""
|
||||
import os
|
||||
import json
|
||||
import logging
|
||||
from datetime import datetime
|
||||
from logging.handlers import RotatingFileHandler
|
||||
|
||||
from app.utils.platform_utils import get_config_dir
|
||||
|
||||
_FILE = "events.json"
|
||||
_MAX_ENTRIES = 200
|
||||
|
||||
_LOG_FILE = "wgsecure.log"
|
||||
_LOG_LEVELS = {
|
||||
"error": logging.ERROR,
|
||||
"warning": logging.WARNING,
|
||||
}
|
||||
_file_logger: logging.Logger | None = None
|
||||
|
||||
|
||||
def _path() -> str:
|
||||
return os.path.join(get_config_dir(), _FILE)
|
||||
|
||||
|
||||
def _get_file_logger() -> logging.Logger:
|
||||
"""Logger fichier rotatif : trace texte des opérations, lisible sans
|
||||
passer par l'UI (diagnostic d'un échec quand le panneau Journal ne
|
||||
suffit pas)."""
|
||||
global _file_logger
|
||||
if _file_logger is None:
|
||||
logger = logging.getLogger("wgsecure")
|
||||
logger.setLevel(logging.INFO)
|
||||
handler = RotatingFileHandler(
|
||||
os.path.join(get_config_dir(), _LOG_FILE),
|
||||
maxBytes=1_000_000, backupCount=3, encoding="utf-8",
|
||||
)
|
||||
handler.setFormatter(logging.Formatter(
|
||||
"%(asctime)s [%(levelname)s] %(message)s", "%Y-%m-%d %H:%M:%S",
|
||||
))
|
||||
logger.addHandler(handler)
|
||||
logger.propagate = False
|
||||
_file_logger = logger
|
||||
return _file_logger
|
||||
|
||||
|
||||
def log_event(msg: str, kind: str = "info") -> None:
|
||||
"""Ajoute un événement horodaté au journal."""
|
||||
events = _load()
|
||||
@@ -21,6 +52,11 @@ def log_event(msg: str, kind: str = "info") -> None:
|
||||
"msg": msg,
|
||||
})
|
||||
_save(events[-_MAX_ENTRIES:])
|
||||
# Une ligne = un événement, même si msg contient des retours à la ligne
|
||||
# (ex. message de succès de connexion suivi d'un avertissement).
|
||||
_get_file_logger().log(
|
||||
_LOG_LEVELS.get(kind, logging.INFO), msg.replace("\n", " | ")
|
||||
)
|
||||
|
||||
|
||||
def get_events(n: int = 50) -> list[dict]:
|
||||
|
||||
Reference in New Issue
Block a user