-
Notifications
You must be signed in to change notification settings - Fork 6.3k
Expand file tree
/
Copy pathlog_manager.py
More file actions
63 lines (51 loc) · 2 KB
/
Copy pathlog_manager.py
File metadata and controls
63 lines (51 loc) · 2 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
import threading
from typing import Dict
from log_message import LogMessage
from log_appender import LogAppender
from async_log_processor import AsyncLogProcessor
from log_formatter import LogFormatter
from log_appender import ConsoleAppender, FileAppender
from logger import Logger
class LogManager:
_instance = None
_lock = threading.Lock()
def __init__(self):
if LogManager._instance is not None:
raise Exception("This class is a singleton!")
self.loggers: Dict[str, 'Logger'] = {}
self.root_logger = Logger("root", None)
self.loggers["root"] = self.root_logger
self.processor = AsyncLogProcessor()
@staticmethod
def get_instance():
if LogManager._instance is None:
with LogManager._lock:
if LogManager._instance is None:
LogManager._instance = LogManager()
return LogManager._instance
def get_logger(self, name: str) -> 'Logger':
if name not in self.loggers:
self.loggers[name] = self._create_logger(name)
return self.loggers[name]
def _create_logger(self, name: str) -> 'Logger':
if name == "root":
return self.root_logger
last_dot = name.rfind('.')
parent_name = "root" if last_dot == -1 else name[:last_dot]
parent = self.get_logger(parent_name)
return Logger(name, parent)
def get_root_logger(self) -> 'Logger':
return self.root_logger
def get_processor(self) -> AsyncLogProcessor:
return self.processor
def shutdown(self):
# Stop the processor first to ensure all logs are written
self.processor.stop()
# Then, close all appenders
all_appenders = set()
for logger in self.loggers.values():
for appender in logger.get_appenders():
all_appenders.add(appender)
for appender in all_appenders:
appender.close()
print("Logging framework shut down gracefully.")