Показаны различия между двумя версиями страницы.
Следующая версия | Предыдущая версия | ||
develop:pyton:logger [2022/12/03 05:21] admin создано |
develop:pyton:logger [2023/02/01 09:50] (текущий) admin |
||
---|---|---|---|
Строка 2: | Строка 2: | ||
+ | ===== Общее ===== | ||
+ | [[https:// | ||
+ | |||
+ | < | ||
+ | < | ||
+ | |||
+ | {{: | ||
+ | |||
+ | {{: | ||
+ | |||
+ | </ | ||
+ | |||
+ | |||
+ | ===== Применение ===== | ||
+ | [[https:// | ||
+ | [[https:// | ||
+ | |||
+ | Классы логгера наследуются, | ||
+ | |||
+ | Собсна структура конфига ниже, перечисляются форматтеры, | ||
+ | |||
+ | Конфиг можно хранить в отдельном файле, но тогда нет возможности использовать переменные, | ||
+ | |||
+ | Настройка целевого уровня задается и в loggers и в handlers, сначала фильтруется в первом, | ||
+ | |||
+ | <code json> | ||
+ | { | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | |||
+ | |||
+ | Для использования JSON нужен модуль [[https:// | ||
+ | |||
+ | |||
+ | < | ||
+ | < | ||
+ | Три типа логов: | ||
+ | * Общий | ||
+ | * Только ошибки | ||
+ | * Логирование спец событий, | ||
+ | |||
+ | |||
+ | Использование | ||
+ | <code python> | ||
+ | # | ||
+ | |||
+ | import loggers | ||
+ | |||
+ | logger = loggers.get_logger(' | ||
+ | usr_logger = loggers.get_logger(' | ||
+ | |||
+ | logger.info(" | ||
+ | logger.error(" | ||
+ | |||
+ | usr_logger.info(" | ||
+ | </ | ||
+ | |||
+ | |||
+ | Создание объекта логгера | ||
+ | <code python> | ||
+ | # | ||
+ | |||
+ | import os | ||
+ | import json | ||
+ | import logging | ||
+ | import logging.config | ||
+ | |||
+ | FOLDER_LOG = " | ||
+ | LOGGING_CONFIG_FILE = ' | ||
+ | |||
+ | |||
+ | def create_log_folder(folder=FOLDER_LOG): | ||
+ | if not os.path.exists(folder): | ||
+ | os.mkdir(folder) | ||
+ | |||
+ | |||
+ | def get_logger(name, | ||
+ | create_log_folder() | ||
+ | with open(LOGGING_CONFIG_FILE, | ||
+ | dict_config = json.load(f) | ||
+ | dict_config[" | ||
+ | logging.config.dictConfig(dict_config) | ||
+ | return logging.getLogger(name) | ||
+ | </ | ||
+ | |||
+ | |||
+ | Конфиг | ||
+ | <code xml> | ||
+ | { | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | }, | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | } | ||
+ | }, | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | }, | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | }, | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | } | ||
+ | }, | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | }, | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | |||
+ | |||
+ | ===== Примеры ===== | ||
+ | < | ||
+ | < | ||
+ | <code python> | ||
+ | import logging | ||
+ | from datetime import datetime | ||
+ | |||
+ | start_date = datetime.strftime(datetime.now(), | ||
+ | log_path = f" | ||
+ | |||
+ | # | ||
+ | log = logging.getLogger() | ||
+ | log.setLevel(logging.INFO) | ||
+ | fh = logging.FileHandler(filename=log_path) | ||
+ | fh.setLevel(logging.INFO) | ||
+ | formatter = logging.Formatter(fmt=' | ||
+ | fh.setFormatter(formatter) | ||
+ | log.addHandler(fh) | ||
+ | |||
+ | log.info(" | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | |||
+ | < | ||
+ | < | ||
+ | <code python> | ||
+ | import logging | ||
+ | |||
+ | logging.basicConfig( | ||
+ | level=logging.DEBUG, | ||
+ | filename = " | ||
+ | format = " | ||
+ | datefmt=' | ||
+ | ) | ||
+ | |||
+ | logging.info(' | ||
+ | </ | ||
+ | |||
+ | |||
+ | <code python> | ||
+ | import logging | ||
+ | |||
+ | logging.basicConfig(level=logging.INFO, | ||
+ | format=" | ||
+ | | ||
+ | x_vals = [2, | ||
+ | y_vals = [5, | ||
+ | |||
+ | for x_val,y_val in zip(x_vals, | ||
+ | x,y = x_val,y_val | ||
+ | logging.info(f" | ||
+ | try: | ||
+ | x/y | ||
+ | logging.info(f" | ||
+ | except ZeroDivisionError as err: | ||
+ | # | ||
+ | logging.error(" | ||
+ | </ | ||
+ | |||
+ | |||
+ | <code python> | ||
+ | import logging | ||
+ | from test_div import test_division | ||
+ | |||
+ | # получение пользовательского логгера и установка уровня логирования | ||
+ | py_logger = logging.getLogger(__name__) | ||
+ | py_logger.setLevel(logging.INFO) | ||
+ | |||
+ | # настройка обработчика и форматировщика в соответствии с нашими нуждами | ||
+ | py_handler = logging.FileHandler(f" | ||
+ | py_formatter = logging.Formatter(" | ||
+ | |||
+ | # добавление форматировщика к обработчику | ||
+ | py_handler.setFormatter(py_formatter) | ||
+ | # добавление обработчика к логгеру | ||
+ | py_logger.addHandler(py_handler) | ||
+ | |||
+ | py_logger.info(f" | ||
+ | |||
+ | x_vals = [2, | ||
+ | y_vals = [5, | ||
+ | |||
+ | for x_val,y_val in zip(x_vals, | ||
+ | x,y = x_val, y_val | ||
+ | # вызов test_division | ||
+ | test_division(x, | ||
+ | py_logger.info(f" | ||
+ | </ | ||
+ | |||
+ | </ | ||