Пропустить логи из импортированных модулей - PullRequest
0 голосов
/ 13 апреля 2020

Пытаюсь создать класс логгеров для моей посылки, и я близок к тому, чтобы биться головой об стену. Независимо от того, что я делаю, регистратор также будет регистрировать сообщения от внешних модулей. Вот мой класс:

import logging
import os
import sys
from pathlib import Path
from datetime import date


class Logger:

    # Variables
    log_path = ''
    log_format = '%(asctime)s %(levelname)-8s %(message)s'
    date_format = '%Y-%m-%d'
    datetime_format = '%Y-%m-%d %H:%M:%S'
    logger = None

    # CTOR
    def __init__(self, base_path):
        self.log_path = os.path.join(base_path, "logs/")
        Path(self.log_path).mkdir(parents=True, exist_ok=True)
        logfile = os.path.join(self.log_path, date.today().strftime(self.date_format) + ".log")
        logging.basicConfig(
            filename=logfile,
            level=logging.WARNING,
            filemode='a',
            format=self.log_format,
            datefmt=self.datetime_format)
        self.logger = logging.getLogger('bleservice')
        self.logger.setLevel(logging.INFO)

    # Methods
    def log_information(self, message):
        self.logger.info(message)
        print('logged info')

    def log_error(self, message):
        self.logger.error(message)
        print('logged error into')

    def log_exception(self, exception):
        self.logger.exception(message)
        print('logged exception into')

По сути, я хочу записывать предупреждения и ошибки от внешних модулей и всю информацию из моего пакета в один и тот же файл. Тем не менее, он также регистрирует информационные сообщения от внешних модулей, благодаря чему размер моего файла журнала увеличивается до нескольких ГБ. Что я здесь не так делаю?

РЕДАКТИРОВАТЬ: Чтобы было понятнее, мне нужно сделать следующее:

  1. Все журналы из моего собственного модуля, начиная с уровня INFO, должны войти в систему. файл
  2. Все журналы от внешних модулей, начиная с уровня WARNING, также должны войти в файл.

В настоящее время все журналы, начиная с INFO из моего модуля И внешние модули, регистрируются в файл.

1 Ответ

1 голос
/ 13 апреля 2020

Сначала позвольте мне объяснить, почему вы видите поведение, которое вы получаете. Когда вы вызываете basicConfig с аргументом level и filename, это сделает для вас две вещи. Он установит уровень логгера root на заданный уровень и создаст logging.FileHandler с уровнем NOTSET, который будет присоединен к логгеру root.

Теперь, когда некоторые модуль logger создает журнал и имеет propagate значение true (по умолчанию), он будет отправлять свои журналы напрямую своим обработчикам предков . Важно понимать, что это обходит регистраторов предков и их уровень. Таким образом, модули видят root в качестве своего предка и отправляют свои журналы напрямую подключенному обработчику, у которого не установлен уровень и, следовательно, разрешают все журналы.

Вам нужно либо установить уровень обработчика, который basicConfig создает для WARNING и добавьте еще один обработчик с уровнем INFO к вашему bleservice регистратору, или вы должны установить уровень регистраторов модуля на WARNING.

...