logger refactoring, adapted to new parallel code

This commit is contained in:
Lorenzo Volpi 2023-12-06 10:02:01 +01:00
parent 0d7f31c0cd
commit 2e8af90543
2 changed files with 14 additions and 137 deletions

View File

@ -5,137 +5,6 @@ import threading
from pathlib import Path from pathlib import Path
from typing import List from typing import List
class Logger:
__logger_file = "quacc.log"
__logger_name = "queue_logger"
__manager = None
__queue = None
__thread = None
__setup = False
__handlers = []
@classmethod
def __logger_listener(cls, q):
while True:
record = q.get()
if record is None:
break
root = logging.getLogger("listener")
root.handle(record)
@classmethod
def setup(cls):
if cls.__setup:
return
# setup root
root = logging.getLogger("listener")
root.setLevel(logging.DEBUG)
rh = logging.FileHandler(cls.__logger_file, mode="a")
rh.setLevel(logging.DEBUG)
root.addHandler(rh)
# setup logger
if cls.__manager is None:
cls.__manager = multiprocessing.Manager()
if cls.__queue is None:
cls.__queue = cls.__manager.Queue()
logger = logging.getLogger(cls.__logger_name)
logger.setLevel(logging.DEBUG)
qh = logging.handlers.QueueHandler(cls.__queue)
qh.setLevel(logging.DEBUG)
qh.setFormatter(
logging.Formatter(
fmt="%(asctime)s| %(levelname)-8s %(message)s",
datefmt="%d/%m/%y %H:%M:%S",
)
)
logger.addHandler(qh)
# start listener
cls.__thread = threading.Thread(
target=cls.__logger_listener,
args=(cls.__queue,),
)
cls.__thread.start()
cls.__setup = True
@classmethod
def add_handler(cls, path: Path):
root = logging.getLogger("listener")
rh = logging.FileHandler(path, mode="a")
rh.setLevel(logging.DEBUG)
cls.__handlers.append(rh)
root.addHandler(rh)
root.info("-" * 100)
@classmethod
def clear_handlers(cls):
root = logging.getLogger("listener")
for h in cls.__handlers:
root.removeHandler(h)
cls.__handlers.clear()
@classmethod
def queue(cls):
if not cls.__setup:
cls.setup()
return cls.__queue
@classmethod
def logger(cls):
if not cls.__setup:
cls.setup()
return logging.getLogger(cls.__logger_name)
@classmethod
def close(cls):
if cls.__setup and cls.__thread is not None:
cls.__queue.put(None)
cls.__thread.join()
# cls.__manager.close()
class SubLogger:
__queue = None
__setup = False
@classmethod
def setup(cls, q):
if cls.__setup:
return
cls.__queue = q
# setup root
root = logging.getLogger()
root.setLevel(logging.DEBUG)
rh = logging.handlers.QueueHandler(q)
rh.setLevel(logging.DEBUG)
rh.setFormatter(
logging.Formatter(
fmt="%(asctime)s| %(levelname)-12s%(message)s",
datefmt="%d/%m/%y %H:%M:%S",
)
)
root.addHandler(rh)
cls.__setup = True
@classmethod
def logger(cls):
if not cls.__setup:
return None
return logging.getLogger()
_logger_manager = None _logger_manager = None

View File

@ -1,15 +1,18 @@
from traceback import print_exception as traceback from traceback import print_exception as traceback
import quacc.evaluation.comp as comp import quacc.evaluation.comp as comp
# from quacc.logger import Logger
from quacc import logger
from quacc.dataset import Dataset from quacc.dataset import Dataset
from quacc.environment import env from quacc.environment import env
from quacc.evaluation.estimators import CE from quacc.evaluation.estimators import CE
from quacc.logger import Logger
from quacc.utils import create_dataser_dir from quacc.utils import create_dataser_dir
def estimate_comparison(): def estimate_comparison():
log = Logger.logger() # log = Logger.logger()
log = logger.logger()
for conf in env.load_confs(): for conf in env.load_confs():
dataset = Dataset( dataset = Dataset(
env.DATASET_NAME, env.DATASET_NAME,
@ -21,7 +24,8 @@ def estimate_comparison():
dataset.name, dataset.name,
update=env.DATASET_DIR_UPDATE, update=env.DATASET_DIR_UPDATE,
) )
Logger.add_handler(env.OUT_DIR / f"{dataset.name}.log") # Logger.add_handler(env.OUT_DIR / f"{dataset.name}.log")
logger.add_handler(env.OUT_DIR / f"{dataset.name}.log")
try: try:
dr = comp.evaluate_comparison( dr = comp.evaluate_comparison(
dataset, dataset,
@ -32,18 +36,22 @@ def estimate_comparison():
log.error(f"Evaluation over {dataset.name} failed. Exception: {e}") log.error(f"Evaluation over {dataset.name} failed. Exception: {e}")
traceback(e) traceback(e)
Logger.clear_handlers() # Logger.clear_handlers()
logger.clear_handlers()
def main(): def main():
log = Logger.logger() # log = Logger.logger()
log = logger.setup_logger()
try: try:
estimate_comparison() estimate_comparison()
except Exception as e: except Exception as e:
log.error(f"estimate comparison failed. Exception: {e}") log.error(f"estimate comparison failed. Exception: {e}")
traceback(e) traceback(e)
Logger.close() # Logger.close()
logger.logger_manager().close()
if __name__ == "__main__": if __name__ == "__main__":