90 lines
2.9 KiB
Python
90 lines
2.9 KiB
Python
# app/utils/logging.py
|
||
import logging
|
||
import os
|
||
import shutil
|
||
from logging.handlers import TimedRotatingFileHandler
|
||
from datetime import datetime, timedelta
|
||
from config import Config
|
||
|
||
#LOG_DIR = app.config['LOG_DIR']
|
||
LOG_DIR = Config.LOG_DIR
|
||
os.makedirs(LOG_DIR, exist_ok=True)
|
||
|
||
def cleanup_old_log_dirs(max_age_days=90):
|
||
"""
|
||
Löscht Monatsordner in logs/, die älter als max_age_days sind.
|
||
Beispiel: logs/2025-11/ wird gelöscht, wenn älter als 90 Tage.
|
||
"""
|
||
if not os.path.exists(LOG_DIR):
|
||
return
|
||
|
||
cutoff_date = datetime.now() - timedelta(days=max_age_days)
|
||
cutoff_str = cutoff_date.strftime('%Y-%m')
|
||
|
||
deleted = 0
|
||
for subdir in os.listdir(LOG_DIR):
|
||
subdir_path = os.path.join(LOG_DIR, subdir)
|
||
if os.path.isdir(subdir_path):
|
||
try:
|
||
subdir_date = datetime.strptime(subdir, '%Y-%m')
|
||
if subdir_date < cutoff_date:
|
||
shutil.rmtree(subdir_path)
|
||
deleted += 1
|
||
logger.info(f"Alten Log-Ordner gelöscht: {subdir_path}")
|
||
except ValueError:
|
||
# Kein gültiges Datumsformat → überspringen
|
||
continue
|
||
except Exception as e:
|
||
logger.error(f"Fehler beim Löschen von {subdir_path}: {e}")
|
||
|
||
if deleted > 0:
|
||
logger.info(f"Insgesamt {deleted} alte Log-Ordner bereinigt")
|
||
else:
|
||
logger.debug("Keine alten Log-Ordner zum Bereinigen gefunden")
|
||
|
||
def setup_logging(app):
|
||
"""
|
||
Richtet das Logging ein: tägliche Dateien in Unterordnern + Trennung info/error.
|
||
Ruft auch einmalig cleanup auf.
|
||
"""
|
||
# Cleanup beim Start
|
||
cleanup_old_log_dirs(90)
|
||
|
||
today = datetime.now().strftime('%Y-%m')
|
||
subdir = os.path.join(LOG_DIR, today)
|
||
os.makedirs(subdir, exist_ok=True)
|
||
|
||
base = os.path.join(subdir, datetime.now().strftime('%d'))
|
||
|
||
# Info-Handler
|
||
info_handler = logging.FileHandler(f"{base}-info.log")
|
||
info_handler.setLevel(logging.INFO)
|
||
info_handler.setFormatter(logging.Formatter(
|
||
'%(asctime)s | %(levelname)-8s | %(message)s',
|
||
datefmt='%Y-%m-%d %H:%M:%S'
|
||
))
|
||
|
||
# Error-Handler
|
||
error_handler = logging.FileHandler(f"{base}-error.log")
|
||
error_handler.setLevel(logging.WARNING)
|
||
error_handler.setFormatter(logging.Formatter(
|
||
'%(asctime)s | %(levelname)-8s | %(message)s\n%(pathname)s:%(lineno)d\n',
|
||
datefmt='%Y-%m-%d %H:%M:%S'
|
||
))
|
||
|
||
# Root-Logger konfigurieren
|
||
logger = logging.getLogger()
|
||
logger.setLevel(logging.DEBUG)
|
||
logger.handlers.clear()
|
||
logger.addHandler(info_handler)
|
||
logger.addHandler(error_handler)
|
||
|
||
# Konsole
|
||
console = logging.StreamHandler()
|
||
console.setLevel(logging.INFO)
|
||
console.setFormatter(info_handler.formatter)
|
||
logger.addHandler(console)
|
||
|
||
logger.info("Logging eingerichtet – tägliche Trennung info/error")
|
||
logger.info(f"Logs heute: {base}-info.log / {base}-error.log")
|