olivier.massot před 8 roky
rodič
revize
6ccfb7abf0
4 změnil soubory, kde provedl 121 přidání a 6 odebrání
  1. 47 0
      core/logging.yaml
  2. 64 0
      core/logging_.py
  3. 9 5
      main.py
  4. 1 1
      ui/window.py

+ 47 - 0
core/logging.yaml

@@ -0,0 +1,47 @@
+version: 1
+disable_existing_loggers: no
+formatters:
+    simple:
+        format: "%(asctime)s - %(levelname)s - %(message)s"
+    complete:
+        format: "%(asctime)s - %(name)s - %(levelname)s - %(message)s"
+    short:
+        format: "%(levelname)s - %(message)s"
+    message_only:
+        format: "%(message)s"
+        
+handlers:
+    console:
+        class: logging.StreamHandler
+        level: INFO
+        formatter: message_only
+        stream: ext://sys.stdout
+    file:
+        class: logging.handlers.RotatingFileHandler
+        level: DEBUG
+        formatter: complete
+        filename: debug.log
+        maxBytes: 100000
+        backupCount: 1
+        encoding: utf8
+    mail:
+        class: core.logging_.BufferingSMTPHandler
+        level: ERROR
+        formatter: complete
+        mailhost: smtp.bas-rhin.fr
+        fromaddr: log.hello@bas-rhin.fr
+ #       toaddrs: [user.name@bas-rhin.fr]
+        toaddrs: []
+        subject: log
+        capacity: 100000000
+        
+loggers:
+    hello:
+        level: DEBUG
+        handlers: [console, file, mail]
+        propagate: no
+       
+root:
+    level: INFO
+    handlers: [console]
+    propagate: yes

+ 64 - 0
core/logging_.py

@@ -0,0 +1,64 @@
+'''
+Created on 6 juil. 2017
+
+@author: olivier.massot
+'''
+from datetime import datetime
+from email.mime.text import MIMEText
+import logging.config
+import smtplib
+import sys
+
+from path import Path
+import yaml
+
+LOG_DIR = Path(r"%appdata%\logs").expandvars()
+LOG_DIR.makedirs_p()
+
+SYS_EXCEPT_HOOK = sys.excepthook
+
+def start(name="main", level=0, filename=""):
+    # charge la configuration du logging depuis le fichier 'logging.yaml'
+    configfile = Path(__file__).parent
+    with open(configfile / 'logging.yaml', 'rt') as f:
+        conf = yaml.load(f)
+
+    if level:
+        conf["loggers"][name]["level"] = level
+
+    if not filename:
+        filename = LOG_DIR / r'{}_{:%Y%m%d_%H%M}.log'.format(name, datetime.now())
+    conf["handlers"]["file"]["filename"] = filename
+
+    logging.config.dictConfig(conf)
+
+    logger = logging.getLogger(name)
+    logger.info("Log start written at {}".format(filename))
+
+class BufferingSMTPHandler(logging.handlers.BufferingHandler):
+    def __init__(self, mailhost, fromaddr, toaddrs, subject, capacity):
+        logging.handlers.BufferingHandler.__init__(self, capacity)
+        self.mailhost = mailhost
+        self.mailport = None
+        self.fromaddr = fromaddr
+        self.toaddrs = toaddrs
+        self.subject = subject
+
+    def flush(self):
+        try:
+            if len(self.buffer) > 0:
+                port = self.mailport if self.mailport else smtplib.SMTP_PORT
+
+                msg = "\n".join([self.format(record) for record in self.buffer])
+                msg = MIMEText(msg.encode('utf-8'), _charset='utf-8')
+                msg['Subject'] = self.subject
+                msg['From'] = self.fromaddr
+                msg['To'] = ",".join(self.toaddrs)
+
+                smtp = smtplib.SMTP(self.mailhost, port)
+                smtp.sendmail(self.fromaddr, self.toaddrs, msg.as_string())
+                smtp.quit()
+                self.buffer = []
+        except Exception as e:
+            print(e)
+            raise

+ 9 - 5
main.py

@@ -5,15 +5,19 @@
     @author:[author], [year]
 """
 
+import logging
 import sys
+import traceback
 
 from PyQt5.Qt import QApplication
 from PyQt5.QtWidgets import QMessageBox
 
+from core import logging_
 from ui.window import MainWindow
 from updater import UpdateNeeded
 import updater
 
+
 try:
     # Necessary to ensure that stacktraces are printed when using PyQt5
     # Tough, could make pythonw.exe crash
@@ -21,6 +25,8 @@ try:
 except:
     pass
 
+logger = logging.getLogger("hello")
+logging_.start("hello", level=10)
 
 with open("VERSION") as f:
     __VERSION__ = f.read()
@@ -33,13 +39,11 @@ except UpdateNeeded:
 
 # Configure how errors are processed
 sys_err = sys.excepthook
-def gestionnaire_erreurs(typ, value, traceback):
+def gestionnaire_erreurs(typ, value, trace):
     QApplication.restoreOverrideCursor()
-    sys_err(typ, value, traceback)
+    logger.error("{}\n{}\n{}".format(typ.__name__, value, ''.join(traceback.format_tb(trace))))
     QMessageBox.critical(mainw, "Erreur: {}".format(typ.__name__), """{}""".format(value))
-    with open("err.log", "w+") as f:
-        f.write("{}: {}".format(typ.__name__, value))
-    mainw.cancel()
+    sys_err(typ, value, trace)
 sys.excepthook = gestionnaire_erreurs
 
 # Start UI

+ 1 - 1
ui/window.py

@@ -23,4 +23,4 @@ class MainWindow(QMainWindow):
 
     def run(self):
         message = hello_world.hello_message()
-        self.ui.lblResult.setText(message)
+        self.ui.lblResult.setText(message)