def test_ignore(self):
        ignored = [
            RegexConversion('^bad start'),
            RegexConversion('(.*)Some String'),
            RegexConversion('(.*)http:(.*)\/view')
        ]
        self.handler = MailingLogger('*****@*****.**', ('*****@*****.**', ),
                                     ignore=ignored)
        logger = self.getLogger()
        logger.addHandler(self.handler)
        # paranoid check
        self.assertEqual(len(DummySMTP.sent), 0)

        # Now test a few variations
        logger.critical('This Line Contains Some String.')
        self.assertEqual(len(DummySMTP.sent), 0)

        logger.critical('bad starts and terrible endings')
        self.assertEqual(len(DummySMTP.sent), 0)

        logger.critical('NotFoundError: http://my.site.com/some/path/view')
        self.assertEqual(len(DummySMTP.sent), 0)

        # Interpolations are also ignored
        logger.critical('NotFoundError: %s',
                        'http://my.site.com/some/path/view')
        self.assertEqual(len(DummySMTP.sent), 0)

        # Non-matching stuff still gets through
        logger.critical('message1')
        self.assertEqual(len(DummySMTP.sent), 1)
Example #2
0
 def __init__(self,
              fromaddr,
              toaddrs,
              mailhost='localhost',
              subject='Summary of Log Messages (%(levelname)s)',
              send_empty_entries=True,
              atexit=True,
              username=None,
              password=None,
              ignore=(),
              headers=None):
     # create the "real" mailinglogger
     self.mailer = MailingLogger(fromaddr,
                                 toaddrs,
                                 mailhost,
                                 subject,
                                 send_empty_entries,
                                 username=username,
                                 password=password,
                                 headers=headers)
     # set the mailing logger's log format
     self.mailer.setFormatter(Formatter('%(message)s'))
     self.ignore = process_ignore(ignore)
     self.open()
     # register our close method
     if atexit:
         register(self.close)
Example #3
0
 def test_send_failure(self):
     handler = MailingLogger('*****@*****.**', ('*****@*****.**', ),
                             template='x')
     logger = self.getLogger()
     logger.addHandler(handler)
     with OutputCapture() as output:
         logger.critical(u"message")
     assert 'TypeError: not all arguments converted' in output.captured
Example #4
0
 def create_loghandler(self):
     return MailingLogger(self.section.fromaddr, self.section.toaddrs,
                          self.mailhost(), self.section.subject,
                          self.section.send_empty_entries,
                          self.section.flood_level, self.section.username,
                          self.section.password, self.section.ignore,
                          self.headers(), self.section.template,
                          self.section.charset, self.section.content_type)
 def test_non_string_error_messages_dont_break_logging(self):
     self.handler = MailingLogger(
         '*****@*****.**',
         ('*****@*****.**', ),
     )
     logger = self.getLogger()
     logger.addHandler(self.handler)
     logger.critical(object())
     self.assertEqual(len(DummySMTP.sent), 1)
 def test_specified_content_type(self):
     self.handler = MailingLogger('*****@*****.**', ('*****@*****.**', ),
                                  content_type='foo/bar')
     logger = self.getLogger()
     logger.addHandler(self.handler)
     logger.critical(u"message")
     m = DummySMTP.sent[0][3]
     # NB: we drop the 'foo'
     self.failUnless('Content-Type: text/bar' in m, m)
