мета-данные страницы
  •  

Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

Следующая версия
Предыдущая версия
lib.py:aw_log:api [30.10.2024 16:03] – создано awgurlib.py:aw_log:api [03.11.2024 16:45] (текущий) awgur
Строка 1: Строка 1:
 ====== Общее ====== ====== Общее ======
  
-Каждый модуль может (и должен) иметь свой собственный объект класса журналирования. Получение этого объекта можно выполнить через передачу его параметром либо через получение общей функцией, определённой на уровне приложения (каждый модуль может импортировать и выполнить данную общую функцию). У объекта обязательно задаётся префикс, идентифицирующий его (и его события) в общем журнале.+Каждый модуль может (и должен) иметь свой собственный объект класса журналирования. Получение этого объекта можно выполнить через передачу его параметром либо через получение общей функцией, определённой на уровне приложения (каждый модуль может импортировать и выполнить данную общую функцию). Для инициализации данного объекта применяется конструктор определённого класса, который зависит от канала журналирования, выбранного разработчиком. Работа с ними рассматривается отдельно. 
 + 
 +У объекта обязательно задаётся префикс, идентифицирующий его (и его события) в общем журнале. Для корневого объекта журнала он может не задаваться, однако в этом случае он принимает значение ''main''
 + 
 + 
 +====== alert(), err(), warn(), debug() ====== 
 + 
 +Данные методы позволяют зарегистрировать в журнале события с соответствующим уровнем важности. 
 + 
 +Распределение методов дано в таблице 
 + 
 +^ Уровень важности ^ Метод ^ 
 +| ''LOG_DEBUG'' | ''debug()''
 +| ''LOG_WARNING'' | ''warn()''
 +| ''LOG_ERR'' | ''err()''
 +| ''LOG_ALERT'' | ''alert()''
 + 
 +Все методы вызываются абсолютно идентично. Рассмотрим сигнатуру на примере ''err()'' 
 + 
 +<code> 
 +obj.err(msg) 
 +</code> 
 + 
 +Метод ничего не возвращает. 
 + 
 +^ Параметр ^ Тип ^ Описание ^ 
 +| ''msg'' | ''str'' | Регистрируемое сообщение | 
 + 
 + 
 +====== Регистрация информационных событий ====== 
 + 
 +Для регистрации событий и записи сообщений на уровне ''LOG_INFO'' следует вызвать сам объект журнала: 
 +<code python> 
 +log = SysLog() 
 +log('Информационное сообщение'
 +</code> 
 + 
 +Сигнатура вызова метода аналогична [[#alert_err_warn_debug|остальным методам]] 
 + 
 + 
 +====== sub_log() ====== 
 + 
 +Метод возвращает объект журнала аналогичного типа. 
 + 
 +При этом префикс, заданный при вызове метода, добавляется к родительскому по схеме: 
 +<code bash> 
 +${parent_prefix}/${child_prefix} 
 +</code> 
 + 
 +Удобно для передачи объекта потомкам или рабочим процессам. 
 + 
 +<code> 
 +obj.sub_log(name) 
 +</code> 
 + 
 +**Возвращает:** Объект журнала с тем же классом что и вызывающий объект, но с дополненным префиксом 
 + 
 +^ Параметр ^ Тип ^ Описание ^ 
 +| ''name'' | ''str'' | Идентификатор потомка, добавляемый к префиксу родителя в создаваемом объекте журнала | 
 + 
 + 
 +====== get_timing() ====== 
 + 
 +Возвращает [[.:timer|таймер]] для выполнения измерения времени. 
 + 
 +<code> 
 +obj.get_timing([name]) 
 +</code> 
 + 
 +**Возвращает:** Объект класса ''Timing'' 
 + 
 +^ Параметр ^ Тип ^ Описание ^ 
 +| ''name'' | ''str'' | Идентификатор таймера, если не указан, выводится не будет | 
 + 
 + 
 +====== excpt() ====== 
 + 
 +Обработка исключений. 
 + 
 +Данная обработка полезна в том смысле, что исключение несёт в себе множество дополнительной информации, которую хотелось бы поместить в журнал: 
 +  * Тип исключения 
 +  * Трассировка стека вызовов 
 + 
 +И не ломать при этом структуру журнала, чтобы всё это не выглядело как стандартная простынь ошибки Java или иного ООП, где сложно понять где начало и где конец. 
 + 
 +<code> 
 +obj.excpt(msg, [e_class], [e_obj], [e_tb], [stack_skip]): 
 +</code> 
 + 
 +Метод ничего не возвращает 
 + 
 +^ Параметр ^ Тип ^ Описание ^ 
 +| ''msg'' | ''str'' | Сообщение. Оно выводится перед результатом разбора элементов исключения и позволяет определиться с ситуацией, в которой оно произошло. | 
 +| ''e_class'' | Класс потомок от ''Exception()'' | Класс исключения. Нужен только при применении метода в рамках менеджера контекста или иного средства отложенной обработки исключений. | 
 +| ''e_obj'' | Объект класса ''e_class'', заданного выще | Объект исключения. Требуется в случаях аналогичных ''e_class''. | 
 +| ''e_tb'' | ''tuple'' | Стек вызова в момент исключения. Требуется в случаях аналогичных ''e_class''. | 
 +| ''stack_skip'' | ''int'' | Количество вызовов в стеке, которое необходимо скрыть. Эта возможность относится не к стеку, выданному исключением, а второй части стека, который строит сам метод относительно главной процедуры приложения. Это полезно для понимания положения самого обработчика исключения в приложении. То есть, этот параметр позволяет скрыть из логов некоторое количество вызовов, если они не желательны или не важны для понимания источника ошибки. | 
 + 
 +Пример. Для кода: 
 +<code python> 
 +log = StderrLog() 
 + 
 +try: 
 +    1 / 0 
 +     
 +except: 
 +    log.excpt('Ошибка'
 +</code> 
 + 
 +Будет сгенерирован вывод подобный данному: 
 +<code> 
 +Mon Jan 01 00:00:23 1970 | # main | Ошибка 
 +Mon Jan 01 00:00:23 1970 | # main | --- EXCEPTION --- 
 +Mon Jan 01 00:00:23 1970 | # main |  ZeroDivisionError (division by zero) 
 +Mon Jan 01 00:00:23 1970 | # main | --- TRACEBACK --- 
 +Mon Jan 01 00:00:23 1970 | # main | File: <input>, line 2 in <module> 
 +Mon Jan 01 00:00:23 1970 | # main |     
 +Mon Jan 01 00:00:23 1970 | # main | >>> Exception Handler <<< 
 +Mon Jan 01 00:00:23 1970 | # main | File: ./pydevconsole.py, line 364 in runcode 
 +Mon Jan 01 00:00:23 1970 | # main |    coro = func() 
 +Mon Jan 01 00:00:23 1970 | # main | File: /usr/lib/python3.12/code.py, line 74 in runsource 
 +Mon Jan 01 00:00:23 1970 | # main |    self.runcode(code) 
 +Mon Jan 01 00:00:23 1970 | # main | File: ./_pydev_bundle/pydev_console_types.py, line 35 in run 
 +Mon Jan 01 00:00:23 1970 | # main |    self.more = self.interpreter.runsource(text, '<input>', symbol) 
 +Mon Jan 01 00:00:23 1970 | # main | File: ./pydevconsole.py, line 93 in do_add_exec 
 +Mon Jan 01 00:00:23 1970 | # main |    command.run() 
 +Mon Jan 01 00:00:23 1970 | # main | File: ./_pydev_bundle/pydev_code_executor.py, line 109 in add_exec 
 +Mon Jan 01 00:00:23 1970 | # main |    more, exception_occurred = self.do_add_exec(code_fragment) 
 +Mon Jan 01 00:00:23 1970 | # main | File: ./pydevconsole.py, line 287 in process_exec_queue 
 +Mon Jan 01 00:00:23 1970 | # main |    interpreter.add_exec(code_fragment) 
 +Mon Jan 01 00:00:23 1970 | # main | File: ./pydevconsole.py, line 498 in start_client 
 +Mon Jan 01 00:00:23 1970 | # main |    process_exec_queue(interpreter) 
 +Mon Jan 01 00:00:23 1970 | # main | File: ./pydevconsole.py, line 570 in <module> 
 +Mon Jan 01 00:00:23 1970 | # main |    pydevconsole.start_client(host, port) 
 +Mon Jan 01 00:00:23 1970 | # main | --- END EXCEPTION --- 
 +</code> 
 + 
 +Как уже отмечалось, метка ''>>> Exception Handler <<<'' позволяет определить вызов метода ''excpt()'' относительно всего приложения и более точно определить источник проблемы.