Почему мои логи нижнего уровня не пишут в файл, а ошибки и выше делают?

Я создал небольшую функцию для настройки ведения журнала с обработчиком файлов для «всего» и smtphandler для ошибок и выше. Журналы ошибок записываются в файл журнала и правильно отправляются по электронной почте, но debug, info, notset этого не делают, даже если setlevel установлен на 0 для обработчика файлов. Почему это? Код ниже

#logsetup.py
import logging
import logging.handlers

def _setup_logger(name, log_file):
    """Function to setup logger"""

    logger = logging.getLogger(name)

    #Create Formatters
    file_formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
    mail_formatter = logging.Formatter('%(name)s - %(message)s')

    #Create handler, set formatting, set log level
    file_handler_obj = logging.FileHandler(log_file)
    file_handler_obj.setFormatter(file_formatter)
    file_handler_obj.setLevel(0)

    #Create handler, set formatting, set log level
    smtp_handler_obj = logging.handlers.SMTPHandler(mailhost=('smtp.gmail.com', 587),
                        fromaddr='[email protected]',
                        toaddrs='[email protected]',
                        subject='Error in Script',
                        credentials=('[email protected]', 'pwexample'),   #username, password
                        secure=())
    smtp_handler_obj.setFormatter(mail_formatter)
    smtp_handler_obj.setLevel(logging.ERROR)

    # add the handlers to logger
    logger.addHandler(smtp_handler_obj)
    logger.addHandler(file_handler_obj)

    return logger

#mytest.py
import time
import logsetup

if __name__ == '__main__':

    TEST_SETTINGS = config_funcs._get_config('TEST_SETTINGS')

    logtime = time.strftime('%Y%m%d') # -%H%M%S")
    log = logsetup._setup_logger('TEST', TEST_SETTINGS['logging_dir'] + 'Py_Log_%s.log' % logtime)

    log.error('Writes to log file and sends email')
    log.debug('Supposed to write to log file, does nothing.')

person D W    schedule 09.02.2019    source источник


Ответы (1)


По-видимому, для ведения журнала требуется собственный уровень ведения журнала, помимо обработчиков. Установка logger.setLevel(logging.DEBUG) непосредственно перед возвратом регистратора заставляет его работать правильно. Документация говорит

При создании средства ведения журнала его уровень устанавливается в значение NOTSET (что приводит к обработке всех сообщений, если средство ведения журнала является корневым средством ведения журнала, или делегированию родительскому элементу, если средство ведения журнала не является корневым средством ведения журнала). Обратите внимание, что корневой регистратор создается с уровнем ПРЕДУПРЕЖДЕНИЕ.

Это означает, что если обработчики находятся на более низком уровне, чем корневой регистратор (который не является ERROR, а DEBUG), то обработчики, которые, как я полагаю, являются дочерними, потому что я получаю именованный регистратор? Не совсем уверен, почему это так, но это «исправляет» это, если кто-то придет к этому позже.

person D W    schedule 11.02.2019