工作中需要及时解决线上的 bug,所以,及时获取 log 中的 warning,error 是非常有必要的。
1 import logging
2 import logging.handlers
3
4 class EncodingFormatter(logging.Formatter):
5 def __init__(self, fmt, datefmt=None, encoding=None):
6 logging.Formatter.__init__(self, fmt, datefmt)
7 self.encoding = encoding
8
9
10 def get_logger(logger_name, logger_level, logger_location, days):
11 logger = logging.getLogger(logger_name)
12 logger.setLevel(logger_level)
13
14 log_format = "%(name)s\t%(asctime)s\t%(pathname)s\t[line:%(lineno)d]\t %(levelname)s\t %(message)s"
15 formater = logging.Formatter(log_format)
16
17 # 存入文件的日志
18 handler = logging.handlers.TimedRotatingFileHandler(logger_location, "midnight", 1, days, encoding="utf-8")
19 handler.suffix = "%Y%m%d"
20 handler.setFormatter(formater)
21 logger.addHandler(handler)
22
23 # 发邮件的日志
24 sh = logging.handlers.SMTPHandler("smtp.163.com", send_email, [receive_email_1, receive_email_2],
25 "log error", credentials=(send_email, authority_password),secure=())
26 sh.setLevel(logging.ERROR)
27 sh.setFormatter(EncodingFormatter('%(name)s\t%(asctime)s\t%(pathname)s\t[line:%(lineno)d]\t %(levelname)s\t %(message)s', encoding='utf-8'))
28 logger.addHandler(sh)
29
30 return logger
~
这里有两个坑,但是代码里应该都已经解决了。
- 邮件发送中文的坑,用 EncodingFormatter 解决;
-
邮箱的密码不是登录密码,而是授权码。首先需要打开邮箱的客户端授权,然后设置授权码。