95 lines
2.7 KiB
Python
95 lines
2.7 KiB
Python
"""
|
|
Central logging setup for the application.
|
|
|
|
- Provides a unified logger via get_logger(__name__)
|
|
- Writes all logs to a central rotating log file (logs/app.log)
|
|
- Writes errors separately to logs/errors.log
|
|
- Automatically includes the module name in each log entry
|
|
- Supports standard logging levels: DEBUG, INFO, WARNING, ERROR, CRITICAL
|
|
|
|
Usage:
|
|
from backend.managers.debug_logger import get_logger
|
|
logger = get_logger(__name__)
|
|
|
|
logger.info("Service started")
|
|
logger.debug("Debug details")
|
|
logger.error("Something went wrong")
|
|
|
|
try:
|
|
...
|
|
except Exception:
|
|
logger.exception("Unexpected error")
|
|
|
|
Logging levels (use consistently):
|
|
DEBUG: Detailed technical info for developers (variables, flow, internal state).
|
|
INFO: Normal application events (start/stop, successful operations, key milestones).
|
|
WARNING: Something unexpected happened, but the program continues normally.
|
|
ERROR: A specific operation failed, but the application is still running.
|
|
CRITICAL: A severe failure that may stop the application or make it unusable.
|
|
EXCEPTION: Same as ERROR, but used inside an `except` block and includes stacktrace
|
|
(via logger.exception()).
|
|
"""
|
|
|
|
import logging
|
|
from logging.handlers import RotatingFileHandler
|
|
from pathlib import Path
|
|
|
|
BASE_DIR = Path(__file__).resolve().parent.parent
|
|
LOG_DIR = BASE_DIR / "logs"
|
|
LOG_DIR.mkdir(exist_ok=True)
|
|
|
|
class DebugLogger:
|
|
|
|
_initialized = False
|
|
|
|
@classmethod
|
|
def setup(cls):
|
|
# prevents multiple setup
|
|
if cls._initialized:
|
|
return
|
|
|
|
formatter = logging.Formatter(
|
|
"%(asctime)s [%(levelname)s] [%(name)s: Line %(lineno)d] %(message)s"
|
|
)
|
|
|
|
# Main log file
|
|
file_handler = RotatingFileHandler(
|
|
LOG_DIR / "app.log",
|
|
maxBytes=5_000_000,
|
|
backupCount=5,
|
|
encoding="utf-8"
|
|
)
|
|
|
|
file_handler.setFormatter(formatter)
|
|
|
|
# Separate Error-Log
|
|
error_handler = RotatingFileHandler(
|
|
LOG_DIR / "errors.log",
|
|
maxBytes=5_000_000,
|
|
backupCount=3,
|
|
encoding="utf-8"
|
|
)
|
|
|
|
error_handler.setLevel(logging.ERROR)
|
|
error_handler.setFormatter(formatter)
|
|
|
|
root_logger = logging.getLogger()
|
|
|
|
root_logger.setLevel(logging.DEBUG)
|
|
|
|
root_logger.addHandler(file_handler)
|
|
root_logger.addHandler(error_handler)
|
|
#root_logger.propagate = False
|
|
|
|
cls._initialized = True
|
|
|
|
@classmethod
|
|
def get_logger(cls, name: str):
|
|
cls.setup()
|
|
return logging.getLogger(name)
|
|
|
|
|
|
# praktische shortcut function
|
|
def get_logger(name: str):
|
|
return DebugLogger.get_logger(name)
|