Python日志记录SMTPHandler不工作

Python日志记录SMTPHandler不工作,python,python-3.x,logging,Python,Python 3.x,Logging,我已经在Python3中完成并尝试了这段代码,用于在异常发生时向我发送电子邮件,但STMPHandler不起作用。它与SMTPHandler的相同参数和值以及由此粘贴的相同代码副本完美结合 工作代码: import logging.handlers smtp_handler = logging.handlers.SMTPHandler(mailhost=("smtp.gmail.com", 587), fr

我已经在Python3中完成并尝试了这段代码,用于在异常发生时向我发送电子邮件,但STMPHandler不起作用。它与SMTPHandler的相同参数和值以及由此粘贴的相同代码副本完美结合

工作代码

import logging.handlers

smtp_handler = logging.handlers.SMTPHandler(mailhost=("smtp.gmail.com", 587),
                                            fromaddr="somemail@gmail.com",
                                            toaddrs="anothermail@gmail.com",
                                            subject=u"Alfred error!",
                                            credentials=("somemail@gmail.com", "asdasdasdasdasd"),
                                            secure=())


logger = logging.getLogger()
logger.addHandler(smtp_handler)

try:
    raise Exception()
except Exception as e:
    logger.exception('Unhandled Exception')
import os

import logging
import logging.handlers

version = "2.0.0"
LOGFILE_PATH = os.path.join(os.path.dirname(os.path.dirname(__file__)), 'log', 'my_app.log')
logging.basicConfig(format='%(levelname)s - %(message)s', level=logging.DEBUG)
logging.getLogger('telegram').setLevel(logging.WARNING)
logging.getLogger('chardet.charsetprober').setLevel(logging.WARNING)


class TimedOutFilter(logging.Filter):
    def filter(self, record):
        if "Error while getting Updates: Timed out" in record.getMessage():
            return False


def getLogger(name):
    """
    Return a logger for the file
    :param name: the file name
    :return: a logger
    """
    global version
    logger = logging.getLogger(name)

    fh = logging.handlers.TimedRotatingFileHandler(LOGFILE_PATH, when='midnight')
    formatter = logging.Formatter('%(asctime)s - ({0}) %(name)s - %(levelname)s - %(message)s'.format(version))
    fh.setFormatter(formatter)
    fh.addFilter(TimedOutFilter())
    fh.setLevel(logging.DEBUG)
    logger.addHandler(fh)

    if os.environ.get('SERVER', True):
        mh = logging.handlers.SMTPHandler(mailhost=("smtp.gmail.com", 587),
                                          fromaddr="somemail@gmail.com",
                                          toaddrs="anothermail@gmail.com",
                                          subject=u"Alfred error!",
                                          credentials=("somemail@gmail.com", "asdasdasdasdasd"),
                                          secure=())
        mh.setFormatter(formatter)
        mh.addFilter(TimedOutFilter())
        mh.setLevel(logging.ERROR)
        logger.addHandler(mh)

    ch = logging.StreamHandler()
    formatter = logging.Formatter('{0} %(levelname)s - %(message)s'.format(version))
    ch.setFormatter(formatter)
    ch.addFilter(TimedOutFilter())
    ch.setLevel(logging.ERROR)
    logger.addHandler(ch)

    return logger


if __name__ == '__main__':
    logger = getLogger(__name__)
    try:
        raise Exception()
    except Exception as e:
        logger.exception('Unhandled Exception')
        logger.error('an error line')
        logger.debug('a debug line')
所有处理程序都很好,答案中的代码只适用于exception()调用

我不明白为什么这不起作用

log\u config.py(非工作代码)

import logging.handlers

smtp_handler = logging.handlers.SMTPHandler(mailhost=("smtp.gmail.com", 587),
                                            fromaddr="somemail@gmail.com",
                                            toaddrs="anothermail@gmail.com",
                                            subject=u"Alfred error!",
                                            credentials=("somemail@gmail.com", "asdasdasdasdasd"),
                                            secure=())


logger = logging.getLogger()
logger.addHandler(smtp_handler)

try:
    raise Exception()
except Exception as e:
    logger.exception('Unhandled Exception')
import os

import logging
import logging.handlers

version = "2.0.0"
LOGFILE_PATH = os.path.join(os.path.dirname(os.path.dirname(__file__)), 'log', 'my_app.log')
logging.basicConfig(format='%(levelname)s - %(message)s', level=logging.DEBUG)
logging.getLogger('telegram').setLevel(logging.WARNING)
logging.getLogger('chardet.charsetprober').setLevel(logging.WARNING)


class TimedOutFilter(logging.Filter):
    def filter(self, record):
        if "Error while getting Updates: Timed out" in record.getMessage():
            return False


def getLogger(name):
    """
    Return a logger for the file
    :param name: the file name
    :return: a logger
    """
    global version
    logger = logging.getLogger(name)

    fh = logging.handlers.TimedRotatingFileHandler(LOGFILE_PATH, when='midnight')
    formatter = logging.Formatter('%(asctime)s - ({0}) %(name)s - %(levelname)s - %(message)s'.format(version))
    fh.setFormatter(formatter)
    fh.addFilter(TimedOutFilter())
    fh.setLevel(logging.DEBUG)
    logger.addHandler(fh)

    if os.environ.get('SERVER', True):
        mh = logging.handlers.SMTPHandler(mailhost=("smtp.gmail.com", 587),
                                          fromaddr="somemail@gmail.com",
                                          toaddrs="anothermail@gmail.com",
                                          subject=u"Alfred error!",
                                          credentials=("somemail@gmail.com", "asdasdasdasdasd"),
                                          secure=())
        mh.setFormatter(formatter)
        mh.addFilter(TimedOutFilter())
        mh.setLevel(logging.ERROR)
        logger.addHandler(mh)

    ch = logging.StreamHandler()
    formatter = logging.Formatter('{0} %(levelname)s - %(message)s'.format(version))
    ch.setFormatter(formatter)
    ch.addFilter(TimedOutFilter())
    ch.setLevel(logging.ERROR)
    logger.addHandler(ch)

    return logger


if __name__ == '__main__':
    logger = getLogger(__name__)
    try:
        raise Exception()
    except Exception as e:
        logger.exception('Unhandled Exception')
        logger.error('an error line')
        logger.debug('a debug line')

timedOutFilter破坏了一切,因为它只返回False,而从不返回True

那么就这么做吧:

class TimedOutFilter(logging.Filter):
    def filter(self, record):
        if "Error while getting Updates: Timed out" in record.getMessage():
            return False
        return True  # <==== Added this line only
class TimedOutFilter(logging.Filter):
def过滤器(自我,记录):
如果记录中的“获取更新时出错:超时”:
返回错误

return True#第一个想法是必须使用TLS连接到gmail。试着看一下文档,我刚刚看到了你的评论,我现在就要看文档了,但是TLS已经被使用了。端口587,凭证,安全-所需的一切都在那里。@VPfB正是如此。我看了一下医生,似乎什么都没少