Example #7
0
 def test_template(self):
     self.handler = MailingLogger('*****@*****.**', ('*****@*****.**', ),
                                  template="<before>%s<after>")
     logger = self.getLogger()
     logger.addHandler(self.handler)
     logger.critical('message')
     m = DummySMTP.sent[0].msg
     self.assertTrue('Subject: message' in m, m)
     _check_sent_message('<before>message<after>', m)
 def test_template(self):
     self.handler = MailingLogger('*****@*****.**', ('*****@*****.**', ),
                                  template="<before>%s<after>")
     logger = self.getLogger()
     logger.addHandler(self.handler)
     logger.critical('message')
     m = DummySMTP.sent[0][3]
     self.failUnless('Subject: message' in m, m)
     self.failUnless('<before>message<after>' in m, m)
 def test_subject_contains_date(self):
     # set up logger
     self.handler = MailingLogger('*****@*****.**', ('*****@*****.**', ),
                                  subject="%(asctime)s")
     logger = self.getLogger()
     logger.addHandler(self.handler)
     logger.critical('message')
     self.assertEqual(len(DummySMTP.sent), 1)
     m = DummySMTP.sent[0][3]
     self.failUnless('Subject: 2007-01-01 10:00:00,000' in m, m)
 def test_default_flood_limit(self):
     # set up logger
     self.handler = MailingLogger('*****@*****.**', ('*****@*****.**', ))
     logger = self.getLogger()
     logger.addHandler(self.handler)
     # log 11 entries
     for i in range(12):
         logger.critical('message')
     # only 1st 10 should get sent
     # +1 for the final warning
     self.assertEqual(len(DummySMTP.sent), 11)
Example #11
0
 def __init__(
     self,
     fromaddr,
     toaddrs,
     mailhost='localhost',
     subject='Summary of Log Messages (%(levelname)s)',
     send_empty_entries=True,
     atexit=True,
     username=None,
     password=None,
     ignore=(),
     headers=None,
     send_level=None,
     template=None,
     charset='utf-8',
     content_type='text/plain',
     flood_level=100,
 ):
     # create the "real" mailinglogger
     self.mailer = MailingLogger(fromaddr,
                                 toaddrs,
                                 mailhost,
                                 subject,
                                 send_empty_entries,
                                 username=username,
                                 password=password,
                                 headers=headers,
                                 template=template,
                                 charset=charset,
                                 content_type=content_type)
     # set the mailing logger's log format
     self.mailer.setFormatter(Formatter('%(message)s'))
     self.ignore = process_ignore(ignore)
     self.send_level = send_level
     self.charset = charset
     self.flood_level = flood_level
     self.open()
     # register our close method
     if atexit:
         register(self.close)
 def test_default_charset(self):
     self.handler = MailingLogger(
         '*****@*****.**',
         ('*****@*****.**', ),
     )
     logger = self.getLogger()
     logger.addHandler(self.handler)
     logger.critical(u"accentu\u00E9")
     m = DummySMTP.sent[0][3]
     # lovely, utf-8 encoded goodness
     self.failUnless('Subject: =?utf-8?b?YWNjZW50dcOp?=' in m, m)
     self.failUnless('Content-Type: text/plain; charset="utf-8"' in m, m)
     self.failUnless('\nYWNjZW50dcOp' in m, m)
 def test_specified_charset(self):
     self.handler = MailingLogger('*****@*****.**', ('*****@*****.**', ),
                                  charset='iso-8859-1')
     logger = self.getLogger()
     logger.addHandler(self.handler)
     logger.critical(u"accentu\u00E9")
     m = DummySMTP.sent[0][3]
     # lovely, latin-1 encoded goodness
     self.failUnless('\naccentu=E9' in m, m)
     self.failUnless('Content-Type: text/plain; charset="iso-8859-1"' in m,
                     m)
     # no idea why MIMEText doesn't use iso-8859-1 here, best not to
     # argue...
     self.failUnless('Subject: =?utf-8?b?YWNjZW50dcOp?=' in m, m)
 def test_headers_supplied_get_added_to_those_generated(self):
     # set up logger
     self.handler = MailingLogger('*****@*****.**', ('*****@*****.**', ),
                                  headers={
                                      'From': 'someidiot',
                                      'to': 'someidiot'
                                  })
     logger = self.getLogger()
     logger.addHandler(self.handler)
     logger.critical('message')
     self.assertEqual(len(DummySMTP.sent), 1)
     m = DummySMTP.sent[0][3]
     # the headers specified in the `headers` parameter get added
     # to those generated by mailinglogger - be careful!
     self.failUnless('From: [email protected]' in m)
     self.failUnless('From: someidiot' in m)
     # however, if you try hard you *can* break things :-S
     self.failUnless('To: [email protected]' in m)
     self.failUnless('to: someidiot' in m)
 def __init__(self,
              fromaddr,
              toaddrs,
              mailhost='localhost',
              subject='Summary of Log Messages (%(levelname)s)',
              send_empty_entries=True,
              atexit=True,
              username=None,
              password=None,
              secure=None,
              ignore=(),
              headers=None,
              send_level=None,
              template=None,
              charset='utf-8',
              content_type='text/plain'):
     # create the "real" mailinglogger
     self.mailer = MailingLogger(fromaddr,
                                 toaddrs,
                                 mailhost,
                                 subject,
                                 send_empty_entries,
                                 username=username,
                                 password=password,
                                 secure=secure,
                                 headers=headers,
                                 template=template,
                                 charset=charset,
                                 content_type=content_type)
     # set the mailing logger's log format
     self.mailer.setFormatter(Formatter('%(message)s'))
     self.ignore = process_ignore(ignore)
     self.send_level=send_level
     self.charset = charset
     self.open()
     # register our close method
     if atexit:
         register(self.close)
 def test_flood_protection_bug(self):
     # set up logger
     self.handler = MailingLogger('*****@*****.**', ('*****@*****.**', ),
                                  flood_level=1)
     logger = self.getLogger()
     logger.addHandler(self.handler)
     # make it 11pm
     self.datetime.set(2007, 3, 15, 23)
     # paranoid check
     self.assertEqual(len(DummySMTP.sent), 0)
     # log until flood protection kicked in
     logger.critical('message1')
     logger.critical('message2')
     # check - 1 logged, 1 final warning
     self.assertEqual(len(DummySMTP.sent), 2)
     # check nothing emitted
     logger.critical('message3')
     self.assertEqual(len(DummySMTP.sent), 2)
     # advance time past midnight
     self.datetime.set(2007, 3, 15)
     # log again
     logger.critical('message4')
     # check we are emitted now!
     self.assertEqual(len(DummySMTP.sent), 3)
