DrugDesign Data Analysis
Module of the DrugDesign project responsible for loading and pre-processing data from ChEMBL and PubChem
All Classes Namespaces Files Functions Variables Pages
verbose_logger.VerboseLogger Class Reference
Collaboration diagram for verbose_logger.VerboseLogger:

Public Member Functions

 __init__ (self, Logger logger, LogMode log_mode, int message_ljust, str exceptions_file, TextIO|TextIOWrapper standard_output=sys.stdout)
 
Any __getattr__ (self, str name)
 
 FromConfig (cls)
 
 Log (self, str level, str message, LogMode log_mode=LogMode.RETICENTLY)
 
 LogException (self, Exception exception)
 
 RestoreFormat (self, int index)
 
int UpdateFormat (self, str logger_label, str logger_color)
 

Private Member Functions

 __Configure (self, TextIO|Any|None output=None)
 
Callable __LogMethod (self, str level)
 

Private Attributes

 __colors
 
 __exceptions_file
 
 __format
 
 __labels
 
 __log_mode
 
 __logger
 
 __message_ljust
 
 __standard_output
 

Static Private Attributes

list __colors = []
 
str __exceptions_file
 
Callable __format [[dict], str]
 
list __labels = []
 
LogMode __log_mode
 
Logger __logger
 
int __message_ljust
 
TextIOWrapper __standard_output | TextIO | Any
 

Detailed Description

Реализует расширенное логирование с возможностью настройки уровня детализации, формата сообщений и записи исключений в файл.

Constructor & Destructor Documentation

◆ __init__()

verbose_logger.VerboseLogger.__init__ ( self,
Logger logger,
LogMode log_mode,
int message_ljust,
str exceptions_file,
TextIO | TextIOWrapper standard_output = sys.stdout )
Инициализирует класс VerboseLogger. Args: logger (Logger): объект логгера loguru. log_mode (LogMode): режим логирования (RETICENTLY или VERBOSELY). message_ljust (int): ширина поля для выравнивания сообщений. exceptions_file (str): путь к файлу для записи исключений. standard_output (TextIO | TextIOWrapper, optional): вывод.
62 ):
63 """
64 Инициализирует класс VerboseLogger.
65
66 Args:
67 logger (Logger): объект логгера loguru.
68 log_mode (LogMode): режим логирования (RETICENTLY или VERBOSELY).
69 message_ljust (int): ширина поля для выравнивания сообщений.
70 exceptions_file (str): путь к файлу для записи исключений.
71 standard_output (TextIO | TextIOWrapper, optional): вывод.
72 """
73
74 self.__logger = logger
75 self.__log_mode = log_mode
76
77 self.__message_ljust = message_ljust
78 self.__exceptions_file = exceptions_file
79
80 self.__standard_output = standard_output
81

Member Function Documentation

◆ __Configure()

verbose_logger.VerboseLogger.__Configure ( self,
TextIO | Any | None output = None )
private
Настраивает вывод логгера. Args: output (TextIO | Any | None, optional): поток вывода.
242 def __Configure(self, output: TextIO | Any | None = None):
243 """
244 Настраивает вывод логгера.
245
246 Args:
247 output (TextIO | Any | None, optional): поток вывода.
248 """
249
250 # если вывод не задан, используем стандартный.
251 if output is None:
252 output = self.__standard_output
253
254 # удаляем предыдущие обработчики.
255 self.__logger.remove()
256 # добавляем новый обработчик с заданным форматом и выводом.
257 self.__logger.add(sink=output, format=self.__format)
258
Here is the caller graph for this function:

◆ __getattr__()

Any verbose_logger.VerboseLogger.__getattr__ ( self,
str name )
Перехватывает обращение к атрибутам класса. Если это методы логирования (debug, info и т.д.), возвращает функцию- обертку для логирования. В противном случае, возвращает атрибут из базового логгера loguru. Args: name (str): имя атрибута. Returns: Any: атрибут или функция-обертка для логирования.
287 def __getattr__(self, name: str) -> Any:
288 """
289 Перехватывает обращение к атрибутам класса.
290
291 Если это методы логирования (debug, info и т.д.), возвращает функцию-
292 обертку для логирования. В противном случае, возвращает атрибут из
293 базового логгера loguru.
294
295 Args:
296 name (str): имя атрибута.
297
298 Returns:
299 Any: атрибут или функция-обертка для логирования.
300 """
301
302 # проверяем, является ли имя одним из уровней логирования.
303 if name in [string.lower() for string in loguru.logger._core.levels.keys()]: # type: ignore
304 # возвращаем обертку для метода логирования.
305 return self.__LogMethod(name)
306
307 # иначе возвращаем атрибут из базового логгера.
308 else: # другие методы loguru.logger
309 return getattr(self.__logger, name)
310
311
312# MARK: v_logger
Here is the call graph for this function:

◆ __LogMethod()

