为什么我的低级日志不写到文件,但是上面的错误呢?

时间:2019-02-09 18:24:50

标签: python-3.x logging

我创建了一个小功能来设置日志记录,其中一个文件处理程序用于“一切”,一个smtphandler用于错误及以上。错误日志将写入日志文件并正确发送到电子邮件,但是即使文件处理程序的setlevel设置为0,调试,信息,notset也不会。为什么?下面的代码

#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='mymail@example.com',
                        toaddrs='mymail@example.com',
                        subject='Error in Script',
                        credentials=('mymail@example.com', '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.')

1 个答案:

答案 0 :(得分:0)

显然,除了处理程序外,日志记录还需要它自己的日志记录级别。在返回记录器之前立即设置logger.setLevel(logging.DEBUG)会使其正常工作。文档说

  

创建记录器时,级别设置为NOTSET(这将导致所有   当记录器是根记录器时要处理的消息,或者   当记录器为非root记录器时,将其委托给父级)。注意   根记录器的创建级别为警告。

这意味着,如果处理程序的级别比根记录程序低(错误不是,而DEBUG是),那么我猜这是一个孩子,因为我正在获取命名记录程序?不太清楚为什么会这样,但是可以“修复”它,以防万一有人稍后再来。