Source code for camacq.log

"""Handle logging."""

import logging
import logging.config
import logging.handlers
import os
from pathlib import Path
from typing import Any

import colorlog

from camacq.const import CONFIG_DIR, LOG_LEVEL

LOG_FILENAME = "camacq.log"
_LOGGER = logging.getLogger(__name__)


[docs] def check_path(path: Path) -> bool: """Check that path to config exists and is writable for logging. Parameters ---------- path : pathlib.Path The path to the log file or log directory. Returns ------- bool Return True if path exists and is writable. """ if (path.is_file() and os.access(path, os.W_OK)) or ( path.parent.is_dir() and os.access(path.parent, os.W_OK) ): return True _LOGGER.error("Unable to access log file %s (access denied)", path) return False
[docs] def enable_log(config: dict[str, Any]) -> None: """Enable logging. Parameters ---------- config : dict The dict with the configuration. """ logging.basicConfig(level=logging.INFO) root_logger = logging.getLogger() # basicConfig has added a StreamHandler # '%(log_color)s%(levelname)s:%(name)s:%(message)s' # '%(asctime)s;%(name)-16s;%(levelname)-8s;%(message)s' log_format = "%(asctime)s;%(levelname)-5s;%(threadName)-10s;%(name)-18s;%(message)s" date_format = "%Y-%m-%d %H:%M:%S" color_format = f"%(log_color)s{log_format}" root_logger.handlers[0].setFormatter( colorlog.ColoredFormatter( color_format, datefmt=date_format, log_colors={ "DEBUG": "cyan", "INFO": "green", "WARNING": "yellow", "ERROR": "red", "CRITICAL": "red", }, ) ) log_config = config.get("logging") if log_config: log_path = log_config["handlers"]["filelog"]["filename"] if log_path and check_path(Path(log_path)): logging.config.dictConfig(log_config) else: # get log path from default config dir _LOGGER.info("No config for logging supplied") log_path = config[CONFIG_DIR] / LOG_FILENAME _LOGGER.info("Using default log path at: %s", log_path) if check_path(log_path): filelog = logging.handlers.RotatingFileHandler( log_path, maxBytes=1048576, backupCount=9, encoding="utf-8", delay=False ) filelog.setLevel(logging.WARNING) formatter = logging.Formatter( "%(asctime)s;%(name)-18s;%(levelname)-8s;%(message)s" ) filelog.setFormatter(formatter) logging.getLogger("").addHandler(filelog) if LOG_LEVEL in config: log_level = config[LOG_LEVEL] root_logger.setLevel(log_level) root_logger.handlers[0].setLevel(config[LOG_LEVEL]) # Silence matplotlib spam at debug level. logger = logging.getLogger("matplotlib") logger.setLevel(logging.INFO)