Coverage for credoai/utils/logging.py: 76%
55 statements
« prev ^ index » next coverage.py v7.1.0, created at 2023-02-13 21:56 +0000
« prev ^ index » next coverage.py v7.1.0, created at 2023-02-13 21:56 +0000
1from collections import deque
2from io import StringIO
3from logging import FileHandler, Formatter, Handler, StreamHandler, getLogger
4from os.path import join
5from sys import stdout
8class TailLogHandler(Handler):
9 def __init__(self, log_queue):
10 Handler.__init__(self)
11 self.log_queue = log_queue
13 def emit(self, record):
14 self.log_queue.append(self.format(record))
17class TailLogger(object):
18 def __init__(self, maxlen):
19 self._log_queue = deque(maxlen=maxlen)
20 self._log_handler = TailLogHandler(self._log_queue)
22 def contents(self):
23 return "\n".join(self._log_queue)
25 @property
26 def log_handler(self):
27 return self._log_handler
30class Logger:
31 def __init__(
32 self, name, path=None, record_stream=True, logging_level="info", formatter=None
33 ):
34 self.file_path = None
35 self.stream = None
36 if formatter is None:
37 formatter = Formatter(
38 "%(asctime)s - %(name)s - %(levelname)s - %(message)s"
39 )
40 self.formatter = formatter
41 self.logger = self.setup_logger(name, logging_level)
42 self.log_capture_string = StringIO()
43 if record_stream:
44 self.stream = self.setup_stream()
45 if path:
46 self.file_path = join(path, f"{name}.log")
47 self.setup_file()
49 def setup_logger(self, name, logging_level):
50 logger = getLogger(name)
51 handler = StreamHandler(stdout)
52 handler.setFormatter(self.formatter)
53 logger.addHandler(handler)
54 logger.setLevel(logging_level)
55 return logger
57 def setup_stream(self, tail_length=100):
58 tail = TailLogger(tail_length)
59 log_handler = tail.log_handler
60 log_handler.setFormatter(self.formatter)
61 self.logger.addHandler(log_handler)
62 return tail
64 def setup_file(self):
65 file_handler = FileHandler(self.file_path)
66 file_handler.setFormatter(self.formatter)
67 self.logger.addHandler(file_handler)
70def setup_logger(name="lens", path=None, record_stream=False, logging_level="INFO"):
71 tmp = Logger(name, path, record_stream, logging_level)
72 return tmp.logger, tmp.stream
75global_logger, global_tail = setup_logger(path=".")