Callable verbose_logger.VerboseLogger.__LogMethod ( self,
str level )
private
Создает функцию-обертку для логирования сообщений с определенным уровнем. Args: level (str): уровень логирования. Returns: Callable: функция-обертка для логирования.
259 def __LogMethod(self, level: str) -> Callable:
260 """
261 Создает функцию-обертку для логирования сообщений с определенным уровнем.
262
263 Args:
264 level (str): уровень логирования.
265
266 Returns:
267 Callable: функция-обертка для логирования.
268 """
269
270 # получаем имя уровня в верхнем регистре.
271 level_name = level.upper()
272
273 def Wrapper(
274 message: str = f"{'-' * (self.__message_ljust - 1)}",
275 log_mode: LogMode = LogMode.RETICENTLY,
276 ):
277 # в том случае, если сообщение состоит из одного символа, превращаем в полосу.
278 if len(message) == 1:
279 message = f"{f'{message}' * (self.__message_ljust - 1)}"
280
281 # вызываем метод Log с заданным уровнем и сообщением.
282 self.Log(level_name, message, log_mode)
283
284 # возвращаем функцию-обертку.
285 return Wrapper
286
Here is the call graph for this function:
Here is the caller graph for this function:

◆ FromConfig()

verbose_logger.VerboseLogger.FromConfig ( cls)
Создает экземпляр VerboseLogger на основе конфигурации. Returns: VerboseLogger: экземпляр класса.
83 def FromConfig(cls):
84 """
85 Создает экземпляр VerboseLogger на основе конфигурации.
86
87 Returns:
88 VerboseLogger: экземпляр класса.
89 """
90
91 # получаем конфигурацию для verbose логгера.
92 v_logger_config = config["Utils"]["VerboseLogger"]
93
94 # создаем и возвращаем экземпляр класса.
95 return cls(
96 loguru.logger,
97 LogMode.VERBOSELY if v_logger_config["verbose_print"] else LogMode.RETICENTLY,
98 v_logger_config["message_ljust"],
99 v_logger_config["exceptions_file"],
100 v_logger_config["exceptions_file"]
101 if v_logger_config["output_to_exceptions_file"]
102 else sys.stdout,
103 )
104

◆ Log()

verbose_logger.VerboseLogger.Log ( self,
str level,
str message,
LogMode log_mode = LogMode.RETICENTLY )
Логирует сообщение с указанным уровнем. Args: level (str): уровень логирования. message (str): сообщение для логирования. log_mode (LogMode, optional): режим логирования. Raises: NotImplementedError: если не установлен формат логгера.
219 def Log(self, level: str, message: str, log_mode: LogMode = LogMode.RETICENTLY):
220 """
221 Логирует сообщение с указанным уровнем.
222
223 Args:
224 level (str): уровень логирования.
225 message (str): сообщение для логирования.
226 log_mode (LogMode, optional): режим логирования.
227
228 Raises:
229 NotImplementedError: если не установлен формат логгера.
230 """
231
232 # проверяем, установлен ли формат логгера.
233 if len(self.__labels) == 0:
234 raise NotImplementedError(
235 "VerboseLogger: logger format is not set. Call 'logger.UpdateFormat' first!"
236 )
237
238 # логируем сообщение, если режим логирования соответствует.
239 if self.__log_mode == LogMode.VERBOSELY or log_mode == LogMode.RETICENTLY:
240 self.__logger.log(level, message)
241
Here is the caller graph for this function:

◆ LogException()

verbose_logger.VerboseLogger.LogException ( self,
Exception exception )
Логирует исключение в консоль и записываем его в файл. Args: exception (Exception): объект исключения. Raises: NotImplementedError: если не установлен формат логгера.
180 def LogException(self, exception: Exception):
181 """
182 Логирует исключение в консоль и записываем его в файл.
183
184 Args:
185 exception (Exception): объект исключения.
186
187 Raises:
188 NotImplementedError: если не установлен формат логгера.
189 """
190
191 # проверяем, установлен ли формат логгера.
192 if len(self.__labels) == 0:
193 raise NotImplementedError(
194 "VerboseLogger: logger format is not set. Call 'logger.UpdateFormat' first."
195 )
196
197 # логируем исключение в консоль.
198 self.__logger.error(f"{exception}")
199
200 try:
201 # настраиваем логгер для записи в файл исключений.
202 self.__Configure(self.__exceptions_file)
203
204 # логируем traceback в файл исключений.
205 self.__logger.error(
206 f"{re.sub(r'"(.*?)\",\s+line\s+(\d+)', r'\1:\2', traceback.format_exc())}"
207 )
208
209 # если не удалось записать исключение в файл.
210 except Exception as extra_exception:
211 self.__logger.error(
212 f"VerboseLogger: failed to write exception to file: {extra_exception}."
213 )
214
215 # в любом случае восстанавливаем исходную конфигурацию логгера.
216 finally:
217 self.__Configure()
218
Here is the call graph for this function:

◆ RestoreFormat()

verbose_logger.VerboseLogger.RestoreFormat ( self,
int index )
Восстанавливает формат логгера по индексу. Args: index (int): индекс одного из предыдущих форматов. Raises: NotImplementedError: если не установлен формат логгера. IndexError: если index выходит за границы.
134 def RestoreFormat(self, index: int):
135 """
136 Восстанавливает формат логгера по индексу.
137
138 Args:
139 index (int): индекс одного из предыдущих форматов.
140
141 Raises:
142 NotImplementedError: если не установлен формат логгера.
143 IndexError: если index выходит за границы.
144 """
145
146 # проверяем, установлен ли формат логгера.
147 if len(self.__labels) == 0:
148 raise NotImplementedError(
149 "VerboseLogger: logger format is not set. Call 'logger.UpdateFormat' first."
150 )
151
152 # проверяем, не выходит ли index за границы.
153 if index >= len(self.__labels):
154 raise IndexError(
155 f"VerboseLogger: RestoreFormat: index ({index}) is out of "
156 f"range [0, {len(self.__labels) - 1}]."
157 )
158
159 # если текущий формат уже установлен, предупреждаем и выходим.
160 if index == len(self.__labels) - 1:
161 self.__logger.warning("Current format is already set.")
162 return
163
164 # задаем формат вывода.
165 self.__format = (
166 lambda record: "[{time:DD.MM.YYYY HH:mm:ss}] "
167 + f"<{self.__colors[index]}>{self.__labels[index]}:"
168 f"</{self.__colors[index]}> "
169 + f"{record['message']} ".ljust(self.__message_ljust)
170 + f"[<level>{record['level']}</level>]\n"
171 )
172
173 # обрезаем списки заголовков и цветов.
174 self.__labels = self.__labels[: index + 1]
175 self.__colors = self.__colors[: index + 1]
176
177 # настраиваем логгер.
178 self.__Configure()
179

◆ UpdateFormat()

int verbose_logger.VerboseLogger.UpdateFormat ( self,
str logger_label,
str logger_color )
Обновляет формат вывода логирования. Args: logger_label (str): текст заголовка для логирования. logger_color (str): цвет заголовка для логирования. Returns: int: индекс текущего формата.
105 def UpdateFormat(self, logger_label: str, logger_color: str) -> int:
106 """
107 Обновляет формат вывода логирования.
108
109 Args:
110 logger_label (str): текст заголовка для логирования.
111 logger_color (str): цвет заголовка для логирования.
112
113 Returns:
114 int: индекс текущего формата.
115 """
116
117 # задаем формат вывода.
118 self.__format = (
119 lambda record: "[{time:DD.MM.YYYY HH:mm:ss}] "
120 + f"<{logger_color}>{logger_label}:</{logger_color}> "
121 + f"{record['message']} ".ljust(self.__message_ljust)
122 + f"[<level>{record['level']}</level>]\n"
123 )
124
125 # добавляем заголовок и цвет в списки.
126 self.__labels.append(logger_label)
127 self.__colors.append(logger_color)
128
129 # настраиваем логгер.
130 self.__Configure()
131
132 return len(self.__labels) - 1
133

Member Data Documentation

◆ __colors [1/2]

list verbose_logger.VerboseLogger.__colors = []
staticprivate

◆ __colors [2/2]

verbose_logger.VerboseLogger.__colors
private

◆ __exceptions_file [1/2]

str verbose_logger.VerboseLogger.__exceptions_file
staticprivate

◆ __exceptions_file [2/2]

verbose_logger.VerboseLogger.__exceptions_file
private

◆ __format [1/2]

Callable verbose_logger.VerboseLogger.__format [[dict], str]
staticprivate

◆ __format [2/2]

verbose_logger.VerboseLogger.__format
private

◆ __labels [1/2]

list verbose_logger.VerboseLogger.__labels = []
staticprivate

◆ __labels [2/2]

verbose_logger.VerboseLogger.__labels
private

◆ __log_mode [1/2]

LogMode verbose_logger.VerboseLogger.__log_mode
staticprivate

◆ __log_mode [2/2]

verbose_logger.VerboseLogger.__log_mode
private

◆ __logger [1/2]

Logger verbose_logger.VerboseLogger.__logger
staticprivate

◆ __logger [2/2]

verbose_logger.VerboseLogger.__logger
private

◆ __message_ljust [1/2]

int verbose_logger.VerboseLogger.__message_ljust
staticprivate

◆ __message_ljust [2/2]

verbose_logger.VerboseLogger.__message_ljust
private

◆ __standard_output [1/2]

TextIOWrapper verbose_logger.VerboseLogger.__standard_output | TextIO | Any
staticprivate

◆ __standard_output [2/2]

verbose_logger.VerboseLogger.__standard_output
private

The documentation for this class was generated from the following file: