MonScoDocEssai/notes_log.py
2021-02-13 23:18:32 +01:00

129 lines
3.6 KiB
Python

# -*- mode: python -*-
# -*- coding: utf-8 -*-
import pdb
import sys
import os
import re
import inspect
import time
import traceback
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.base import MIMEBase
from email.header import Header
from email.MIMEMultipart import ( # pylint: disable=no-name-in-module,import-error
MIMEMultipart,
)
from email.MIMEText import MIMEText # pylint: disable=no-name-in-module,import-error
from email.MIMEBase import MIMEBase # pylint: disable=no-name-in-module,import-error
from email.Header import Header # pylint: disable=no-name-in-module,import-error
from email import Encoders # pylint: disable=no-name-in-module,import-error
# Simple & stupid file logguer, used only to debug
# (logging to SQL is done in scolog)
LOG_FILENAME = "notes.log" # empty to disable logging
DEFAULT_LOG_DIR = "/tmp" # clients should call set_log_directory to change this
ALARM_DESTINATION = "emmanuel.viennet@univ-paris13.fr" # XXX a mettre en preference
class _logguer:
def __init__(self):
self.file = None
self.directory = None
self.set_log_directory(DEFAULT_LOG_DIR)
def set_log_directory(self, directory):
if self.directory != directory and self.file:
# changing directory when a log is already open: close it
self.file.close()
self.file = None
self.directory = directory
def _open(self):
if LOG_FILENAME:
path = os.path.join(self.directory, LOG_FILENAME)
self.file = open(path, "a")
self("new _logguer (%s)" % path)
else:
self.file = None # logging disabled
def __call__(self, msg):
if not self.file:
self._open()
if self.file:
dept = retreive_dept()
if dept:
dept = " (%s)" % dept
self.file.write(
"[%s]%s %s\n" % (time.strftime("%a %b %d %H:%M:%S %Y"), dept, msg)
)
# if not dept:
# import traceback
# traceback.print_stack(file=self.file) # hunt missing REQUESTS
self.file.flush()
log = _logguer()
def retreive_request(skip=0):
"""Try to retreive a REQUEST variable in caller stack.
This is a hack, used only in log functions.
"""
def search(frame):
if frame.f_locals.has_key("REQUEST"):
return frame.f_locals["REQUEST"]
if frame.f_back:
return search(frame.f_back)
else:
return None
frame = inspect.currentframe()
if frame: # not supported by all pythons
startframe = frame
while skip and startframe.f_back:
startframe = startframe.f_back
return search(startframe)
else:
return None
def retreive_dept():
"""Try to retreive departement (from REQUEST URL)"""
REQUEST = retreive_request()
if not REQUEST:
return ""
try:
url = REQUEST.URL
m = re.match(r"^.*ScoDoc/(\w+).*$", url)
return m.group(1)
except:
return ""
# Alarms by email:
def sendAlarm(context, subj, txt):
import sco_utils
msg = MIMEMultipart()
subj = Header(subj, sco_utils.SCO_ENCODING)
msg["Subject"] = subj
msg["From"] = context.get_preference("email_from_addr")
msg["To"] = ALARM_DESTINATION
msg.epilogue = ""
txt = MIMEText(txt, "plain", sco_utils.SCO_ENCODING)
msg.attach(txt)
context.sendEmail(msg)
# Debug: log call stack
def logCallStack():
log("Call stack:\n" + "\n".join(x.strip() for x in traceback.format_stack()[:-1]))