Jon*_*han 7 python logging smtp handler
我安装了本地SMTP服务器并用于logging.handlers.SMTPHandler使用以下代码记录异常:
import logging
import logging.handlers
import time
gm = logging.handlers.SMTPHandler(("localhost", 25), 'info@somewhere.com', ['my_email@gmail.com'], 'Hello Exception!',)
gm.setLevel(logging.ERROR)
logger.addHandler(gm)
t0 = time.clock()
try:
1/0
except:
logger.exception('testest')
print time.clock()-t0
Run Code Online (Sandbox Code Playgroud)
这花了超过1秒完成,一直阻止python脚本.怎么会?如何让它不阻止脚本?
Jon*_*han 13
这是我正在使用的实现,我基于这个Gmail改编的SMTPHandler.
我把发送到SMTP的部分放在一个不同的线程中.
import logging.handlers
import smtplib
from threading import Thread
def smtp_at_your_own_leasure(mailhost, port, username, password, fromaddr, toaddrs, msg):
smtp = smtplib.SMTP(mailhost, port)
if username:
smtp.ehlo() # for tls add this line
smtp.starttls() # for tls add this line
smtp.ehlo() # for tls add this line
smtp.login(username, password)
smtp.sendmail(fromaddr, toaddrs, msg)
smtp.quit()
class ThreadedTlsSMTPHandler(logging.handlers.SMTPHandler):
def emit(self, record):
try:
import string # for tls add this line
try:
from email.utils import formatdate
except ImportError:
formatdate = self.date_time
port = self.mailport
if not port:
port = smtplib.SMTP_PORT
msg = self.format(record)
msg = "From: %s\r\nTo: %s\r\nSubject: %s\r\nDate: %s\r\n\r\n%s" % (
self.fromaddr,
string.join(self.toaddrs, ","),
self.getSubject(record),
formatdate(), msg)
thread = Thread(target=smtp_at_your_own_leasure, args=(self.mailhost, port, self.username, self.password, self.fromaddr, self.toaddrs, msg))
thread.start()
except (KeyboardInterrupt, SystemExit):
raise
except:
self.handleError(record)
Run Code Online (Sandbox Code Playgroud)
用法示例:
logger = logging.getLogger()
gm = ThreadedTlsSMTPHandler(("smtp.gmail.com", 587), 'bugs@my_company.com', ['admin@my_company.com'], 'Error found!', ('my_company_account@gmail.com', 'top_secret_gmail_password'))
gm.setLevel(logging.ERROR)
logger.addHandler(gm)
try:
1/0
except:
logger.exception('FFFFFFFFFFFFFFFFFFFFFFFUUUUUUUUUUUUUUUUUUUUUU-')
Run Code Online (Sandbox Code Playgroud)
您可以使用QueueHandler和QueueListener.取自文档:
与QueueListener类一起,QueueHandler可用于让处理程序在与执行日志记录的线程不同的线程上完成工作.这在Web应用程序以及服务于客户端的线程需要尽快响应的其他服务应用程序中非常重要,而任何可能较慢的操作(例如通过SMTPHandler发送电子邮件)都是在单独的线程上完成的.
唉,它们只能从Python 3.2开始提供.