modularisierung von app.py und app.js - erster versuch
This commit is contained in:
@@ -0,0 +1,87 @@
|
||||
# app/utils/logging.py
|
||||
import logging
|
||||
import os
|
||||
import shutil
|
||||
from logging.handlers import TimedRotatingFileHandler
|
||||
from datetime import datetime, timedelta
|
||||
|
||||
LOG_DIR = app.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")
|
||||
Reference in New Issue
Block a user