logging_.py 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. '''
  2. Created on 6 juil. 2017
  3. @author: olivier.massot
  4. '''
  5. from datetime import datetime
  6. from email.mime.text import MIMEText
  7. import logging.config
  8. import smtplib
  9. import sys
  10. from path import Path
  11. import yaml
  12. LOG_DIR = Path(r"%appdata%\logs").expandvars()
  13. LOG_DIR.makedirs_p()
  14. SYS_EXCEPT_HOOK = sys.excepthook
  15. def start(name="main", level=0, filename=""):
  16. # charge la configuration du logging depuis le fichier 'logging.yaml'
  17. configfile = Path(__file__).parent
  18. with open(configfile / 'logging.yaml', 'rt') as f:
  19. conf = yaml.load(f)
  20. if level:
  21. conf["loggers"][name]["level"] = level
  22. if not filename:
  23. filename = LOG_DIR / r'{}_{:%Y%m%d_%H%M}.log'.format(name, datetime.now())
  24. conf["handlers"]["file"]["filename"] = filename
  25. logging.config.dictConfig(conf)
  26. logger = logging.getLogger(name)
  27. logger.info("Log start written at {}".format(filename))
  28. class BufferingSMTPHandler(logging.handlers.BufferingHandler):
  29. def __init__(self, mailhost, fromaddr, toaddrs, subject, capacity):
  30. logging.handlers.BufferingHandler.__init__(self, capacity)
  31. self.mailhost = mailhost
  32. self.mailport = None
  33. self.fromaddr = fromaddr
  34. self.toaddrs = toaddrs
  35. self.subject = subject
  36. def flush(self):
  37. try:
  38. if len(self.buffer) > 0:
  39. port = self.mailport if self.mailport else smtplib.SMTP_PORT
  40. msg = "\n".join([self.format(record) for record in self.buffer])
  41. msg = MIMEText(msg.encode('utf-8'), _charset='utf-8')
  42. msg['Subject'] = self.subject
  43. msg['From'] = self.fromaddr
  44. msg['To'] = ",".join(self.toaddrs)
  45. smtp = smtplib.SMTP(self.mailhost, port)
  46. smtp.sendmail(self.fromaddr, self.toaddrs, msg.as_string())
  47. smtp.quit()
  48. self.buffer = []
  49. except Exception as e:
  50. print(e)
  51. raise