diff --git a/capability_manager/Capability.py b/capability_manager/Capability.py index 16c47bf..c0baa4f 100644 --- a/capability_manager/Capability.py +++ b/capability_manager/Capability.py @@ -2,6 +2,7 @@ import pathlib project_root = pathlib.Path(__file__).parent.parent.resolve() +from utils.logging import setup_logger class Capability: """ Base class for all capabilities. @@ -22,31 +23,7 @@ def __init__(self, name, description): self.storage_root = f"{project_root}/storage/capabilities/{self.name}" # Set up logging - self.logger = logging.getLogger(name) # Create a logger for this layer - self.logger.setLevel(logging.DEBUG) # Set the logging level - - # Create a console handler - ch = logging.StreamHandler() - ch.setLevel(logging.DEBUG) - - # Create a file handler - fh = logging.FileHandler(f'{project_root}/application.log') - fh.setLevel(logging.DEBUG) - - # Create a formatter - formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') - - # Add the formatter to the console handler - ch.setFormatter(formatter) - - # Add the formatter to the file handler - fh.setFormatter(formatter) - - # Add the console handler to the logger - self.logger.addHandler(ch) - - # Add the file handler to the logger - self.logger.addHandler(fh) + self.logger = setup_logger(name) def execute(self): """ diff --git a/layers/CognitiveLayer.py b/layers/CognitiveLayer.py index 3bd1cc3..b79b966 100644 --- a/layers/CognitiveLayer.py +++ b/layers/CognitiveLayer.py @@ -27,6 +27,7 @@ from capability_manager import CapabilityManager from resource_manager import ResourceManager from product_manager import ProductManager +from utils.logging import setup_logger project_root = pathlib.Path(__file__).parent.parent.resolve() @@ -69,31 +70,7 @@ def __init__(self, name): self.total_cost: float = 0 # Set up logging - self.logger = logging.getLogger(name) # Create a logger for this layer - self.logger.setLevel(logging.DEBUG) # Set the logging level - - # Create a console handler - ch = logging.StreamHandler() - ch.setLevel(logging.DEBUG) - - # Create a file handler - fh = logging.FileHandler(f'{project_root}/application.log') - fh.setLevel(logging.DEBUG) - - # Create a formatter - formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') - - # Add the formatter to the console handler - ch.setFormatter(formatter) - - # Add the formatter to the file handler - fh.setFormatter(formatter) - - # Add the console handler to the logger - self.logger.addHandler(ch) - - # Add the file handler to the logger - self.logger.addHandler(fh) + self.logger = setup_logger(name) def pass_up(self, data): """ diff --git a/product_manager/Product.py b/product_manager/Product.py index 1fcd28e..2510b21 100644 --- a/product_manager/Product.py +++ b/product_manager/Product.py @@ -2,6 +2,7 @@ import pathlib project_root = pathlib.Path(__file__).parent.parent.resolve() +from utils.logging import setup_logger class Product: """ @@ -27,31 +28,7 @@ def __init__(self, name, description, required_resources=None, required_capabili self.storage_root = f"{project_root}/storage/products/{self.name}" # Set up logging - self.logger = logging.getLogger(name) # Create a logger for this layer - self.logger.setLevel(logging.DEBUG) # Set the logging level - - # Create a console handler - ch = logging.StreamHandler() - ch.setLevel(logging.DEBUG) - - # Create a file handler - fh = logging.FileHandler(f'{project_root}/application.log') - fh.setLevel(logging.DEBUG) - - # Create a formatter - formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') - - # Add the formatter to the console handler - ch.setFormatter(formatter) - - # Add the formatter to the file handler - fh.setFormatter(formatter) - - # Add the console handler to the logger - self.logger.addHandler(ch) - - # Add the file handler to the logger - self.logger.addHandler(fh) + self.logger = setup_logger(name) def draft(self): """ diff --git a/resource_manager/Resource.py b/resource_manager/Resource.py index efefcbe..5066050 100644 --- a/resource_manager/Resource.py +++ b/resource_manager/Resource.py @@ -2,6 +2,7 @@ import pathlib project_root = pathlib.Path(__file__).parent.parent.resolve() +from utils.logging import setup_logger class Resource: """ Base class for all resources. @@ -26,31 +27,7 @@ def __init__(self, name, description, capacity=0, used=0, budget=0): self.storage_root = f"{project_root}/storage/resources/{self.name}" # Set up logging - self.logger = logging.getLogger(name) # Create a logger for this layer - self.logger.setLevel(logging.DEBUG) # Set the logging level - - # Create a console handler - ch = logging.StreamHandler() - ch.setLevel(logging.DEBUG) - - # Create a file handler - fh = logging.FileHandler(f'{project_root}/application.log') - fh.setLevel(logging.DEBUG) - - # Create a formatter - formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') - - # Add the formatter to the console handler - ch.setFormatter(formatter) - - # Add the formatter to the file handler - fh.setFormatter(formatter) - - # Add the console handler to the logger - self.logger.addHandler(ch) - - # Add the file handler to the logger - self.logger.addHandler(fh) + self.logger = setup_logger(name) self.logger.debug(f"Instance of {name} resource created.") diff --git a/utils/__init__.py b/utils/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/utils/logging.py b/utils/logging.py new file mode 100644 index 0000000..81b5875 --- /dev/null +++ b/utils/logging.py @@ -0,0 +1,28 @@ +import logging +import pathlib + +project_root = pathlib.Path(__file__).parent.parent.resolve() + + +def setup_logger(name: str) -> logging.Logger: + """Return a logger with stream and file handlers. + + Handlers are only added if the logger doesn't already have any. + """ + logger = logging.getLogger(name) + if not logger.handlers: + logger.setLevel(logging.DEBUG) + + ch = logging.StreamHandler() + ch.setLevel(logging.DEBUG) + + fh = logging.FileHandler(f"{project_root}/application.log") + fh.setLevel(logging.DEBUG) + + formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') + ch.setFormatter(formatter) + fh.setFormatter(formatter) + + logger.addHandler(ch) + logger.addHandler(fh) + return logger