Source code for laborchestrator.logging_manager
import logging
from datetime import datetime
import os
_log_format = "%(asctime)s - [%(levelname)s] - %(name)s - (%(filename)s).%(funcName)s(%(lineno)d) - %(message)s"
_console_format = "%(levelname)s:%(message)s"
default_session_name = f"session_{datetime.today().ctime()}"
default_session_name = default_session_name.replace(" ", "_").replace(":", "_")
lvl_name = {
logging.DEBUG: "DEBUG",
logging.INFO: "INFO",
logging.WARNING: "WARNING",
logging.ERROR: "ERROR",
logging.CRITICAL: "CRITICAL",
}
def get_file_handler(handler_name: str, lvl: int):
file_handler = logging.FileHandler(handler_name)
file_handler.setLevel(lvl)
file_handler.setFormatter(logging.Formatter(_log_format))
return file_handler
def get_stream_handler(lvl: int):
stream_handler = logging.StreamHandler()
stream_handler.setLevel(lvl)
stream_handler.setFormatter(logging.Formatter(_console_format))
return stream_handler
[docs]
def get_standard_logger(session_name: str = default_session_name, stream_lvl: int = logging.INFO):
"""
Returns a custom logger named 'Orchestrator logger' with separate file and console handlers.
This logger is independent of the root logger so that calls like logging.warning() do not use these settings.
"""
# Create a dedicated logger
logger = logging.getLogger("Orchestrator logger")
logger.setLevel(logging.DEBUG)
logger.propagate = False # prevent log messages from being passed to the root logger
# Clear any existing handlers (if reconfiguring)
if logger.hasHandlers():
logger.handlers.clear()
# Create a session-specific directory for log files
base_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), "logs")
session_path = os.path.join(base_path, session_name)
try:
if not os.path.exists(session_path):
os.makedirs(session_path)
except OSError as err:
logger.error(f"Could not create log directory ({err}). Logs may not be saved.")
# Set up file handlers for each logging level
for lvl, name in lvl_name.items():
file_name = os.path.join(session_path, f"{session_name}_{name}.log")
logger.addHandler(get_file_handler(file_name, lvl))
# Add stream (console) handler with the desired level and format
logger.addHandler(get_stream_handler(stream_lvl))
return logger
# Create a module-level logger that can be imported as StandardLogger
StandardLogger = get_standard_logger()
# Optionally, define __all__ to restrict module exports
__all__ = ['StandardLogger', 'get_standard_logger']
if __name__ == "__main__":
test_logger=StandardLogger
test_logger.debug("Hello World")
test_logger.info("the end is near")
test_logger.warning("please prepare for the end!")
test_logger.error("Goodbye cruel world :-(")