Example #17
0
class SummarisingLogger(FileHandler):

    maxlevelno = 0
    
    def __init__(self,
                 fromaddr,
                 toaddrs,
                 mailhost='localhost',
                 subject='Summary of Log Messages (%(levelname)s)',
                 send_empty_entries=True,
                 atexit=True,
                 username=None,
                 password=None,
                 ignore=(),
                 headers=None):
        # create the "real" mailinglogger
        self.mailer = MailingLogger(fromaddr,
                                    toaddrs,
                                    mailhost,
                                    subject,
                                    send_empty_entries,
                                    username=username,
                                    password=password,
                                    headers=headers)
        # set the mailing logger's log format
        self.mailer.setFormatter(Formatter('%(message)s'))
        self.ignore = process_ignore(ignore)
        self.open()
        # register our close method
        if atexit:
            register(self.close)

    def open(self):
        # create a temp file logger to store log entries
        self.fd, self.filename = mkstemp()
        FileHandler.__init__(self,self.filename,'w')
        self.closed = False
        
    def setLevel(self,lvl):
        self.mailer.setLevel(lvl)
        FileHandler.setLevel(self,lvl)

    def emit(self,record):
        if self.closed:
            return

        for criterion in self.ignore:
            if criterion(record.msg):
                return

        if record.levelno>self.maxlevelno:
            self.maxlevelno = record.levelno
        FileHandler.emit(self,record)

    def close(self):
        if self.closed:
            return
        FileHandler.close(self)
        f = open(self.filename)
        summary = f.read()
        f.close()
        os.close(self.fd)
        os.remove(self.filename)
        self.mailer.handle(
            LogRecord(
                name = 'Summary',
                level = self.maxlevelno,
                pathname = '',
                lineno = 0,
                msg = summary,
                args = (),
                exc_info = None
                )
            )
        self.closed = True
            
    def reopen(self):
        self.close()
        self.open()
class SummarisingLogger(FileHandler):

    maxlevelno = 0
    
    def __init__(self,
                 fromaddr,
                 toaddrs,
                 mailhost='localhost',
                 subject='Summary of Log Messages (%(levelname)s)',
                 send_empty_entries=True,
                 atexit=True,
                 username=None,
                 password=None,
                 secure=None,
                 ignore=(),
                 headers=None,
                 send_level=None,
                 template=None,
                 charset='utf-8',
                 content_type='text/plain'):
        # create the "real" mailinglogger
        self.mailer = MailingLogger(fromaddr,
                                    toaddrs,
                                    mailhost,
                                    subject,
                                    send_empty_entries,
                                    username=username,
                                    password=password,
                                    secure=secure,
                                    headers=headers,
                                    template=template,
                                    charset=charset,
                                    content_type=content_type)
        # set the mailing logger's log format
        self.mailer.setFormatter(Formatter('%(message)s'))
        self.ignore = process_ignore(ignore)
        self.send_level=send_level
        self.charset = charset
        self.open()
        # register our close method
        if atexit:
            register(self.close)

    def open(self):
        # create a temp file logger to store log entries
        self.fd, self.filename = mkstemp()
        FileHandler.__init__(self, self.filename, 'w', encoding=self.charset)
        self.closed = False
        
    def setLevel(self,lvl):
        self.mailer.setLevel(lvl)
        FileHandler.setLevel(self,lvl)

    def emit(self,record):
        if self.closed:
            return

        for criterion in self.ignore:
            if criterion(record.msg):
                return

        if record.levelno>self.maxlevelno:
            self.maxlevelno = record.levelno
        FileHandler.emit(self,record)

    def close(self):
        if self.closed:
            return
        FileHandler.close(self)
        f = os.fdopen(self.fd)
        summary = f.read().decode(self.charset)
        f.close()
        # try and encode in ascii, to keep emails simpler:
        try:
            summary = summary.encode('ascii')
        except UnicodeEncodeError:
            # unicode it is then
            pass
        if os.path.exists(self.filename):
            os.remove(self.filename)
        if self.send_level is None or self.maxlevelno >= self.send_level:
            self.mailer.handle(
                LogRecord(
                    name = 'Summary',
                    level = self.maxlevelno,
                    pathname = '',
                    lineno = 0,
                    msg = summary,
                    args = (),
                    exc_info = None
                    )
                )
        self.closed = True
            
    def reopen(self):
        self.close()
        self.open()
