#!/usr/bin/env python3 """ utils.configuration.app_logger.py file for the c3 printing system. """ ### ### DEPENDENCIES ### import sys import logging def setup_logger(name: str, level: str | None = "INFO", log_formatter: str | None = None, log_file: str | None = None, log_file_append: bool | None = False ) -> logging.Logger: if level == "DEBUG": lvl = logging.DEBUG elif level == "INFO": lvl = logging.INFO elif level == "WARNING": lvl = logging.WARNING elif level == "ERROR": lvl = logging.ERROR else: print(f"\nERROR ---> Could not set logger for: {name}.\n LogLevel parsed '{level}' is unknown...\n\n") sys.exit() # Create a logger logger = logging.getLogger(name) # Set the logging level logger.setLevel(lvl) # Avoid adding multiple handlers if not logger.hasHandlers(): # Set log formatter if log_formatter is None: formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') else: formatter = logging.Formatter(log_formatter) if log_file is not None: if log_file_append: fh = logging.FileHandler(log_file, mode="a") else: fh = logging.FileHandler(log_file) fh.setLevel(lvl) fh.setFormatter(formatter) logger.addHandler(fh) # Create a console handler (optional, if you still want console output) ch = logging.StreamHandler() ch.setLevel(lvl) # # Change to WARNING to only see warnings/errors in the terminal # ch.setLevel(logging.WARNING) # ch.setLevel(logging.INFO) # Add formatter to both handlers ch.setFormatter(formatter) # Add handlers to the logger logger.addHandler(ch) return logger def set_logger_from_default(name: str, values_default: dict) -> logging.Logger: log_file = None if values_default.get('DEFAULT_LOG_TO_FILE'): log_file = values_default.get('DEFAULT_LOG_FILE_PATH') if values_default.get('DEFAULT_DEBUG'): logger = setup_logger( name=name, level="DEBUG", log_formatter=values_default.get('DEFAULT_LOG_FORMAT'), log_file=log_file, ) else: logger = setup_logger( name=name, # level=logging.DEBUG, log_formatter=values_default.get('DEFAULT_LOG_FORMAT'), log_file=log_file, ) return logger def set_logger_from_config(name: str, config: object) -> logging.Logger: log_file = None log_file_append = True if config.log_to_file: log_file = config.log_file_path log_file_append = config.log_file_append_mode if config.debug: logger = setup_logger( name=name, level="DEBUG", log_formatter=config.log_format, log_file=log_file, log_file_append=log_file_append, ) else: logger = setup_logger( name=name, # level="DEBUG", log_formatter=config.log_format, log_file=log_file, log_file_append=log_file_append, ) return logger def set_logger_from_dict(name: str, dict_values: dict) -> logging.Logger: log_file = None log_file_append = True if dict_values.get('log_to_file'): log_file = dict_values.get('log_file_path') log_file_append = dict_values.get('log_file_append_mode') if dict_values.get('debug'): logger = setup_logger( name=name, level="DEBUG", log_formatter=dict_values.get('log_format'), log_file=log_file, log_file_append=log_file_append, ) else: logger = setup_logger( name=name, # level="DEBUG", log_formatter=dict_values.get('log_format'), log_file=log_file, log_file_append=log_file_append, ) return logger