| Index: third_party/twisted_8_1/twisted/python/log.py
|
| diff --git a/third_party/twisted_8_1/twisted/python/log.py b/third_party/twisted_8_1/twisted/python/log.py
|
| deleted file mode 100644
|
| index 37514f47c70ef2ed9f1c77d10d6f16c7bebc5ef8..0000000000000000000000000000000000000000
|
| --- a/third_party/twisted_8_1/twisted/python/log.py
|
| +++ /dev/null
|
| @@ -1,584 +0,0 @@
|
| -# -*- test-case-name: twisted.test.test_log -*-
|
| -# Copyright (c) 2001-2007 Twisted Matrix Laboratories.
|
| -# See LICENSE for details.
|
| -
|
| -"""
|
| -Logging and metrics infrastructure.
|
| -"""
|
| -
|
| -from __future__ import division
|
| -
|
| -# System Imports
|
| -import sys
|
| -import time
|
| -import warnings
|
| -from datetime import datetime
|
| -import logging
|
| -
|
| -# Sibling Imports
|
| -from twisted.python import util, context, reflect
|
| -
|
| -class ILogContext:
|
| - """
|
| - Actually, this interface is just a synoym for the dictionary interface,
|
| - but it serves as a key for the default information in a log.
|
| -
|
| - I do not inherit from Interface because the world is a cruel place.
|
| - """
|
| -
|
| -context.setDefault(ILogContext,
|
| - {"isError": 0,
|
| - "system": "-"})
|
| -
|
| -def callWithContext(ctx, func, *args, **kw):
|
| - newCtx = context.get(ILogContext).copy()
|
| - newCtx.update(ctx)
|
| - return context.call({ILogContext: newCtx}, func, *args, **kw)
|
| -
|
| -def callWithLogger(logger, func, *args, **kw):
|
| - """
|
| - Utility method which wraps a function in a try:/except:, logs a failure if
|
| - one occurrs, and uses the system's logPrefix.
|
| - """
|
| - try:
|
| - lp = logger.logPrefix()
|
| - except KeyboardInterrupt:
|
| - raise
|
| - except:
|
| - lp = '(buggy logPrefix method)'
|
| - err(system=lp)
|
| - try:
|
| - return callWithContext({"system": lp}, func, *args, **kw)
|
| - except KeyboardInterrupt:
|
| - raise
|
| - except:
|
| - err(system=lp)
|
| -
|
| -def showwarning(message, category, filename, lineno, file=None):
|
| - if file is None:
|
| - msg(warning=message, category=reflect.qual(category), filename=filename, lineno=lineno,
|
| - format="%(filename)s:%(lineno)s: %(category)s: %(warning)s")
|
| - else:
|
| - _oldshowwarning(message, category, filename, lineno, file)
|
| -
|
| -_keepErrors = 0
|
| -_keptErrors = []
|
| -_ignoreErrors = []
|
| -
|
| -def startKeepingErrors():
|
| - """
|
| - DEPRECATED in Twisted 2.5.
|
| -
|
| - Support function for testing frameworks.
|
| -
|
| - Start keeping errors in a buffer which can be retrieved (and emptied) with
|
| - flushErrors.
|
| - """
|
| - warnings.warn("log.startKeepingErrors is deprecated since Twisted 2.5",
|
| - category=DeprecationWarning, stacklevel=2)
|
| - global _keepErrors
|
| - _keepErrors = 1
|
| -
|
| -
|
| -def flushErrors(*errorTypes):
|
| - """
|
| - DEPRECATED in Twisted 2.5. See L{TestCase.flushLoggedErrors}.
|
| -
|
| - Support function for testing frameworks.
|
| -
|
| - Return a list of errors that occurred since the last call to flushErrors().
|
| - (This will return None unless startKeepingErrors has been called.)
|
| - """
|
| -
|
| - warnings.warn("log.flushErrors is deprecated since Twisted 2.5. "
|
| - "If you need to flush errors from within a unittest, "
|
| - "use TestCase.flushLoggedErrors instead.",
|
| - category=DeprecationWarning, stacklevel=2)
|
| - return _flushErrors(*errorTypes)
|
| -
|
| -
|
| -def _flushErrors(*errorTypes):
|
| - """
|
| - PRIVATE. DEPRECATED. DON'T USE.
|
| - """
|
| - global _keptErrors
|
| - k = _keptErrors
|
| - _keptErrors = []
|
| - if errorTypes:
|
| - for erk in k:
|
| - shouldReLog = 1
|
| - for errT in errorTypes:
|
| - if erk.check(errT):
|
| - shouldReLog = 0
|
| - if shouldReLog:
|
| - err(erk)
|
| - return k
|
| -
|
| -def ignoreErrors(*types):
|
| - """
|
| - DEPRECATED
|
| - """
|
| - warnings.warn("log.ignoreErrors is deprecated since Twisted 2.5",
|
| - category=DeprecationWarning, stacklevel=2)
|
| - _ignore(*types)
|
| -
|
| -def _ignore(*types):
|
| - """
|
| - PRIVATE. DEPRECATED. DON'T USE.
|
| - """
|
| - for type in types:
|
| - _ignoreErrors.append(type)
|
| -
|
| -def clearIgnores():
|
| - """
|
| - DEPRECATED
|
| - """
|
| - warnings.warn("log.clearIgnores is deprecated since Twisted 2.5",
|
| - category=DeprecationWarning, stacklevel=2)
|
| - _clearIgnores()
|
| -
|
| -def _clearIgnores():
|
| - """
|
| - PRIVATE. DEPRECATED. DON'T USE.
|
| - """
|
| - global _ignoreErrors
|
| - _ignoreErrors = []
|
| -
|
| -
|
| -def err(_stuff=None, _why=None, **kw):
|
| - """
|
| - Write a failure to the log.
|
| - """
|
| - if _stuff is None:
|
| - _stuff = failure.Failure()
|
| - if isinstance(_stuff, failure.Failure):
|
| - if _keepErrors:
|
| - if _ignoreErrors:
|
| - keep = 0
|
| - for err in _ignoreErrors:
|
| - r = _stuff.check(err)
|
| - if r:
|
| - keep = 0
|
| - break
|
| - else:
|
| - keep = 1
|
| - if keep:
|
| - _keptErrors.append(_stuff)
|
| - else:
|
| - _keptErrors.append(_stuff)
|
| - msg(failure=_stuff, why=_why, isError=1, **kw)
|
| - elif isinstance(_stuff, Exception):
|
| - msg(failure=failure.Failure(_stuff), why=_why, isError=1, **kw)
|
| - else:
|
| - msg(repr(_stuff), why=_why, isError=1, **kw)
|
| -
|
| -deferr = err
|
| -
|
| -
|
| -class Logger:
|
| - """
|
| - This represents a class which may 'own' a log. Used by subclassing.
|
| - """
|
| - def logPrefix(self):
|
| - """
|
| - Override this method to insert custom logging behavior. Its
|
| - return value will be inserted in front of every line. It may
|
| - be called more times than the number of output lines.
|
| - """
|
| - return '-'
|
| -
|
| -
|
| -class LogPublisher:
|
| - """
|
| - Class for singleton log message publishing.
|
| - """
|
| -
|
| - synchronized = ['msg']
|
| -
|
| - def __init__(self):
|
| - self.observers = []
|
| -
|
| - def addObserver(self, other):
|
| - """
|
| - Add a new observer.
|
| -
|
| - Observers are callable objects that will be called with each new log
|
| - message (a dict).
|
| - """
|
| - assert callable(other)
|
| - self.observers.append(other)
|
| -
|
| - def removeObserver(self, other):
|
| - """
|
| - Remove an observer.
|
| - """
|
| - self.observers.remove(other)
|
| -
|
| - def msg(self, *message, **kw):
|
| - """
|
| - Log a new message.
|
| -
|
| - For example::
|
| -
|
| - >>> log.msg('Hello, world.')
|
| -
|
| - In particular, you MUST avoid the forms::
|
| -
|
| - >>> log.msg(u'Hello, world.')
|
| - >>> log.msg('Hello ', 'world.')
|
| -
|
| - These forms work (sometimes) by accident and will be disabled
|
| - entirely in the future.
|
| - """
|
| - actualEventDict = (context.get(ILogContext) or {}).copy()
|
| - actualEventDict.update(kw)
|
| - actualEventDict['message'] = message
|
| - actualEventDict['time'] = time.time()
|
| - for i in xrange(len(self.observers) - 1, -1, -1):
|
| - try:
|
| - self.observers[i](actualEventDict)
|
| - except KeyboardInterrupt:
|
| - # Don't swallow keyboard interrupt!
|
| - raise
|
| - except UnicodeEncodeError:
|
| - raise
|
| - except:
|
| - o = self.observers.pop(i)
|
| - err(failure.Failure(),
|
| - "Log observer %s failed, removing from observer list." % (o,))
|
| -
|
| -
|
| -try:
|
| - theLogPublisher
|
| -except NameError:
|
| - theLogPublisher = LogPublisher()
|
| - addObserver = theLogPublisher.addObserver
|
| - removeObserver = theLogPublisher.removeObserver
|
| - msg = theLogPublisher.msg
|
| -
|
| -
|
| -def _safeFormat(fmtString, fmtDict):
|
| - """
|
| - Try to format the string C{fmtString} using C{fmtDict} arguments,
|
| - swallowing all errors to always return a string.
|
| - """
|
| - # There's a way we could make this if not safer at least more
|
| - # informative: perhaps some sort of str/repr wrapper objects
|
| - # could be wrapped around the things inside of C{fmtDict}. That way
|
| - # if the event dict contains an object with a bad __repr__, we
|
| - # can only cry about that individual object instead of the
|
| - # entire event dict.
|
| - try:
|
| - text = fmtString % fmtDict
|
| - except KeyboardInterrupt:
|
| - raise
|
| - except:
|
| - try:
|
| - text = ('Invalid format string or unformattable object in log message: %r, %s' % (fmtString, fmtDict))
|
| - except:
|
| - try:
|
| - text = 'UNFORMATTABLE OBJECT WRITTEN TO LOG with fmt %r, MESSAGE LOST' % (fmtString,)
|
| - except:
|
| - text = 'PATHOLOGICAL ERROR IN BOTH FORMAT STRING AND MESSAGE DETAILS, MESSAGE LOST'
|
| - return text
|
| -
|
| -
|
| -def textFromEventDict(eventDict):
|
| - """
|
| - Extract text from an event dict passed to a log observer. If it cannot
|
| - handle the dict, it returns None.
|
| -
|
| - The possible keys of eventDict are:
|
| - - C{message}: by default, it holds the final text. It's required, but can
|
| - be empty if either C{isError} or C{format} is provided (the first
|
| - having the priority).
|
| - - C{isError}: boolean indicating the nature of the event.
|
| - - C{failure}: L{failure.Failure} instance, required if the event is an
|
| - error.
|
| - - C{why}: if defined, used as header of the traceback in case of errors.
|
| - - C{format}: string format used in place of C{message} to customize
|
| - the event. It uses all keys present in C{eventDict} to format
|
| - the text.
|
| - Other keys will be used when applying the C{format}, or ignored.
|
| - """
|
| - edm = eventDict['message']
|
| - if not edm:
|
| - if eventDict['isError'] and 'failure' in eventDict:
|
| - text = ((eventDict.get('why') or 'Unhandled Error')
|
| - + '\n' + eventDict['failure'].getTraceback())
|
| - elif 'format' in eventDict:
|
| - text = _safeFormat(eventDict['format'], eventDict)
|
| - else:
|
| - # we don't know how to log this
|
| - return
|
| - else:
|
| - text = ' '.join(map(reflect.safe_str, edm))
|
| - return text
|
| -
|
| -
|
| -class FileLogObserver:
|
| - """
|
| - Log observer that writes to a file-like object.
|
| -
|
| - @type timeFormat: C{str} or C{NoneType}
|
| - @ivar timeFormat: If not C{None}, the format string passed to strftime().
|
| - """
|
| - timeFormat = None
|
| -
|
| - def __init__(self, f):
|
| - self.write = f.write
|
| - self.flush = f.flush
|
| -
|
| - def getTimezoneOffset(self, when):
|
| - """
|
| - Return the current local timezone offset from UTC.
|
| -
|
| - @type when: C{int}
|
| - @param when: POSIX (ie, UTC) timestamp for which to find the offset.
|
| -
|
| - @rtype: C{int}
|
| - @return: The number of seconds offset from UTC. West is positive,
|
| - east is negative.
|
| - """
|
| - offset = datetime.utcfromtimestamp(when) - datetime.fromtimestamp(when)
|
| - return offset.days * (60 * 60 * 24) + offset.seconds
|
| -
|
| - def formatTime(self, when):
|
| - """
|
| - Format the given UTC value as a string representing that time in the
|
| - local timezone.
|
| -
|
| - By default it's formatted as a ISO8601-like string (ISO8601 date and
|
| - ISO8601 time separated by a space). It can be customized using the
|
| - C{timeFormat} attribute, which will be used as input for the underlying
|
| - C{time.strftime} call.
|
| -
|
| - @type when: C{int}
|
| - @param when: POSIX (ie, UTC) timestamp for which to find the offset.
|
| -
|
| - @rtype: C{str}
|
| - """
|
| - if self.timeFormat is not None:
|
| - return time.strftime(self.timeFormat, time.localtime(when))
|
| -
|
| - tzOffset = -self.getTimezoneOffset(when)
|
| - when = datetime.utcfromtimestamp(when + tzOffset)
|
| - tzHour = int(tzOffset / 60 / 60)
|
| - tzMin = int(tzOffset / 60 % 60)
|
| - return '%d-%02d-%02d %02d:%02d:%02d%+03d%02d' % (
|
| - when.year, when.month, when.day,
|
| - when.hour, when.minute, when.second,
|
| - tzHour, tzMin)
|
| -
|
| - def emit(self, eventDict):
|
| - text = textFromEventDict(eventDict)
|
| - if text is None:
|
| - return
|
| -
|
| - timeStr = self.formatTime(eventDict['time'])
|
| - fmtDict = {'system': eventDict['system'], 'text': text.replace("\n", "\n\t")}
|
| - msgStr = _safeFormat("[%(system)s] %(text)s\n", fmtDict)
|
| -
|
| - util.untilConcludes(self.write, timeStr + " " + msgStr)
|
| - util.untilConcludes(self.flush) # Hoorj!
|
| -
|
| - def start(self):
|
| - """
|
| - Start observing log events.
|
| - """
|
| - addObserver(self.emit)
|
| -
|
| - def stop(self):
|
| - """
|
| - Stop observing log events.
|
| - """
|
| - removeObserver(self.emit)
|
| -
|
| -
|
| -class PythonLoggingObserver(object):
|
| - """
|
| - Output twisted messages to Python standard library L{logging} module.
|
| -
|
| - WARNING: specific logging configurations (example: network) can lead to
|
| - a blocking system. Nothing is done here to prevent that, so be sure to not
|
| - use this: code within Twisted, such as twisted.web, assumes that logging
|
| - does not block.
|
| - """
|
| -
|
| - def __init__(self, loggerName="twisted"):
|
| - """
|
| - @param loggerName: identifier used for getting logger.
|
| - @type loggerName: C{str}
|
| - """
|
| - self.logger = logging.getLogger(loggerName)
|
| -
|
| - def emit(self, eventDict):
|
| - """
|
| - Receive a twisted log entry, format it and bridge it to python.
|
| -
|
| - By default the logging level used is info; log.err produces error
|
| - level, and you can customize the level by using the C{logLevel} key::
|
| -
|
| - >>> log.msg('debugging', logLevel=logging.DEBUG)
|
| -
|
| - """
|
| - if 'logLevel' in eventDict:
|
| - level = eventDict['logLevel']
|
| - elif eventDict['isError']:
|
| - level = logging.ERROR
|
| - else:
|
| - level = logging.INFO
|
| - text = textFromEventDict(eventDict)
|
| - if text is None:
|
| - return
|
| - self.logger.log(level, text)
|
| -
|
| - def start(self):
|
| - """
|
| - Start observing log events.
|
| - """
|
| - addObserver(self.emit)
|
| -
|
| - def stop(self):
|
| - """
|
| - Stop observing log events.
|
| - """
|
| - removeObserver(self.emit)
|
| -
|
| -
|
| -class StdioOnnaStick:
|
| - """
|
| - Class that pretends to be stout/err.
|
| - """
|
| -
|
| - closed = 0
|
| - softspace = 0
|
| - mode = 'wb'
|
| - name = '<stdio (log)>'
|
| -
|
| - def __init__(self, isError=0):
|
| - self.isError = isError
|
| - self.buf = ''
|
| -
|
| - def close(self):
|
| - pass
|
| -
|
| - def fileno(self):
|
| - return -1
|
| -
|
| - def flush(self):
|
| - pass
|
| -
|
| - def read(self):
|
| - raise IOError("can't read from the log!")
|
| -
|
| - readline = read
|
| - readlines = read
|
| - seek = read
|
| - tell = read
|
| -
|
| - def write(self, data):
|
| - d = (self.buf + data).split('\n')
|
| - self.buf = d[-1]
|
| - messages = d[0:-1]
|
| - for message in messages:
|
| - msg(message, printed=1, isError=self.isError)
|
| -
|
| - def writelines(self, lines):
|
| - for line in lines:
|
| - msg(line, printed=1, isError=self.isError)
|
| -
|
| -
|
| -try:
|
| - _oldshowwarning
|
| -except NameError:
|
| - _oldshowwarning = None
|
| -
|
| -
|
| -def startLogging(file, *a, **kw):
|
| - """
|
| - Initialize logging to a specified file.
|
| - """
|
| - flo = FileLogObserver(file)
|
| - startLoggingWithObserver(flo.emit, *a, **kw)
|
| -
|
| -def startLoggingWithObserver(observer, setStdout=1):
|
| - """
|
| - Initialize logging to a specified observer. If setStdout is true
|
| - (defaults to yes), also redirect sys.stdout and sys.stderr
|
| - to the specified file.
|
| - """
|
| - global defaultObserver, _oldshowwarning
|
| - if not _oldshowwarning:
|
| - _oldshowwarning = warnings.showwarning
|
| - warnings.showwarning = showwarning
|
| - if defaultObserver:
|
| - defaultObserver.stop()
|
| - defaultObserver = None
|
| - addObserver(observer)
|
| - msg("Log opened.")
|
| - if setStdout:
|
| - sys.stdout = logfile
|
| - sys.stderr = logerr
|
| -
|
| -
|
| -class NullFile:
|
| - softspace = 0
|
| - def read(self): pass
|
| - def write(self, bytes): pass
|
| - def flush(self): pass
|
| - def close(self): pass
|
| -
|
| -
|
| -def discardLogs():
|
| - """
|
| - Throw away all logs.
|
| - """
|
| - global logfile
|
| - logfile = NullFile()
|
| -
|
| -
|
| -# Prevent logfile from being erased on reload. This only works in cpython.
|
| -try:
|
| - logfile
|
| -except NameError:
|
| - logfile = StdioOnnaStick(0)
|
| - logerr = StdioOnnaStick(1)
|
| -
|
| -
|
| -class DefaultObserver:
|
| - """
|
| - Default observer.
|
| -
|
| - Will ignore all non-error messages and send error messages to sys.stderr.
|
| - Will be removed when startLogging() is called for the first time.
|
| - """
|
| -
|
| - def _emit(self, eventDict):
|
| - if eventDict["isError"]:
|
| - if 'failure' in eventDict:
|
| - text = eventDict['failure'].getTraceback()
|
| - else:
|
| - text = " ".join([str(m) for m in eventDict["message"]]) + "\n"
|
| - sys.stderr.write(text)
|
| - sys.stderr.flush()
|
| -
|
| - def start(self):
|
| - addObserver(self._emit)
|
| -
|
| - def stop(self):
|
| - removeObserver(self._emit)
|
| -
|
| -
|
| -# Some more sibling imports, at the bottom and unqualified to avoid
|
| -# unresolvable circularity
|
| -import threadable, failure
|
| -threadable.synchronize(LogPublisher)
|
| -
|
| -
|
| -try:
|
| - defaultObserver
|
| -except NameError:
|
| - defaultObserver = DefaultObserver()
|
| - defaultObserver.start()
|
| -
|
|
|