dramatically simplify logging setup #18

Merged
perl_d merged 3 commits from fix/logging_improvements_2 into main 2026-08-17 11:03:19 +02:00
3 changed files with 33 additions and 131 deletions
+33 -47
View File
@@ -1,9 +1,6 @@
import logging
import logging.config
import os
from pathlib import Path
import yaml
class IgnoreSuccessfulStatusAccessFilter(logging.Filter):
@@ -69,56 +66,45 @@ def get_uvicorn_logging_config() -> dict:
}
def get_config_path(env: str = "dev") -> Path:
module_dir = Path(__file__).parent
config_filename = f"logging_{env}.yaml"
config_path = module_dir / "logging_configs" / config_filename
if not config_path.exists():
raise FileNotFoundError(f"Logging config not found: {config_path}")
return config_path
AARE_LOG_CONFIG = {
"version": 1,
"disable_existing_loggers": False,
"formatters": {"simple": {"format": "%(asctime)s - %(levelname)s - %(message)s"}},
"handlers": {
"console": {
"class": "logging.StreamHandler",
"formatter": "simple",
"level": "DEBUG",
"stream": " ext://sys.stdout",
}
},
"loggers": {
"aareDAQ": {"level": "DEBUG"},
"aareGUI": {"level": "DEBUG"},
"redis_lock": {"level": "WARNING"},
"urllib3": {"level": "WARNING"},
"matplotlib": {"level": "WARNING"},
},
"root": {"level": "WARNING", "handlers": ["console"]},
}
# TODO fix logging.
def setup_logger(
name="aareDAQ", base_dir: str | None = "~/tmp/mxlogs/", config_path: str | None = None
):
# switch to production mode using: $ APP_ENV=prod python main.py
env = os.getenv("APP_ENV", "dev") # default: dev
_setup_done: bool = False
_additional_loggers_setup: set[str] = set()
if config_path is None:
config_file = get_config_path(env)
else:
config_file = Path(config_path)
with open(config_file, "r") as f:
config = yaml.safe_load(f.read())
def setup_logger(name: str):
logger = logging.getLogger(name)
if name not in _additional_loggers_setup:
_additional_loggers_setup.add(name)
logger.setLevel(logging.DEBUG)
# Force base directory to be under the user's home dir
effective_base = base_dir + f"{name}" or f"/tmp/logs/mxlogs/{name}"
effective_base = os.path.abspath(os.path.expanduser(os.path.expandvars(effective_base)))
global _setup_done
if _setup_done:
return logger
# Ensure directories for file handlers exist
handlers = config.get("handlers", {})
for h in handlers.values():
filename = h.get("filename")
if not filename:
continue
abs_filename = os.path.join(effective_base, os.path.basename(filename))
h["filename"] = abs_filename
log_dir = os.path.dirname(abs_filename)
if log_dir and not os.path.exists(log_dir):
os.makedirs(log_dir, exist_ok=True)
logging.config.dictConfig(config)
logging.getLogger("redis_lock").setLevel(logging.WARNING)
logging.getLogger("urllib3").setLevel(logging.WARNING)
logging.getLogger("matplotlib.font_manager").setLevel(logging.WARNING)
logging.getLogger("aaredaq").setLevel(logging.DEBUG) # DAQ
logging.getLogger("aaregui").setLevel(logging.INFO)
logging.config.dictConfig(AARE_LOG_CONFIG)
_setup_done = True
return logging.getLogger(name)
@@ -1,45 +0,0 @@
version: 1
disable_existing_loggers: False
formatters:
detailed:
format: "%(asctime)s - %(name)s - %(levelname)s - %(message)s"
handlers:
console:
class: logging.StreamHandler
level: DEBUG
formatter: detailed
stream: ext://sys.stdout
app_file:
class: logging.handlers.RotatingFileHandler
level: DEBUG
formatter: detailed
filename: app.log
maxBytes: 1440000 #not to overflow a diskette
backupCount: 10
encoding: utf8
error_file:
class: logging.handlers.RotatingFileHandler
level: ERROR
formatter: detailed
filename: errors.log
maxBytes: 1440000
backupCount: 5
encoding: utf8
loggers:
aareDAQ:
level: DEBUG
handlers: [console, app_file, error_file]
propagate: yes
aareGUI:
level: DEBUG
handlers: [ console, app_file, error_file ]
propagate: yes
root:
level: DEBUG
handlers: [console]
@@ -1,39 +0,0 @@
version: 1
disable_existing_loggers: False
formatters:
simple:
format: "%(asctime)s - %(levelname)s - %(message)s"
handlers:
app_file:
class: logging.handlers.RotatingFileHandler
level: INFO
formatter: simple
filename: logs/app.log
maxBytes: 1000000
backupCount: 10
encoding: utf8
error_file:
class: logging.handlers.RotatingFileHandler
level: ERROR
formatter: simple
filename: logs/errors.log
maxBytes: 500000
backupCount: 5
encoding: utf8
loggers:
aareDAQ:
level: DEBUG
handlers: [console, app_file, error_file]
propagate: no
aareGUI:
level: DEBUG
handlers: [ console, app_file, error_file ]
propagate: n
root:
level: WARNING
handlers: []