class SummarisingLogger(FileHandler):

    maxlevelno = 0
    message_count = 0
    tail = None

    def __init__(self,
                 fromaddr,
                 toaddrs,
                 mailhost='localhost',
                 subject='Summary of Log Messages (%(levelname)s)',
                 send_empty_entries=True,
                 atexit=True,
                 username=None,
                 password=None,
                 headers=None,
                 send_level=None,
                 template=None,
                 charset='utf-8',
                 content_type='text/plain',
                 flood_level=100,
                 ):
        # create the "real" mailinglogger
        self.mailer = MailingLogger(fromaddr,
                                    toaddrs,
                                    mailhost,
                                    subject,
                                    send_empty_entries,
                                    username=username,
                                    password=password,
                                    headers=headers,
                                    template=template,
                                    charset=charset,
                                    content_type=content_type)
        # set the mailing logger's log format
        self.mailer.setFormatter(Formatter('%(message)s'))
        self.send_level = send_level
        self.charset = charset
        self.flood_level = flood_level
        self.open()
        # register our close method
        if atexit:
            register(self.close)

    def open(self):
        # create a temp file logger to store log entries
        self.fd, self.filename = mkstemp()
        FileHandler.__init__(self, self.filename, 'w', encoding=self.charset)
        self.closed = False

    def setLevel(self, lvl):
        self.mailer.setLevel(lvl)
        FileHandler.setLevel(self, lvl)

    def emit(self, record):
        if self.closed:
            return

        if record.levelno > self.maxlevelno:
            self.maxlevelno = record.levelno

        self.message_count += 1
        if self.message_count > self.flood_level:
            if self.tail is None:
                self.tail = deque(maxlen=5)
            self.tail.append(record)
        else:
            FileHandler.emit(self, record)

    def close(self):
        if self.closed:
            return

        if self.message_count > self.flood_level:
            hidden = self.message_count - self.flood_level - len(self.tail)
            if hidden:
                # send critical error
                FileHandler.emit(self, LogRecord(
                    name='flood',
                    level=CRITICAL,
                    pathname='',
                    lineno=0,
                    msg=flood_template % (
                        self.message_count - self.flood_level - len(self.tail),
                        self.flood_level
                    ),
                    args=(),
                    exc_info=None
                ))
            for record in self.tail:
                FileHandler.emit(self, record)

        FileHandler.close(self)
        f = os.fdopen(self.fd)
        summary = f.read().decode(self.charset)
        f.close()
        # try and encode in ascii, to keep emails simpler:
        try:
            summary = summary.encode('ascii')
        except UnicodeEncodeError:
            # unicode it is then
            pass
        if os.path.exists(self.filename):
            os.remove(self.filename)
        if self.send_level is None or self.maxlevelno >= self.send_level:
            self.mailer.handle(
                LogRecord(
                    name='Summary',
                    level=self.maxlevelno,
                    pathname='',
                    lineno=0,
                    msg=summary,
                    args=(),
                    exc_info=None
                )
            )
        self.closed = True

    def reopen(self):
        self.close()
        self.open()
Example #20
0
class SummarisingLogger(FileHandler):

    maxlevelno = 0

    def __init__(self,
                 fromaddr,
                 toaddrs,
                 mailhost='localhost',
                 subject='Summary of Log Messages (%(levelname)s)',
                 send_empty_entries=True,
                 atexit=True,
                 username=None,
                 password=None,
                 ignore=(),
                 headers=None,
                 send_level=None,
                 template=None,
                 charset='utf-8',
                 content_type='text/plain'):
        # create the "real" mailinglogger
        self.mailer = MailingLogger(fromaddr,
                                    toaddrs,
                                    mailhost,
                                    subject,
                                    send_empty_entries,
                                    username=username,
                                    password=password,
                                    headers=headers,
                                    template=template,
                                    charset=charset,
                                    content_type=content_type)
        # set the mailing logger's log format
        self.mailer.setFormatter(Formatter('%(message)s'))
        self.ignore = process_ignore(ignore)
        self.send_level = send_level
        self.charset = charset
        self.open()
        # register our close method
        if atexit:
            register(self.close)

    def open(self):
        # create a temp file logger to store log entries
        self.fd, self.filename = mkstemp()
        FileHandler.__init__(self, self.filename, 'w', encoding=self.charset)
        self.closed = False

    def setLevel(self, lvl):
        self.mailer.setLevel(lvl)
        FileHandler.setLevel(self, lvl)

    def emit(self, record):
        if self.closed:
            return

        for criterion in self.ignore:
            if criterion(record.msg):
                return

        if record.levelno > self.maxlevelno:
            self.maxlevelno = record.levelno
        FileHandler.emit(self, record)

    def close(self):
        if self.closed:
            return
        FileHandler.close(self)
        f = os.fdopen(self.fd)
        summary = f.read().decode(self.charset)
        f.close()
        # try and encode in ascii, to keep emails simpler:
        try:
            summary = summary.encode('ascii')
        except UnicodeEncodeError:
            # unicode it is then
            pass
        if os.path.exists(self.filename):
            os.remove(self.filename)
        if self.send_level is None or self.maxlevelno >= self.send_level:
            self.mailer.handle(
                LogRecord(name='Summary',
                          level=self.maxlevelno,
                          pathname='',
                          lineno=0,
                          msg=summary,
                          args=(),
                          exc_info=None))
        self.closed = True

    def reopen(self):
        self.close()
        self.open()