diff options
author | Aamir Khan <syst3m.w0rm@gmail.com> | 2012-06-27 01:16:39 -0400 |
---|---|---|
committer | Aamir Khan <syst3m.w0rm@gmail.com> | 2012-06-27 01:16:39 -0400 |
commit | 3bc3c7bc7e1f8bc3fd0319fec62d75b62c63031e (patch) | |
tree | 85857ddc3217a41e7a948ee5f92e555725a6a4ae | |
parent | b30cf3b91806cd8a8f0bac7c37c72af421869608 (diff) | |
download | hyperkitty-3bc3c7bc7e1f8bc3fd0319fec62d75b62c63031e.tar.gz hyperkitty-3bc3c7bc7e1f8bc3fd0319fec62d75b62c63031e.tar.xz hyperkitty-3bc3c7bc7e1f8bc3fd0319fec62d75b62c63031e.zip |
added a log handler in utils.py
-rw-r--r-- | utils.py | 86 |
1 files changed, 86 insertions, 0 deletions
diff --git a/utils.py b/utils.py new file mode 100644 index 0000000..351d469 --- /dev/null +++ b/utils.py @@ -0,0 +1,86 @@ +import logging +import traceback + +from django.conf import settings +from django.core import mail +from django.views.debug import ExceptionReporter, get_exception_reporter_filter + +LOG_FILE = 'hk.log' + +def log(level, *args, **kwargs): + """Small wrapper around logger functions.""" + { + 'debug': logger.debug, + 'error': logger.error, + 'exception': logger.exception, + 'warn': logger.warn + }[level](*args, **kwargs) + + +class HyperKittyLogHandler(logging.Handler): + """A custom HyperKitty log handler. + + If the request is passed as the first argument to the log record, + request data will be provided in the email report. + """ + + def __init__(self, log_to_file=True, email_admins=True): + logging.Handler.__init__(self) + self.log_to_file = log_to_file + self.email_admins = email_admins + + def emit(self, record): + try: + request = record.request + subject = '%s (%s IP): %s' % ( + record.levelname, + (request.META.get('REMOTE_ADDR') in settings.INTERNAL_IPS + and 'internal' or 'EXTERNAL'), + record.getMessage() + ) + filter = get_exception_reporter_filter(request) + request_repr = filter.get_request_repr(request) + except Exception: + subject = '%s: %s' % ( + record.levelname, + record.getMessage() + ) + request = None + request_repr = "Request repr() unavailable." + subject = self.format_subject(subject) + + if record.exc_info: + exc_info = record.exc_info + stack_trace = '\n'.join(traceback.format_exception(*record.exc_info)) + else: + exc_info = (None, record.getMessage(), None) + stack_trace = 'No stack trace available' + + message = "%s\n\n%s" % (stack_trace, request_repr) + reporter = ExceptionReporter(request, is_email=True, *exc_info) + html_message = reporter.get_traceback_html() + + if self.email_admins: + mail.mail_admins(subject, message, fail_silently=True, html_message=html_message) + + if self.log_to_file: + log_file = open(LOG_FILE, 'a') + log_file.write(message) + log_file.close() + + def format_subject(self, subject): + """ + Escape CR and LF characters, and limit length. + RFC 2822's hard limit is 998 characters per line. So, minus "Subject: " + the actual subject must be no longer than 989 characters. + """ + formatted_subject = subject.replace('\n', '\\n').replace('\r', '\\r') + return formatted_subject[:989] + + +logger = None +if not logger: + logger = logging.getLogger('HyperKitty') + +if not logger.handlers: + logger.addHandler(HyperKittyLogHandler(True, True)) |