QuAcc/quacc/logger.py

119 lines
2.7 KiB
Python
Raw Normal View History

2023-10-28 00:56:49 +02:00
import logging
import logging.handlers
import multiprocessing
import threading
class Logger:
__logger_file = "quacc.log"
__logger_name = "queue_logger"
2023-10-28 16:14:37 +02:00
__manager = None
2023-10-28 00:56:49 +02:00
__queue = None
__thread = None
__setup = False
@classmethod
def __logger_listener(cls, q):
while True:
record = q.get()
if record is None:
break
2023-10-28 16:14:37 +02:00
root = logging.getLogger("listener")
2023-10-28 00:56:49 +02:00
root.handle(record)
@classmethod
def setup(cls):
if cls.__setup:
return
# setup root
2023-10-28 16:14:37 +02:00
root = logging.getLogger("listener")
root.setLevel(logging.DEBUG)
2023-10-28 00:56:49 +02:00
rh = logging.FileHandler(cls.__logger_file, mode="a")
2023-10-28 16:14:37 +02:00
rh.setLevel(logging.DEBUG)
2023-10-28 00:56:49 +02:00
root.addHandler(rh)
2023-10-28 16:14:37 +02:00
root.info("-" * 100)
2023-10-28 00:56:49 +02:00
# setup logger
2023-10-28 16:14:37 +02:00
if cls.__manager is None:
cls.__manager = multiprocessing.Manager()
2023-10-28 00:56:49 +02:00
if cls.__queue is None:
2023-10-28 16:14:37 +02:00
cls.__queue = cls.__manager.Queue()
2023-10-28 00:56:49 +02:00
logger = logging.getLogger(cls.__logger_name)
logger.setLevel(logging.DEBUG)
qh = logging.handlers.QueueHandler(cls.__queue)
qh.setLevel(logging.DEBUG)
qh.setFormatter(
logging.Formatter(
2023-10-31 14:53:41 +01:00
fmt="%(asctime)s| %(levelname)-8s %(message)s",
2023-10-28 00:56:49 +02:00
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 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
2023-10-28 16:14:37 +02:00
def close(cls):
2023-10-28 00:56:49 +02:00
if cls.__setup and cls.__thread is not None:
2023-10-28 16:14:37 +02:00
cls.__queue.put(None)
2023-10-28 00:56:49 +02:00
cls.__thread.join()
2023-10-28 16:14:37 +02:00
# cls.__manager.close()
2023-10-28 00:56:49 +02:00
class SubLogger:
__queue = None
__setup = False
@classmethod
def setup(cls, q):
if cls.__setup:
return
cls.__queue = q
# setup root
root = logging.getLogger()
2023-10-28 16:14:37 +02:00
root.setLevel(logging.DEBUG)
2023-10-28 00:56:49 +02:00
rh = logging.handlers.QueueHandler(q)
2023-10-28 16:14:37 +02:00
rh.setLevel(logging.DEBUG)
2023-10-28 00:56:49 +02:00
rh.setFormatter(
logging.Formatter(
2023-10-31 17:06:57 +01:00
fmt="%(asctime)s| %(levelname)-12s%(message)s",
2023-10-28 00:56:49 +02:00
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()