我创建了一个小功能来设置日志记录,其中一个文件处理程序用于“一切”,一个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.')
答案 0 :(得分:0)
显然,除了处理程序外,日志记录还需要它自己的日志记录级别。在返回记录器之前立即设置logger.setLevel(logging.DEBUG)会使其正常工作。文档说
创建记录器时,级别设置为NOTSET(这将导致所有 当记录器是根记录器时要处理的消息,或者 当记录器为非root记录器时,将其委托给父级)。注意 根记录器的创建级别为警告。
这意味着,如果处理程序的级别比根记录程序低(错误不是,而DEBUG是),那么我猜这是一个孩子,因为我正在获取命名记录程序?不太清楚为什么会这样,但是可以“修复”它,以防万一有人稍后再来。