Current File : /home/mmdealscpanel/yummmdeals.com/logging.tar
__init__.py000064400000230204150327210140006651 0ustar00# Copyright 2001-2017 by Vinay Sajip. All Rights Reserved.
#
# Permission to use, copy, modify, and distribute this software and its
# documentation for any purpose and without fee is hereby granted,
# provided that the above copyright notice appear in all copies and that
# both that copyright notice and this permission notice appear in
# supporting documentation, and that the name of Vinay Sajip
# not be used in advertising or publicity pertaining to distribution
# of the software without specific, written prior permission.
# VINAY SAJIP DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
# ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL
# VINAY SAJIP BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
# ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER
# IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.

"""
Logging package for Python. Based on PEP 282 and comments thereto in
comp.lang.python.

Copyright (C) 2001-2017 Vinay Sajip. All Rights Reserved.

To use, simply 'import logging' and log away!
"""

import sys, os, time, io, re, traceback, warnings, weakref, collections.abc

from string import Template
from string import Formatter as StrFormatter


__all__ = ['BASIC_FORMAT', 'BufferingFormatter', 'CRITICAL', 'DEBUG', 'ERROR',
           'FATAL', 'FileHandler', 'Filter', 'Formatter', 'Handler', 'INFO',
           'LogRecord', 'Logger', 'LoggerAdapter', 'NOTSET', 'NullHandler',
           'StreamHandler', 'WARN', 'WARNING', 'addLevelName', 'basicConfig',
           'captureWarnings', 'critical', 'debug', 'disable', 'error',
           'exception', 'fatal', 'getLevelName', 'getLogger', 'getLoggerClass',
           'info', 'log', 'makeLogRecord', 'setLoggerClass', 'shutdown',
           'warn', 'warning', 'getLogRecordFactory', 'setLogRecordFactory',
           'lastResort', 'raiseExceptions']

import threading

__author__  = "Vinay Sajip <vinay_sajip@red-dove.com>"
__status__  = "production"
# The following module attributes are no longer updated.
__version__ = "0.5.1.2"
__date__    = "07 February 2010"

#---------------------------------------------------------------------------
#   Miscellaneous module data
#---------------------------------------------------------------------------

#
#_startTime is used as the base when calculating the relative time of events
#
_startTime = time.time()

#
#raiseExceptions is used to see if exceptions during handling should be
#propagated
#
raiseExceptions = True

#
# If you don't want threading information in the log, set this to zero
#
logThreads = True

#
# If you don't want multiprocessing information in the log, set this to zero
#
logMultiprocessing = True

#
# If you don't want process information in the log, set this to zero
#
logProcesses = True

#---------------------------------------------------------------------------
#   Level related stuff
#---------------------------------------------------------------------------
#
# Default levels and level names, these can be replaced with any positive set
# of values having corresponding names. There is a pseudo-level, NOTSET, which
# is only really there as a lower limit for user-defined levels. Handlers and
# loggers are initialized with NOTSET so that they will log all messages, even
# at user-defined levels.
#

CRITICAL = 50
FATAL = CRITICAL
ERROR = 40
WARNING = 30
WARN = WARNING
INFO = 20
DEBUG = 10
NOTSET = 0

_levelToName = {
    CRITICAL: 'CRITICAL',
    ERROR: 'ERROR',
    WARNING: 'WARNING',
    INFO: 'INFO',
    DEBUG: 'DEBUG',
    NOTSET: 'NOTSET',
}
_nameToLevel = {
    'CRITICAL': CRITICAL,
    'FATAL': FATAL,
    'ERROR': ERROR,
    'WARN': WARNING,
    'WARNING': WARNING,
    'INFO': INFO,
    'DEBUG': DEBUG,
    'NOTSET': NOTSET,
}

def getLevelName(level):
    """
    Return the textual or numeric representation of logging level 'level'.

    If the level is one of the predefined levels (CRITICAL, ERROR, WARNING,
    INFO, DEBUG) then you get the corresponding string. If you have
    associated levels with names using addLevelName then the name you have
    associated with 'level' is returned.

    If a numeric value corresponding to one of the defined levels is passed
    in, the corresponding string representation is returned.

    If a string representation of the level is passed in, the corresponding
    numeric value is returned.

    If no matching numeric or string value is passed in, the string
    'Level %s' % level is returned.
    """
    # See Issues #22386, #27937 and #29220 for why it's this way
    result = _levelToName.get(level)
    if result is not None:
        return result
    result = _nameToLevel.get(level)
    if result is not None:
        return result
    return "Level %s" % level

def addLevelName(level, levelName):
    """
    Associate 'levelName' with 'level'.

    This is used when converting levels to text during message formatting.
    """
    _acquireLock()
    try:    #unlikely to cause an exception, but you never know...
        _levelToName[level] = levelName
        _nameToLevel[levelName] = level
    finally:
        _releaseLock()

if hasattr(sys, '_getframe'):
    currentframe = lambda: sys._getframe(3)
else: #pragma: no cover
    def currentframe():
        """Return the frame object for the caller's stack frame."""
        try:
            raise Exception
        except Exception:
            return sys.exc_info()[2].tb_frame.f_back

#
# _srcfile is used when walking the stack to check when we've got the first
# caller stack frame, by skipping frames whose filename is that of this
# module's source. It therefore should contain the filename of this module's
# source file.
#
# Ordinarily we would use __file__ for this, but frozen modules don't always
# have __file__ set, for some reason (see Issue #21736). Thus, we get the
# filename from a handy code object from a function defined in this module.
# (There's no particular reason for picking addLevelName.)
#

_srcfile = os.path.normcase(addLevelName.__code__.co_filename)

# _srcfile is only used in conjunction with sys._getframe().
# To provide compatibility with older versions of Python, set _srcfile
# to None if _getframe() is not available; this value will prevent
# findCaller() from being called. You can also do this if you want to avoid
# the overhead of fetching caller information, even when _getframe() is
# available.
#if not hasattr(sys, '_getframe'):
#    _srcfile = None


def _checkLevel(level):
    if isinstance(level, int):
        rv = level
    elif str(level) == level:
        if level not in _nameToLevel:
            raise ValueError("Unknown level: %r" % level)
        rv = _nameToLevel[level]
    else:
        raise TypeError("Level not an integer or a valid string: %r" % level)
    return rv

#---------------------------------------------------------------------------
#   Thread-related stuff
#---------------------------------------------------------------------------

#
#_lock is used to serialize access to shared data structures in this module.
#This needs to be an RLock because fileConfig() creates and configures
#Handlers, and so might arbitrary user threads. Since Handler code updates the
#shared dictionary _handlers, it needs to acquire the lock. But if configuring,
#the lock would already have been acquired - so we need an RLock.
#The same argument applies to Loggers and Manager.loggerDict.
#
_lock = threading.RLock()

def _acquireLock():
    """
    Acquire the module-level lock for serializing access to shared data.

    This should be released with _releaseLock().
    """
    if _lock:
        _lock.acquire()

def _releaseLock():
    """
    Release the module-level lock acquired by calling _acquireLock().
    """
    if _lock:
        _lock.release()


# Prevent a held logging lock from blocking a child from logging.

if not hasattr(os, 'register_at_fork'):  # Windows and friends.
    def _register_at_fork_reinit_lock(instance):
        pass  # no-op when os.register_at_fork does not exist.
else:
    # A collection of instances with a createLock method (logging.Handler)
    # to be called in the child after forking.  The weakref avoids us keeping
    # discarded Handler instances alive.  A set is used to avoid accumulating
    # duplicate registrations as createLock() is responsible for registering
    # a new Handler instance with this set in the first place.
    _at_fork_reinit_lock_weakset = weakref.WeakSet()

    def _register_at_fork_reinit_lock(instance):
        _acquireLock()
        try:
            _at_fork_reinit_lock_weakset.add(instance)
        finally:
            _releaseLock()

    def _after_at_fork_child_reinit_locks():
        # _acquireLock() was called in the parent before forking.
        for handler in _at_fork_reinit_lock_weakset:
            try:
                handler.createLock()
            except Exception as err:
                # Similar to what PyErr_WriteUnraisable does.
                print("Ignoring exception from logging atfork", instance,
                      "._reinit_lock() method:", err, file=sys.stderr)
        _releaseLock()  # Acquired by os.register_at_fork(before=.


    os.register_at_fork(before=_acquireLock,
                        after_in_child=_after_at_fork_child_reinit_locks,
                        after_in_parent=_releaseLock)


#---------------------------------------------------------------------------
#   The logging record
#---------------------------------------------------------------------------

class LogRecord(object):
    """
    A LogRecord instance represents an event being logged.

    LogRecord instances are created every time something is logged. They
    contain all the information pertinent to the event being logged. The
    main information passed in is in msg and args, which are combined
    using str(msg) % args to create the message field of the record. The
    record also includes information such as when the record was created,
    the source line where the logging call was made, and any exception
    information to be logged.
    """
    def __init__(self, name, level, pathname, lineno,
                 msg, args, exc_info, func=None, sinfo=None, **kwargs):
        """
        Initialize a logging record with interesting information.
        """
        ct = time.time()
        self.name = name
        self.msg = msg
        #
        # The following statement allows passing of a dictionary as a sole
        # argument, so that you can do something like
        #  logging.debug("a %(a)d b %(b)s", {'a':1, 'b':2})
        # Suggested by Stefan Behnel.
        # Note that without the test for args[0], we get a problem because
        # during formatting, we test to see if the arg is present using
        # 'if self.args:'. If the event being logged is e.g. 'Value is %d'
        # and if the passed arg fails 'if self.args:' then no formatting
        # is done. For example, logger.warning('Value is %d', 0) would log
        # 'Value is %d' instead of 'Value is 0'.
        # For the use case of passing a dictionary, this should not be a
        # problem.
        # Issue #21172: a request was made to relax the isinstance check
        # to hasattr(args[0], '__getitem__'). However, the docs on string
        # formatting still seem to suggest a mapping object is required.
        # Thus, while not removing the isinstance check, it does now look
        # for collections.abc.Mapping rather than, as before, dict.
        if (args and len(args) == 1 and isinstance(args[0], collections.abc.Mapping)
            and args[0]):
            args = args[0]
        self.args = args
        self.levelname = getLevelName(level)
        self.levelno = level
        self.pathname = pathname
        try:
            self.filename = os.path.basename(pathname)
            self.module = os.path.splitext(self.filename)[0]
        except (TypeError, ValueError, AttributeError):
            self.filename = pathname
            self.module = "Unknown module"
        self.exc_info = exc_info
        self.exc_text = None      # used to cache the traceback text
        self.stack_info = sinfo
        self.lineno = lineno
        self.funcName = func
        self.created = ct
        self.msecs = (ct - int(ct)) * 1000
        self.relativeCreated = (self.created - _startTime) * 1000
        if logThreads:
            self.thread = threading.get_ident()
            self.threadName = threading.current_thread().name
        else: # pragma: no cover
            self.thread = None
            self.threadName = None
        if not logMultiprocessing: # pragma: no cover
            self.processName = None
        else:
            self.processName = 'MainProcess'
            mp = sys.modules.get('multiprocessing')
            if mp is not None:
                # Errors may occur if multiprocessing has not finished loading
                # yet - e.g. if a custom import hook causes third-party code
                # to run when multiprocessing calls import. See issue 8200
                # for an example
                try:
                    self.processName = mp.current_process().name
                except Exception: #pragma: no cover
                    pass
        if logProcesses and hasattr(os, 'getpid'):
            self.process = os.getpid()
        else:
            self.process = None

    def __repr__(self):
        return '<LogRecord: %s, %s, %s, %s, "%s">'%(self.name, self.levelno,
            self.pathname, self.lineno, self.msg)

    def getMessage(self):
        """
        Return the message for this LogRecord.

        Return the message for this LogRecord after merging any user-supplied
        arguments with the message.
        """
        msg = str(self.msg)
        if self.args:
            msg = msg % self.args
        return msg

#
#   Determine which class to use when instantiating log records.
#
_logRecordFactory = LogRecord

def setLogRecordFactory(factory):
    """
    Set the factory to be used when instantiating a log record.

    :param factory: A callable which will be called to instantiate
    a log record.
    """
    global _logRecordFactory
    _logRecordFactory = factory

def getLogRecordFactory():
    """
    Return the factory to be used when instantiating a log record.
    """

    return _logRecordFactory

def makeLogRecord(dict):
    """
    Make a LogRecord whose attributes are defined by the specified dictionary,
    This function is useful for converting a logging event received over
    a socket connection (which is sent as a dictionary) into a LogRecord
    instance.
    """
    rv = _logRecordFactory(None, None, "", 0, "", (), None, None)
    rv.__dict__.update(dict)
    return rv


#---------------------------------------------------------------------------
#   Formatter classes and functions
#---------------------------------------------------------------------------
_str_formatter = StrFormatter()
del StrFormatter


class PercentStyle(object):

    default_format = '%(message)s'
    asctime_format = '%(asctime)s'
    asctime_search = '%(asctime)'
    validation_pattern = re.compile(r'%\(\w+\)[#0+ -]*(\*|\d+)?(\.(\*|\d+))?[diouxefgcrsa%]', re.I)

    def __init__(self, fmt):
        self._fmt = fmt or self.default_format

    def usesTime(self):
        return self._fmt.find(self.asctime_search) >= 0

    def validate(self):
        """Validate the input format, ensure it matches the correct style"""
        if not self.validation_pattern.search(self._fmt):
            raise ValueError("Invalid format '%s' for '%s' style" % (self._fmt, self.default_format[0]))

    def _format(self, record):
        return self._fmt % record.__dict__

    def format(self, record):
        try:
            return self._format(record)
        except KeyError as e:
            raise ValueError('Formatting field not found in record: %s' % e)


class StrFormatStyle(PercentStyle):
    default_format = '{message}'
    asctime_format = '{asctime}'
    asctime_search = '{asctime'

    fmt_spec = re.compile(r'^(.?[<>=^])?[+ -]?#?0?(\d+|{\w+})?[,_]?(\.(\d+|{\w+}))?[bcdefgnosx%]?$', re.I)
    field_spec = re.compile(r'^(\d+|\w+)(\.\w+|\[[^]]+\])*$')

    def _format(self, record):
        return self._fmt.format(**record.__dict__)

    def validate(self):
        """Validate the input format, ensure it is the correct string formatting style"""
        fields = set()
        try:
            for _, fieldname, spec, conversion in _str_formatter.parse(self._fmt):
                if fieldname:
                    if not self.field_spec.match(fieldname):
                        raise ValueError('invalid field name/expression: %r' % fieldname)
                    fields.add(fieldname)
                if conversion and conversion not in 'rsa':
                    raise ValueError('invalid conversion: %r' % conversion)
                if spec and not self.fmt_spec.match(spec):
                    raise ValueError('bad specifier: %r' % spec)
        except ValueError as e:
            raise ValueError('invalid format: %s' % e)
        if not fields:
            raise ValueError('invalid format: no fields')


class StringTemplateStyle(PercentStyle):
    default_format = '${message}'
    asctime_format = '${asctime}'
    asctime_search = '${asctime}'

    def __init__(self, fmt):
        self._fmt = fmt or self.default_format
        self._tpl = Template(self._fmt)

    def usesTime(self):
        fmt = self._fmt
        return fmt.find('$asctime') >= 0 or fmt.find(self.asctime_format) >= 0

    def validate(self):
        pattern = Template.pattern
        fields = set()
        for m in pattern.finditer(self._fmt):
            d = m.groupdict()
            if d['named']:
                fields.add(d['named'])
            elif d['braced']:
                fields.add(d['braced'])
            elif m.group(0) == '$':
                raise ValueError('invalid format: bare \'$\' not allowed')
        if not fields:
            raise ValueError('invalid format: no fields')

    def _format(self, record):
        return self._tpl.substitute(**record.__dict__)


BASIC_FORMAT = "%(levelname)s:%(name)s:%(message)s"

_STYLES = {
    '%': (PercentStyle, BASIC_FORMAT),
    '{': (StrFormatStyle, '{levelname}:{name}:{message}'),
    '$': (StringTemplateStyle, '${levelname}:${name}:${message}'),
}

class Formatter(object):
    """
    Formatter instances are used to convert a LogRecord to text.

    Formatters need to know how a LogRecord is constructed. They are
    responsible for converting a LogRecord to (usually) a string which can
    be interpreted by either a human or an external system. The base Formatter
    allows a formatting string to be specified. If none is supplied, the
    style-dependent default value, "%(message)s", "{message}", or
    "${message}", is used.

    The Formatter can be initialized with a format string which makes use of
    knowledge of the LogRecord attributes - e.g. the default value mentioned
    above makes use of the fact that the user's message and arguments are pre-
    formatted into a LogRecord's message attribute. Currently, the useful
    attributes in a LogRecord are described by:

    %(name)s            Name of the logger (logging channel)
    %(levelno)s         Numeric logging level for the message (DEBUG, INFO,
                        WARNING, ERROR, CRITICAL)
    %(levelname)s       Text logging level for the message ("DEBUG", "INFO",
                        "WARNING", "ERROR", "CRITICAL")
    %(pathname)s        Full pathname of the source file where the logging
                        call was issued (if available)
    %(filename)s        Filename portion of pathname
    %(module)s          Module (name portion of filename)
    %(lineno)d          Source line number where the logging call was issued
                        (if available)
    %(funcName)s        Function name
    %(created)f         Time when the LogRecord was created (time.time()
                        return value)
    %(asctime)s         Textual time when the LogRecord was created
    %(msecs)d           Millisecond portion of the creation time
    %(relativeCreated)d Time in milliseconds when the LogRecord was created,
                        relative to the time the logging module was loaded
                        (typically at application startup time)
    %(thread)d          Thread ID (if available)
    %(threadName)s      Thread name (if available)
    %(process)d         Process ID (if available)
    %(message)s         The result of record.getMessage(), computed just as
                        the record is emitted
    """

    converter = time.localtime

    def __init__(self, fmt=None, datefmt=None, style='%', validate=True):
        """
        Initialize the formatter with specified format strings.

        Initialize the formatter either with the specified format string, or a
        default as described above. Allow for specialized date formatting with
        the optional datefmt argument. If datefmt is omitted, you get an
        ISO8601-like (or RFC 3339-like) format.

        Use a style parameter of '%', '{' or '$' to specify that you want to
        use one of %-formatting, :meth:`str.format` (``{}``) formatting or
        :class:`string.Template` formatting in your format string.

        .. versionchanged:: 3.2
           Added the ``style`` parameter.
        """
        if style not in _STYLES:
            raise ValueError('Style must be one of: %s' % ','.join(
                             _STYLES.keys()))
        self._style = _STYLES[style][0](fmt)
        if validate:
            self._style.validate()

        self._fmt = self._style._fmt
        self.datefmt = datefmt

    default_time_format = '%Y-%m-%d %H:%M:%S'
    default_msec_format = '%s,%03d'

    def formatTime(self, record, datefmt=None):
        """
        Return the creation time of the specified LogRecord as formatted text.

        This method should be called from format() by a formatter which
        wants to make use of a formatted time. This method can be overridden
        in formatters to provide for any specific requirement, but the
        basic behaviour is as follows: if datefmt (a string) is specified,
        it is used with time.strftime() to format the creation time of the
        record. Otherwise, an ISO8601-like (or RFC 3339-like) format is used.
        The resulting string is returned. This function uses a user-configurable
        function to convert the creation time to a tuple. By default,
        time.localtime() is used; to change this for a particular formatter
        instance, set the 'converter' attribute to a function with the same
        signature as time.localtime() or time.gmtime(). To change it for all
        formatters, for example if you want all logging times to be shown in GMT,
        set the 'converter' attribute in the Formatter class.
        """
        ct = self.converter(record.created)
        if datefmt:
            s = time.strftime(datefmt, ct)
        else:
            t = time.strftime(self.default_time_format, ct)
            s = self.default_msec_format % (t, record.msecs)
        return s

    def formatException(self, ei):
        """
        Format and return the specified exception information as a string.

        This default implementation just uses
        traceback.print_exception()
        """
        sio = io.StringIO()
        tb = ei[2]
        # See issues #9427, #1553375. Commented out for now.
        #if getattr(self, 'fullstack', False):
        #    traceback.print_stack(tb.tb_frame.f_back, file=sio)
        traceback.print_exception(ei[0], ei[1], tb, None, sio)
        s = sio.getvalue()
        sio.close()
        if s[-1:] == "\n":
            s = s[:-1]
        return s

    def usesTime(self):
        """
        Check if the format uses the creation time of the record.
        """
        return self._style.usesTime()

    def formatMessage(self, record):
        return self._style.format(record)

    def formatStack(self, stack_info):
        """
        This method is provided as an extension point for specialized
        formatting of stack information.

        The input data is a string as returned from a call to
        :func:`traceback.print_stack`, but with the last trailing newline
        removed.

        The base implementation just returns the value passed in.
        """
        return stack_info

    def format(self, record):
        """
        Format the specified record as text.

        The record's attribute dictionary is used as the operand to a
        string formatting operation which yields the returned string.
        Before formatting the dictionary, a couple of preparatory steps
        are carried out. The message attribute of the record is computed
        using LogRecord.getMessage(). If the formatting string uses the
        time (as determined by a call to usesTime(), formatTime() is
        called to format the event time. If there is exception information,
        it is formatted using formatException() and appended to the message.
        """
        record.message = record.getMessage()
        if self.usesTime():
            record.asctime = self.formatTime(record, self.datefmt)
        s = self.formatMessage(record)
        if record.exc_info:
            # Cache the traceback text to avoid converting it multiple times
            # (it's constant anyway)
            if not record.exc_text:
                record.exc_text = self.formatException(record.exc_info)
        if record.exc_text:
            if s[-1:] != "\n":
                s = s + "\n"
            s = s + record.exc_text
        if record.stack_info:
            if s[-1:] != "\n":
                s = s + "\n"
            s = s + self.formatStack(record.stack_info)
        return s

#
#   The default formatter to use when no other is specified
#
_defaultFormatter = Formatter()

class BufferingFormatter(object):
    """
    A formatter suitable for formatting a number of records.
    """
    def __init__(self, linefmt=None):
        """
        Optionally specify a formatter which will be used to format each
        individual record.
        """
        if linefmt:
            self.linefmt = linefmt
        else:
            self.linefmt = _defaultFormatter

    def formatHeader(self, records):
        """
        Return the header string for the specified records.
        """
        return ""

    def formatFooter(self, records):
        """
        Return the footer string for the specified records.
        """
        return ""

    def format(self, records):
        """
        Format the specified records and return the result as a string.
        """
        rv = ""
        if len(records) > 0:
            rv = rv + self.formatHeader(records)
            for record in records:
                rv = rv + self.linefmt.format(record)
            rv = rv + self.formatFooter(records)
        return rv

#---------------------------------------------------------------------------
#   Filter classes and functions
#---------------------------------------------------------------------------

class Filter(object):
    """
    Filter instances are used to perform arbitrary filtering of LogRecords.

    Loggers and Handlers can optionally use Filter instances to filter
    records as desired. The base filter class only allows events which are
    below a certain point in the logger hierarchy. For example, a filter
    initialized with "A.B" will allow events logged by loggers "A.B",
    "A.B.C", "A.B.C.D", "A.B.D" etc. but not "A.BB", "B.A.B" etc. If
    initialized with the empty string, all events are passed.
    """
    def __init__(self, name=''):
        """
        Initialize a filter.

        Initialize with the name of the logger which, together with its
        children, will have its events allowed through the filter. If no
        name is specified, allow every event.
        """
        self.name = name
        self.nlen = len(name)

    def filter(self, record):
        """
        Determine if the specified record is to be logged.

        Returns True if the record should be logged, or False otherwise.
        If deemed appropriate, the record may be modified in-place.
        """
        if self.nlen == 0:
            return True
        elif self.name == record.name:
            return True
        elif record.name.find(self.name, 0, self.nlen) != 0:
            return False
        return (record.name[self.nlen] == ".")

class Filterer(object):
    """
    A base class for loggers and handlers which allows them to share
    common code.
    """
    def __init__(self):
        """
        Initialize the list of filters to be an empty list.
        """
        self.filters = []

    def addFilter(self, filter):
        """
        Add the specified filter to this handler.
        """
        if not (filter in self.filters):
            self.filters.append(filter)

    def removeFilter(self, filter):
        """
        Remove the specified filter from this handler.
        """
        if filter in self.filters:
            self.filters.remove(filter)

    def filter(self, record):
        """
        Determine if a record is loggable by consulting all the filters.

        The default is to allow the record to be logged; any filter can veto
        this and the record is then dropped. Returns a zero value if a record
        is to be dropped, else non-zero.

        .. versionchanged:: 3.2

           Allow filters to be just callables.
        """
        rv = True
        for f in self.filters:
            if hasattr(f, 'filter'):
                result = f.filter(record)
            else:
                result = f(record) # assume callable - will raise if not
            if not result:
                rv = False
                break
        return rv

#---------------------------------------------------------------------------
#   Handler classes and functions
#---------------------------------------------------------------------------

_handlers = weakref.WeakValueDictionary()  #map of handler names to handlers
_handlerList = [] # added to allow handlers to be removed in reverse of order initialized

def _removeHandlerRef(wr):
    """
    Remove a handler reference from the internal cleanup list.
    """
    # This function can be called during module teardown, when globals are
    # set to None. It can also be called from another thread. So we need to
    # pre-emptively grab the necessary globals and check if they're None,
    # to prevent race conditions and failures during interpreter shutdown.
    acquire, release, handlers = _acquireLock, _releaseLock, _handlerList
    if acquire and release and handlers:
        acquire()
        try:
            if wr in handlers:
                handlers.remove(wr)
        finally:
            release()

def _addHandlerRef(handler):
    """
    Add a handler to the internal cleanup list using a weak reference.
    """
    _acquireLock()
    try:
        _handlerList.append(weakref.ref(handler, _removeHandlerRef))
    finally:
        _releaseLock()

class Handler(Filterer):
    """
    Handler instances dispatch logging events to specific destinations.

    The base handler class. Acts as a placeholder which defines the Handler
    interface. Handlers can optionally use Formatter instances to format
    records as desired. By default, no formatter is specified; in this case,
    the 'raw' message as determined by record.message is logged.
    """
    def __init__(self, level=NOTSET):
        """
        Initializes the instance - basically setting the formatter to None
        and the filter list to empty.
        """
        Filterer.__init__(self)
        self._name = None
        self.level = _checkLevel(level)
        self.formatter = None
        # Add the handler to the global _handlerList (for cleanup on shutdown)
        _addHandlerRef(self)
        self.createLock()

    def get_name(self):
        return self._name

    def set_name(self, name):
        _acquireLock()
        try:
            if self._name in _handlers:
                del _handlers[self._name]
            self._name = name
            if name:
                _handlers[name] = self
        finally:
            _releaseLock()

    name = property(get_name, set_name)

    def createLock(self):
        """
        Acquire a thread lock for serializing access to the underlying I/O.
        """
        self.lock = threading.RLock()
        _register_at_fork_reinit_lock(self)

    def acquire(self):
        """
        Acquire the I/O thread lock.
        """
        if self.lock:
            self.lock.acquire()

    def release(self):
        """
        Release the I/O thread lock.
        """
        if self.lock:
            self.lock.release()

    def setLevel(self, level):
        """
        Set the logging level of this handler.  level must be an int or a str.
        """
        self.level = _checkLevel(level)

    def format(self, record):
        """
        Format the specified record.

        If a formatter is set, use it. Otherwise, use the default formatter
        for the module.
        """
        if self.formatter:
            fmt = self.formatter
        else:
            fmt = _defaultFormatter
        return fmt.format(record)

    def emit(self, record):
        """
        Do whatever it takes to actually log the specified logging record.

        This version is intended to be implemented by subclasses and so
        raises a NotImplementedError.
        """
        raise NotImplementedError('emit must be implemented '
                                  'by Handler subclasses')

    def handle(self, record):
        """
        Conditionally emit the specified logging record.

        Emission depends on filters which may have been added to the handler.
        Wrap the actual emission of the record with acquisition/release of
        the I/O thread lock. Returns whether the filter passed the record for
        emission.
        """
        rv = self.filter(record)
        if rv:
            self.acquire()
            try:
                self.emit(record)
            finally:
                self.release()
        return rv

    def setFormatter(self, fmt):
        """
        Set the formatter for this handler.
        """
        self.formatter = fmt

    def flush(self):
        """
        Ensure all logging output has been flushed.

        This version does nothing and is intended to be implemented by
        subclasses.
        """
        pass

    def close(self):
        """
        Tidy up any resources used by the handler.

        This version removes the handler from an internal map of handlers,
        _handlers, which is used for handler lookup by name. Subclasses
        should ensure that this gets called from overridden close()
        methods.
        """
        #get the module data lock, as we're updating a shared structure.
        _acquireLock()
        try:    #unlikely to raise an exception, but you never know...
            if self._name and self._name in _handlers:
                del _handlers[self._name]
        finally:
            _releaseLock()

    def handleError(self, record):
        """
        Handle errors which occur during an emit() call.

        This method should be called from handlers when an exception is
        encountered during an emit() call. If raiseExceptions is false,
        exceptions get silently ignored. This is what is mostly wanted
        for a logging system - most users will not care about errors in
        the logging system, they are more interested in application errors.
        You could, however, replace this with a custom handler if you wish.
        The record which was being processed is passed in to this method.
        """
        if raiseExceptions and sys.stderr:  # see issue 13807
            t, v, tb = sys.exc_info()
            try:
                sys.stderr.write('--- Logging error ---\n')
                traceback.print_exception(t, v, tb, None, sys.stderr)
                sys.stderr.write('Call stack:\n')
                # Walk the stack frame up until we're out of logging,
                # so as to print the calling context.
                frame = tb.tb_frame
                while (frame and os.path.dirname(frame.f_code.co_filename) ==
                       __path__[0]):
                    frame = frame.f_back
                if frame:
                    traceback.print_stack(frame, file=sys.stderr)
                else:
                    # couldn't find the right stack frame, for some reason
                    sys.stderr.write('Logged from file %s, line %s\n' % (
                                     record.filename, record.lineno))
                # Issue 18671: output logging message and arguments
                try:
                    sys.stderr.write('Message: %r\n'
                                     'Arguments: %s\n' % (record.msg,
                                                          record.args))
                except RecursionError:  # See issue 36272
                    raise
                except Exception:
                    sys.stderr.write('Unable to print the message and arguments'
                                     ' - possible formatting error.\nUse the'
                                     ' traceback above to help find the error.\n'
                                    )
            except OSError: #pragma: no cover
                pass    # see issue 5971
            finally:
                del t, v, tb

    def __repr__(self):
        level = getLevelName(self.level)
        return '<%s (%s)>' % (self.__class__.__name__, level)

class StreamHandler(Handler):
    """
    A handler class which writes logging records, appropriately formatted,
    to a stream. Note that this class does not close the stream, as
    sys.stdout or sys.stderr may be used.
    """

    terminator = '\n'

    def __init__(self, stream=None):
        """
        Initialize the handler.

        If stream is not specified, sys.stderr is used.
        """
        Handler.__init__(self)
        if stream is None:
            stream = sys.stderr
        self.stream = stream

    def flush(self):
        """
        Flushes the stream.
        """
        self.acquire()
        try:
            if self.stream and hasattr(self.stream, "flush"):
                self.stream.flush()
        finally:
            self.release()

    def emit(self, record):
        """
        Emit a record.

        If a formatter is specified, it is used to format the record.
        The record is then written to the stream with a trailing newline.  If
        exception information is present, it is formatted using
        traceback.print_exception and appended to the stream.  If the stream
        has an 'encoding' attribute, it is used to determine how to do the
        output to the stream.
        """
        try:
            msg = self.format(record)
            stream = self.stream
            # issue 35046: merged two stream.writes into one.
            stream.write(msg + self.terminator)
            self.flush()
        except RecursionError:  # See issue 36272
            raise
        except Exception:
            self.handleError(record)

    def setStream(self, stream):
        """
        Sets the StreamHandler's stream to the specified value,
        if it is different.

        Returns the old stream, if the stream was changed, or None
        if it wasn't.
        """
        if stream is self.stream:
            result = None
        else:
            result = self.stream
            self.acquire()
            try:
                self.flush()
                self.stream = stream
            finally:
                self.release()
        return result

    def __repr__(self):
        level = getLevelName(self.level)
        name = getattr(self.stream, 'name', '')
        #  bpo-36015: name can be an int
        name = str(name)
        if name:
            name += ' '
        return '<%s %s(%s)>' % (self.__class__.__name__, name, level)


class FileHandler(StreamHandler):
    """
    A handler class which writes formatted logging records to disk files.
    """
    def __init__(self, filename, mode='a', encoding=None, delay=False):
        """
        Open the specified file and use it as the stream for logging.
        """
        # Issue #27493: add support for Path objects to be passed in
        filename = os.fspath(filename)
        #keep the absolute path, otherwise derived classes which use this
        #may come a cropper when the current directory changes
        self.baseFilename = os.path.abspath(filename)
        self.mode = mode
        self.encoding = encoding
        self.delay = delay
        if delay:
            #We don't open the stream, but we still need to call the
            #Handler constructor to set level, formatter, lock etc.
            Handler.__init__(self)
            self.stream = None
        else:
            StreamHandler.__init__(self, self._open())

    def close(self):
        """
        Closes the stream.
        """
        self.acquire()
        try:
            try:
                if self.stream:
                    try:
                        self.flush()
                    finally:
                        stream = self.stream
                        self.stream = None
                        if hasattr(stream, "close"):
                            stream.close()
            finally:
                # Issue #19523: call unconditionally to
                # prevent a handler leak when delay is set
                StreamHandler.close(self)
        finally:
            self.release()

    def _open(self):
        """
        Open the current base file with the (original) mode and encoding.
        Return the resulting stream.
        """
        return open(self.baseFilename, self.mode, encoding=self.encoding)

    def emit(self, record):
        """
        Emit a record.

        If the stream was not opened because 'delay' was specified in the
        constructor, open it before calling the superclass's emit.
        """
        if self.stream is None:
            self.stream = self._open()
        StreamHandler.emit(self, record)

    def __repr__(self):
        level = getLevelName(self.level)
        return '<%s %s (%s)>' % (self.__class__.__name__, self.baseFilename, level)


class _StderrHandler(StreamHandler):
    """
    This class is like a StreamHandler using sys.stderr, but always uses
    whatever sys.stderr is currently set to rather than the value of
    sys.stderr at handler construction time.
    """
    def __init__(self, level=NOTSET):
        """
        Initialize the handler.
        """
        Handler.__init__(self, level)

    @property
    def stream(self):
        return sys.stderr


_defaultLastResort = _StderrHandler(WARNING)
lastResort = _defaultLastResort

#---------------------------------------------------------------------------
#   Manager classes and functions
#---------------------------------------------------------------------------

class PlaceHolder(object):
    """
    PlaceHolder instances are used in the Manager logger hierarchy to take
    the place of nodes for which no loggers have been defined. This class is
    intended for internal use only and not as part of the public API.
    """
    def __init__(self, alogger):
        """
        Initialize with the specified logger being a child of this placeholder.
        """
        self.loggerMap = { alogger : None }

    def append(self, alogger):
        """
        Add the specified logger as a child of this placeholder.
        """
        if alogger not in self.loggerMap:
            self.loggerMap[alogger] = None

#
#   Determine which class to use when instantiating loggers.
#

def setLoggerClass(klass):
    """
    Set the class to be used when instantiating a logger. The class should
    define __init__() such that only a name argument is required, and the
    __init__() should call Logger.__init__()
    """
    if klass != Logger:
        if not issubclass(klass, Logger):
            raise TypeError("logger not derived from logging.Logger: "
                            + klass.__name__)
    global _loggerClass
    _loggerClass = klass

def getLoggerClass():
    """
    Return the class to be used when instantiating a logger.
    """
    return _loggerClass

class Manager(object):
    """
    There is [under normal circumstances] just one Manager instance, which
    holds the hierarchy of loggers.
    """
    def __init__(self, rootnode):
        """
        Initialize the manager with the root node of the logger hierarchy.
        """
        self.root = rootnode
        self.disable = 0
        self.emittedNoHandlerWarning = False
        self.loggerDict = {}
        self.loggerClass = None
        self.logRecordFactory = None

    @property
    def disable(self):
        return self._disable

    @disable.setter
    def disable(self, value):
        self._disable = _checkLevel(value)

    def getLogger(self, name):
        """
        Get a logger with the specified name (channel name), creating it
        if it doesn't yet exist. This name is a dot-separated hierarchical
        name, such as "a", "a.b", "a.b.c" or similar.

        If a PlaceHolder existed for the specified name [i.e. the logger
        didn't exist but a child of it did], replace it with the created
        logger and fix up the parent/child references which pointed to the
        placeholder to now point to the logger.
        """
        rv = None
        if not isinstance(name, str):
            raise TypeError('A logger name must be a string')
        _acquireLock()
        try:
            if name in self.loggerDict:
                rv = self.loggerDict[name]
                if isinstance(rv, PlaceHolder):
                    ph = rv
                    rv = (self.loggerClass or _loggerClass)(name)
                    rv.manager = self
                    self.loggerDict[name] = rv
                    self._fixupChildren(ph, rv)
                    self._fixupParents(rv)
            else:
                rv = (self.loggerClass or _loggerClass)(name)
                rv.manager = self
                self.loggerDict[name] = rv
                self._fixupParents(rv)
        finally:
            _releaseLock()
        return rv

    def setLoggerClass(self, klass):
        """
        Set the class to be used when instantiating a logger with this Manager.
        """
        if klass != Logger:
            if not issubclass(klass, Logger):
                raise TypeError("logger not derived from logging.Logger: "
                                + klass.__name__)
        self.loggerClass = klass

    def setLogRecordFactory(self, factory):
        """
        Set the factory to be used when instantiating a log record with this
        Manager.
        """
        self.logRecordFactory = factory

    def _fixupParents(self, alogger):
        """
        Ensure that there are either loggers or placeholders all the way
        from the specified logger to the root of the logger hierarchy.
        """
        name = alogger.name
        i = name.rfind(".")
        rv = None
        while (i > 0) and not rv:
            substr = name[:i]
            if substr not in self.loggerDict:
                self.loggerDict[substr] = PlaceHolder(alogger)
            else:
                obj = self.loggerDict[substr]
                if isinstance(obj, Logger):
                    rv = obj
                else:
                    assert isinstance(obj, PlaceHolder)
                    obj.append(alogger)
            i = name.rfind(".", 0, i - 1)
        if not rv:
            rv = self.root
        alogger.parent = rv

    def _fixupChildren(self, ph, alogger):
        """
        Ensure that children of the placeholder ph are connected to the
        specified logger.
        """
        name = alogger.name
        namelen = len(name)
        for c in ph.loggerMap.keys():
            #The if means ... if not c.parent.name.startswith(nm)
            if c.parent.name[:namelen] != name:
                alogger.parent = c.parent
                c.parent = alogger

    def _clear_cache(self):
        """
        Clear the cache for all loggers in loggerDict
        Called when level changes are made
        """

        _acquireLock()
        for logger in self.loggerDict.values():
            if isinstance(logger, Logger):
                logger._cache.clear()
        self.root._cache.clear()
        _releaseLock()

#---------------------------------------------------------------------------
#   Logger classes and functions
#---------------------------------------------------------------------------

class Logger(Filterer):
    """
    Instances of the Logger class represent a single logging channel. A
    "logging channel" indicates an area of an application. Exactly how an
    "area" is defined is up to the application developer. Since an
    application can have any number of areas, logging channels are identified
    by a unique string. Application areas can be nested (e.g. an area
    of "input processing" might include sub-areas "read CSV files", "read
    XLS files" and "read Gnumeric files"). To cater for this natural nesting,
    channel names are organized into a namespace hierarchy where levels are
    separated by periods, much like the Java or Python package namespace. So
    in the instance given above, channel names might be "input" for the upper
    level, and "input.csv", "input.xls" and "input.gnu" for the sub-levels.
    There is no arbitrary limit to the depth of nesting.
    """
    def __init__(self, name, level=NOTSET):
        """
        Initialize the logger with a name and an optional level.
        """
        Filterer.__init__(self)
        self.name = name
        self.level = _checkLevel(level)
        self.parent = None
        self.propagate = True
        self.handlers = []
        self.disabled = False
        self._cache = {}

    def setLevel(self, level):
        """
        Set the logging level of this logger.  level must be an int or a str.
        """
        self.level = _checkLevel(level)
        self.manager._clear_cache()

    def debug(self, msg, *args, **kwargs):
        """
        Log 'msg % args' with severity 'DEBUG'.

        To pass exception information, use the keyword argument exc_info with
        a true value, e.g.

        logger.debug("Houston, we have a %s", "thorny problem", exc_info=1)
        """
        if self.isEnabledFor(DEBUG):
            self._log(DEBUG, msg, args, **kwargs)

    def info(self, msg, *args, **kwargs):
        """
        Log 'msg % args' with severity 'INFO'.

        To pass exception information, use the keyword argument exc_info with
        a true value, e.g.

        logger.info("Houston, we have a %s", "interesting problem", exc_info=1)
        """
        if self.isEnabledFor(INFO):
            self._log(INFO, msg, args, **kwargs)

    def warning(self, msg, *args, **kwargs):
        """
        Log 'msg % args' with severity 'WARNING'.

        To pass exception information, use the keyword argument exc_info with
        a true value, e.g.

        logger.warning("Houston, we have a %s", "bit of a problem", exc_info=1)
        """
        if self.isEnabledFor(WARNING):
            self._log(WARNING, msg, args, **kwargs)

    def warn(self, msg, *args, **kwargs):
        warnings.warn("The 'warn' method is deprecated, "
            "use 'warning' instead", DeprecationWarning, 2)
        self.warning(msg, *args, **kwargs)

    def error(self, msg, *args, **kwargs):
        """
        Log 'msg % args' with severity 'ERROR'.

        To pass exception information, use the keyword argument exc_info with
        a true value, e.g.

        logger.error("Houston, we have a %s", "major problem", exc_info=1)
        """
        if self.isEnabledFor(ERROR):
            self._log(ERROR, msg, args, **kwargs)

    def exception(self, msg, *args, exc_info=True, **kwargs):
        """
        Convenience method for logging an ERROR with exception information.
        """
        self.error(msg, *args, exc_info=exc_info, **kwargs)

    def critical(self, msg, *args, **kwargs):
        """
        Log 'msg % args' with severity 'CRITICAL'.

        To pass exception information, use the keyword argument exc_info with
        a true value, e.g.

        logger.critical("Houston, we have a %s", "major disaster", exc_info=1)
        """
        if self.isEnabledFor(CRITICAL):
            self._log(CRITICAL, msg, args, **kwargs)

    fatal = critical

    def log(self, level, msg, *args, **kwargs):
        """
        Log 'msg % args' with the integer severity 'level'.

        To pass exception information, use the keyword argument exc_info with
        a true value, e.g.

        logger.log(level, "We have a %s", "mysterious problem", exc_info=1)
        """
        if not isinstance(level, int):
            if raiseExceptions:
                raise TypeError("level must be an integer")
            else:
                return
        if self.isEnabledFor(level):
            self._log(level, msg, args, **kwargs)

    def findCaller(self, stack_info=False, stacklevel=1):
        """
        Find the stack frame of the caller so that we can note the source
        file name, line number and function name.
        """
        f = currentframe()
        #On some versions of IronPython, currentframe() returns None if
        #IronPython isn't run with -X:Frames.
        if f is not None:
            f = f.f_back
        orig_f = f
        while f and stacklevel > 1:
            f = f.f_back
            stacklevel -= 1
        if not f:
            f = orig_f
        rv = "(unknown file)", 0, "(unknown function)", None
        while hasattr(f, "f_code"):
            co = f.f_code
            filename = os.path.normcase(co.co_filename)
            if filename == _srcfile:
                f = f.f_back
                continue
            sinfo = None
            if stack_info:
                sio = io.StringIO()
                sio.write('Stack (most recent call last):\n')
                traceback.print_stack(f, file=sio)
                sinfo = sio.getvalue()
                if sinfo[-1] == '\n':
                    sinfo = sinfo[:-1]
                sio.close()
            rv = (co.co_filename, f.f_lineno, co.co_name, sinfo)
            break
        return rv

    def makeRecord(self, name, level, fn, lno, msg, args, exc_info,
                   func=None, extra=None, sinfo=None):
        """
        A factory method which can be overridden in subclasses to create
        specialized LogRecords.
        """
        rv = _logRecordFactory(name, level, fn, lno, msg, args, exc_info, func,
                             sinfo)
        if extra is not None:
            for key in extra:
                if (key in ["message", "asctime"]) or (key in rv.__dict__):
                    raise KeyError("Attempt to overwrite %r in LogRecord" % key)
                rv.__dict__[key] = extra[key]
        return rv

    def _log(self, level, msg, args, exc_info=None, extra=None, stack_info=False,
             stacklevel=1):
        """
        Low-level logging routine which creates a LogRecord and then calls
        all the handlers of this logger to handle the record.
        """
        sinfo = None
        if _srcfile:
            #IronPython doesn't track Python frames, so findCaller raises an
            #exception on some versions of IronPython. We trap it here so that
            #IronPython can use logging.
            try:
                fn, lno, func, sinfo = self.findCaller(stack_info, stacklevel)
            except ValueError: # pragma: no cover
                fn, lno, func = "(unknown file)", 0, "(unknown function)"
        else: # pragma: no cover
            fn, lno, func = "(unknown file)", 0, "(unknown function)"
        if exc_info:
            if isinstance(exc_info, BaseException):
                exc_info = (type(exc_info), exc_info, exc_info.__traceback__)
            elif not isinstance(exc_info, tuple):
                exc_info = sys.exc_info()
        record = self.makeRecord(self.name, level, fn, lno, msg, args,
                                 exc_info, func, extra, sinfo)
        self.handle(record)

    def handle(self, record):
        """
        Call the handlers for the specified record.

        This method is used for unpickled records received from a socket, as
        well as those created locally. Logger-level filtering is applied.
        """
        if (not self.disabled) and self.filter(record):
            self.callHandlers(record)

    def addHandler(self, hdlr):
        """
        Add the specified handler to this logger.
        """
        _acquireLock()
        try:
            if not (hdlr in self.handlers):
                self.handlers.append(hdlr)
        finally:
            _releaseLock()

    def removeHandler(self, hdlr):
        """
        Remove the specified handler from this logger.
        """
        _acquireLock()
        try:
            if hdlr in self.handlers:
                self.handlers.remove(hdlr)
        finally:
            _releaseLock()

    def hasHandlers(self):
        """
        See if this logger has any handlers configured.

        Loop through all handlers for this logger and its parents in the
        logger hierarchy. Return True if a handler was found, else False.
        Stop searching up the hierarchy whenever a logger with the "propagate"
        attribute set to zero is found - that will be the last logger which
        is checked for the existence of handlers.
        """
        c = self
        rv = False
        while c:
            if c.handlers:
                rv = True
                break
            if not c.propagate:
                break
            else:
                c = c.parent
        return rv

    def callHandlers(self, record):
        """
        Pass a record to all relevant handlers.

        Loop through all handlers for this logger and its parents in the
        logger hierarchy. If no handler was found, output a one-off error
        message to sys.stderr. Stop searching up the hierarchy whenever a
        logger with the "propagate" attribute set to zero is found - that
        will be the last logger whose handlers are called.
        """
        c = self
        found = 0
        while c:
            for hdlr in c.handlers:
                found = found + 1
                if record.levelno >= hdlr.level:
                    hdlr.handle(record)
            if not c.propagate:
                c = None    #break out
            else:
                c = c.parent
        if (found == 0):
            if lastResort:
                if record.levelno >= lastResort.level:
                    lastResort.handle(record)
            elif raiseExceptions and not self.manager.emittedNoHandlerWarning:
                sys.stderr.write("No handlers could be found for logger"
                                 " \"%s\"\n" % self.name)
                self.manager.emittedNoHandlerWarning = True

    def getEffectiveLevel(self):
        """
        Get the effective level for this logger.

        Loop through this logger and its parents in the logger hierarchy,
        looking for a non-zero logging level. Return the first one found.
        """
        logger = self
        while logger:
            if logger.level:
                return logger.level
            logger = logger.parent
        return NOTSET

    def isEnabledFor(self, level):
        """
        Is this logger enabled for level 'level'?
        """
        if self.disabled:
            return False

        try:
            return self._cache[level]
        except KeyError:
            _acquireLock()
            try:
                if self.manager.disable >= level:
                    is_enabled = self._cache[level] = False
                else:
                    is_enabled = self._cache[level] = (
                        level >= self.getEffectiveLevel()
                    )
            finally:
                _releaseLock()
            return is_enabled

    def getChild(self, suffix):
        """
        Get a logger which is a descendant to this one.

        This is a convenience method, such that

        logging.getLogger('abc').getChild('def.ghi')

        is the same as

        logging.getLogger('abc.def.ghi')

        It's useful, for example, when the parent logger is named using
        __name__ rather than a literal string.
        """
        if self.root is not self:
            suffix = '.'.join((self.name, suffix))
        return self.manager.getLogger(suffix)

    def __repr__(self):
        level = getLevelName(self.getEffectiveLevel())
        return '<%s %s (%s)>' % (self.__class__.__name__, self.name, level)

    def __reduce__(self):
        # In general, only the root logger will not be accessible via its name.
        # However, the root logger's class has its own __reduce__ method.
        if getLogger(self.name) is not self:
            import pickle
            raise pickle.PicklingError('logger cannot be pickled')
        return getLogger, (self.name,)


class RootLogger(Logger):
    """
    A root logger is not that different to any other logger, except that
    it must have a logging level and there is only one instance of it in
    the hierarchy.
    """
    def __init__(self, level):
        """
        Initialize the logger with the name "root".
        """
        Logger.__init__(self, "root", level)

    def __reduce__(self):
        return getLogger, ()

_loggerClass = Logger

class LoggerAdapter(object):
    """
    An adapter for loggers which makes it easier to specify contextual
    information in logging output.
    """

    def __init__(self, logger, extra):
        """
        Initialize the adapter with a logger and a dict-like object which
        provides contextual information. This constructor signature allows
        easy stacking of LoggerAdapters, if so desired.

        You can effectively pass keyword arguments as shown in the
        following example:

        adapter = LoggerAdapter(someLogger, dict(p1=v1, p2="v2"))
        """
        self.logger = logger
        self.extra = extra

    def process(self, msg, kwargs):
        """
        Process the logging message and keyword arguments passed in to
        a logging call to insert contextual information. You can either
        manipulate the message itself, the keyword args or both. Return
        the message and kwargs modified (or not) to suit your needs.

        Normally, you'll only need to override this one method in a
        LoggerAdapter subclass for your specific needs.
        """
        kwargs["extra"] = self.extra
        return msg, kwargs

    #
    # Boilerplate convenience methods
    #
    def debug(self, msg, *args, **kwargs):
        """
        Delegate a debug call to the underlying logger.
        """
        self.log(DEBUG, msg, *args, **kwargs)

    def info(self, msg, *args, **kwargs):
        """
        Delegate an info call to the underlying logger.
        """
        self.log(INFO, msg, *args, **kwargs)

    def warning(self, msg, *args, **kwargs):
        """
        Delegate a warning call to the underlying logger.
        """
        self.log(WARNING, msg, *args, **kwargs)

    def warn(self, msg, *args, **kwargs):
        warnings.warn("The 'warn' method is deprecated, "
            "use 'warning' instead", DeprecationWarning, 2)
        self.warning(msg, *args, **kwargs)

    def error(self, msg, *args, **kwargs):
        """
        Delegate an error call to the underlying logger.
        """
        self.log(ERROR, msg, *args, **kwargs)

    def exception(self, msg, *args, exc_info=True, **kwargs):
        """
        Delegate an exception call to the underlying logger.
        """
        self.log(ERROR, msg, *args, exc_info=exc_info, **kwargs)

    def critical(self, msg, *args, **kwargs):
        """
        Delegate a critical call to the underlying logger.
        """
        self.log(CRITICAL, msg, *args, **kwargs)

    def log(self, level, msg, *args, **kwargs):
        """
        Delegate a log call to the underlying logger, after adding
        contextual information from this adapter instance.
        """
        if self.isEnabledFor(level):
            msg, kwargs = self.process(msg, kwargs)
            self.logger.log(level, msg, *args, **kwargs)

    def isEnabledFor(self, level):
        """
        Is this logger enabled for level 'level'?
        """
        return self.logger.isEnabledFor(level)

    def setLevel(self, level):
        """
        Set the specified level on the underlying logger.
        """
        self.logger.setLevel(level)

    def getEffectiveLevel(self):
        """
        Get the effective level for the underlying logger.
        """
        return self.logger.getEffectiveLevel()

    def hasHandlers(self):
        """
        See if the underlying logger has any handlers.
        """
        return self.logger.hasHandlers()

    def _log(self, level, msg, args, exc_info=None, extra=None, stack_info=False):
        """
        Low-level log implementation, proxied to allow nested logger adapters.
        """
        return self.logger._log(
            level,
            msg,
            args,
            exc_info=exc_info,
            extra=extra,
            stack_info=stack_info,
        )

    @property
    def manager(self):
        return self.logger.manager

    @manager.setter
    def manager(self, value):
        self.logger.manager = value

    @property
    def name(self):
        return self.logger.name

    def __repr__(self):
        logger = self.logger
        level = getLevelName(logger.getEffectiveLevel())
        return '<%s %s (%s)>' % (self.__class__.__name__, logger.name, level)

root = RootLogger(WARNING)
Logger.root = root
Logger.manager = Manager(Logger.root)

#---------------------------------------------------------------------------
# Configuration classes and functions
#---------------------------------------------------------------------------

def basicConfig(**kwargs):
    """
    Do basic configuration for the logging system.

    This function does nothing if the root logger already has handlers
    configured, unless the keyword argument *force* is set to ``True``.
    It is a convenience method intended for use by simple scripts
    to do one-shot configuration of the logging package.

    The default behaviour is to create a StreamHandler which writes to
    sys.stderr, set a formatter using the BASIC_FORMAT format string, and
    add the handler to the root logger.

    A number of optional keyword arguments may be specified, which can alter
    the default behaviour.

    filename  Specifies that a FileHandler be created, using the specified
              filename, rather than a StreamHandler.
    filemode  Specifies the mode to open the file, if filename is specified
              (if filemode is unspecified, it defaults to 'a').
    format    Use the specified format string for the handler.
    datefmt   Use the specified date/time format.
    style     If a format string is specified, use this to specify the
              type of format string (possible values '%', '{', '$', for
              %-formatting, :meth:`str.format` and :class:`string.Template`
              - defaults to '%').
    level     Set the root logger level to the specified level.
    stream    Use the specified stream to initialize the StreamHandler. Note
              that this argument is incompatible with 'filename' - if both
              are present, 'stream' is ignored.
    handlers  If specified, this should be an iterable of already created
              handlers, which will be added to the root handler. Any handler
              in the list which does not have a formatter assigned will be
              assigned the formatter created in this function.
    force     If this keyword  is specified as true, any existing handlers
              attached to the root logger are removed and closed, before
              carrying out the configuration as specified by the other
              arguments.
    Note that you could specify a stream created using open(filename, mode)
    rather than passing the filename and mode in. However, it should be
    remembered that StreamHandler does not close its stream (since it may be
    using sys.stdout or sys.stderr), whereas FileHandler closes its stream
    when the handler is closed.

    .. versionchanged:: 3.8
       Added the ``force`` parameter.

    .. versionchanged:: 3.2
       Added the ``style`` parameter.

    .. versionchanged:: 3.3
       Added the ``handlers`` parameter. A ``ValueError`` is now thrown for
       incompatible arguments (e.g. ``handlers`` specified together with
       ``filename``/``filemode``, or ``filename``/``filemode`` specified
       together with ``stream``, or ``handlers`` specified together with
       ``stream``.
    """
    # Add thread safety in case someone mistakenly calls
    # basicConfig() from multiple threads
    _acquireLock()
    try:
        force = kwargs.pop('force', False)
        if force:
            for h in root.handlers[:]:
                root.removeHandler(h)
                h.close()
        if len(root.handlers) == 0:
            handlers = kwargs.pop("handlers", None)
            if handlers is None:
                if "stream" in kwargs and "filename" in kwargs:
                    raise ValueError("'stream' and 'filename' should not be "
                                     "specified together")
            else:
                if "stream" in kwargs or "filename" in kwargs:
                    raise ValueError("'stream' or 'filename' should not be "
                                     "specified together with 'handlers'")
            if handlers is None:
                filename = kwargs.pop("filename", None)
                mode = kwargs.pop("filemode", 'a')
                if filename:
                    h = FileHandler(filename, mode)
                else:
                    stream = kwargs.pop("stream", None)
                    h = StreamHandler(stream)
                handlers = [h]
            dfs = kwargs.pop("datefmt", None)
            style = kwargs.pop("style", '%')
            if style not in _STYLES:
                raise ValueError('Style must be one of: %s' % ','.join(
                                 _STYLES.keys()))
            fs = kwargs.pop("format", _STYLES[style][1])
            fmt = Formatter(fs, dfs, style)
            for h in handlers:
                if h.formatter is None:
                    h.setFormatter(fmt)
                root.addHandler(h)
            level = kwargs.pop("level", None)
            if level is not None:
                root.setLevel(level)
            if kwargs:
                keys = ', '.join(kwargs.keys())
                raise ValueError('Unrecognised argument(s): %s' % keys)
    finally:
        _releaseLock()

#---------------------------------------------------------------------------
# Utility functions at module level.
# Basically delegate everything to the root logger.
#---------------------------------------------------------------------------

def getLogger(name=None):
    """
    Return a logger with the specified name, creating it if necessary.

    If no name is specified, return the root logger.
    """
    if name:
        return Logger.manager.getLogger(name)
    else:
        return root

def critical(msg, *args, **kwargs):
    """
    Log a message with severity 'CRITICAL' on the root logger. If the logger
    has no handlers, call basicConfig() to add a console handler with a
    pre-defined format.
    """
    if len(root.handlers) == 0:
        basicConfig()
    root.critical(msg, *args, **kwargs)

fatal = critical

def error(msg, *args, **kwargs):
    """
    Log a message with severity 'ERROR' on the root logger. If the logger has
    no handlers, call basicConfig() to add a console handler with a pre-defined
    format.
    """
    if len(root.handlers) == 0:
        basicConfig()
    root.error(msg, *args, **kwargs)

def exception(msg, *args, exc_info=True, **kwargs):
    """
    Log a message with severity 'ERROR' on the root logger, with exception
    information. If the logger has no handlers, basicConfig() is called to add
    a console handler with a pre-defined format.
    """
    error(msg, *args, exc_info=exc_info, **kwargs)

def warning(msg, *args, **kwargs):
    """
    Log a message with severity 'WARNING' on the root logger. If the logger has
    no handlers, call basicConfig() to add a console handler with a pre-defined
    format.
    """
    if len(root.handlers) == 0:
        basicConfig()
    root.warning(msg, *args, **kwargs)

def warn(msg, *args, **kwargs):
    warnings.warn("The 'warn' function is deprecated, "
        "use 'warning' instead", DeprecationWarning, 2)
    warning(msg, *args, **kwargs)

def info(msg, *args, **kwargs):
    """
    Log a message with severity 'INFO' on the root logger. If the logger has
    no handlers, call basicConfig() to add a console handler with a pre-defined
    format.
    """
    if len(root.handlers) == 0:
        basicConfig()
    root.info(msg, *args, **kwargs)

def debug(msg, *args, **kwargs):
    """
    Log a message with severity 'DEBUG' on the root logger. If the logger has
    no handlers, call basicConfig() to add a console handler with a pre-defined
    format.
    """
    if len(root.handlers) == 0:
        basicConfig()
    root.debug(msg, *args, **kwargs)

def log(level, msg, *args, **kwargs):
    """
    Log 'msg % args' with the integer severity 'level' on the root logger. If
    the logger has no handlers, call basicConfig() to add a console handler
    with a pre-defined format.
    """
    if len(root.handlers) == 0:
        basicConfig()
    root.log(level, msg, *args, **kwargs)

def disable(level=CRITICAL):
    """
    Disable all logging calls of severity 'level' and below.
    """
    root.manager.disable = level
    root.manager._clear_cache()

def shutdown(handlerList=_handlerList):
    """
    Perform any cleanup actions in the logging system (e.g. flushing
    buffers).

    Should be called at application exit.
    """
    for wr in reversed(handlerList[:]):
        #errors might occur, for example, if files are locked
        #we just ignore them if raiseExceptions is not set
        try:
            h = wr()
            if h:
                try:
                    h.acquire()
                    h.flush()
                    h.close()
                except (OSError, ValueError):
                    # Ignore errors which might be caused
                    # because handlers have been closed but
                    # references to them are still around at
                    # application exit.
                    pass
                finally:
                    h.release()
        except: # ignore everything, as we're shutting down
            if raiseExceptions:
                raise
            #else, swallow

#Let's try and shutdown automatically on application exit...
import atexit
atexit.register(shutdown)

# Null handler

class NullHandler(Handler):
    """
    This handler does nothing. It's intended to be used to avoid the
    "No handlers could be found for logger XXX" one-off warning. This is
    important for library code, which may contain code to log events. If a user
    of the library does not configure logging, the one-off warning might be
    produced; to avoid this, the library developer simply needs to instantiate
    a NullHandler and add it to the top-level logger of the library module or
    package.
    """
    def handle(self, record):
        """Stub."""

    def emit(self, record):
        """Stub."""

    def createLock(self):
        self.lock = None

# Warnings integration

_warnings_showwarning = None

def _showwarning(message, category, filename, lineno, file=None, line=None):
    """
    Implementation of showwarnings which redirects to logging, which will first
    check to see if the file parameter is None. If a file is specified, it will
    delegate to the original warnings implementation of showwarning. Otherwise,
    it will call warnings.formatwarning and will log the resulting string to a
    warnings logger named "py.warnings" with level logging.WARNING.
    """
    if file is not None:
        if _warnings_showwarning is not None:
            _warnings_showwarning(message, category, filename, lineno, file, line)
    else:
        s = warnings.formatwarning(message, category, filename, lineno, line)
        logger = getLogger("py.warnings")
        if not logger.handlers:
            logger.addHandler(NullHandler())
        logger.warning("%s", s)

def captureWarnings(capture):
    """
    If capture is true, redirect all warnings to the logging package.
    If capture is False, ensure that warnings are not redirected to logging
    but to their original destinations.
    """
    global _warnings_showwarning
    if capture:
        if _warnings_showwarning is None:
            _warnings_showwarning = warnings.showwarning
            warnings.showwarning = _showwarning
    else:
        if _warnings_showwarning is not None:
            warnings.showwarning = _warnings_showwarning
            _warnings_showwarning = None
handlers.py000064400000161161150327210140006717 0ustar00# Copyright 2001-2016 by Vinay Sajip. All Rights Reserved.
#
# Permission to use, copy, modify, and distribute this software and its
# documentation for any purpose and without fee is hereby granted,
# provided that the above copyright notice appear in all copies and that
# both that copyright notice and this permission notice appear in
# supporting documentation, and that the name of Vinay Sajip
# not be used in advertising or publicity pertaining to distribution
# of the software without specific, written prior permission.
# VINAY SAJIP DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
# ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL
# VINAY SAJIP BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
# ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER
# IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.

"""
Additional handlers for the logging package for Python. The core package is
based on PEP 282 and comments thereto in comp.lang.python.

Copyright (C) 2001-2016 Vinay Sajip. All Rights Reserved.

To use, simply 'import logging.handlers' and log away!
"""

import logging, socket, os, pickle, struct, time, re
from stat import ST_DEV, ST_INO, ST_MTIME
import queue
import threading
import copy

#
# Some constants...
#

DEFAULT_TCP_LOGGING_PORT    = 9020
DEFAULT_UDP_LOGGING_PORT    = 9021
DEFAULT_HTTP_LOGGING_PORT   = 9022
DEFAULT_SOAP_LOGGING_PORT   = 9023
SYSLOG_UDP_PORT             = 514
SYSLOG_TCP_PORT             = 514

_MIDNIGHT = 24 * 60 * 60  # number of seconds in a day

class BaseRotatingHandler(logging.FileHandler):
    """
    Base class for handlers that rotate log files at a certain point.
    Not meant to be instantiated directly.  Instead, use RotatingFileHandler
    or TimedRotatingFileHandler.
    """
    def __init__(self, filename, mode, encoding=None, delay=False):
        """
        Use the specified filename for streamed logging
        """
        logging.FileHandler.__init__(self, filename, mode, encoding, delay)
        self.mode = mode
        self.encoding = encoding
        self.namer = None
        self.rotator = None

    def emit(self, record):
        """
        Emit a record.

        Output the record to the file, catering for rollover as described
        in doRollover().
        """
        try:
            if self.shouldRollover(record):
                self.doRollover()
            logging.FileHandler.emit(self, record)
        except Exception:
            self.handleError(record)

    def rotation_filename(self, default_name):
        """
        Modify the filename of a log file when rotating.

        This is provided so that a custom filename can be provided.

        The default implementation calls the 'namer' attribute of the
        handler, if it's callable, passing the default name to
        it. If the attribute isn't callable (the default is None), the name
        is returned unchanged.

        :param default_name: The default name for the log file.
        """
        if not callable(self.namer):
            result = default_name
        else:
            result = self.namer(default_name)
        return result

    def rotate(self, source, dest):
        """
        When rotating, rotate the current log.

        The default implementation calls the 'rotator' attribute of the
        handler, if it's callable, passing the source and dest arguments to
        it. If the attribute isn't callable (the default is None), the source
        is simply renamed to the destination.

        :param source: The source filename. This is normally the base
                       filename, e.g. 'test.log'
        :param dest:   The destination filename. This is normally
                       what the source is rotated to, e.g. 'test.log.1'.
        """
        if not callable(self.rotator):
            # Issue 18940: A file may not have been created if delay is True.
            if os.path.exists(source):
                os.rename(source, dest)
        else:
            self.rotator(source, dest)

class RotatingFileHandler(BaseRotatingHandler):
    """
    Handler for logging to a set of files, which switches from one file
    to the next when the current file reaches a certain size.
    """
    def __init__(self, filename, mode='a', maxBytes=0, backupCount=0, encoding=None, delay=False):
        """
        Open the specified file and use it as the stream for logging.

        By default, the file grows indefinitely. You can specify particular
        values of maxBytes and backupCount to allow the file to rollover at
        a predetermined size.

        Rollover occurs whenever the current log file is nearly maxBytes in
        length. If backupCount is >= 1, the system will successively create
        new files with the same pathname as the base file, but with extensions
        ".1", ".2" etc. appended to it. For example, with a backupCount of 5
        and a base file name of "app.log", you would get "app.log",
        "app.log.1", "app.log.2", ... through to "app.log.5". The file being
        written to is always "app.log" - when it gets filled up, it is closed
        and renamed to "app.log.1", and if files "app.log.1", "app.log.2" etc.
        exist, then they are renamed to "app.log.2", "app.log.3" etc.
        respectively.

        If maxBytes is zero, rollover never occurs.
        """
        # If rotation/rollover is wanted, it doesn't make sense to use another
        # mode. If for example 'w' were specified, then if there were multiple
        # runs of the calling application, the logs from previous runs would be
        # lost if the 'w' is respected, because the log file would be truncated
        # on each run.
        if maxBytes > 0:
            mode = 'a'
        BaseRotatingHandler.__init__(self, filename, mode, encoding, delay)
        self.maxBytes = maxBytes
        self.backupCount = backupCount

    def doRollover(self):
        """
        Do a rollover, as described in __init__().
        """
        if self.stream:
            self.stream.close()
            self.stream = None
        if self.backupCount > 0:
            for i in range(self.backupCount - 1, 0, -1):
                sfn = self.rotation_filename("%s.%d" % (self.baseFilename, i))
                dfn = self.rotation_filename("%s.%d" % (self.baseFilename,
                                                        i + 1))
                if os.path.exists(sfn):
                    if os.path.exists(dfn):
                        os.remove(dfn)
                    os.rename(sfn, dfn)
            dfn = self.rotation_filename(self.baseFilename + ".1")
            if os.path.exists(dfn):
                os.remove(dfn)
            self.rotate(self.baseFilename, dfn)
        if not self.delay:
            self.stream = self._open()

    def shouldRollover(self, record):
        """
        Determine if rollover should occur.

        Basically, see if the supplied record would cause the file to exceed
        the size limit we have.
        """
        if self.stream is None:                 # delay was set...
            self.stream = self._open()
        if self.maxBytes > 0:                   # are we rolling over?
            msg = "%s\n" % self.format(record)
            self.stream.seek(0, 2)  #due to non-posix-compliant Windows feature
            if self.stream.tell() + len(msg) >= self.maxBytes:
                return 1
        return 0

class TimedRotatingFileHandler(BaseRotatingHandler):
    """
    Handler for logging to a file, rotating the log file at certain timed
    intervals.

    If backupCount is > 0, when rollover is done, no more than backupCount
    files are kept - the oldest ones are deleted.
    """
    def __init__(self, filename, when='h', interval=1, backupCount=0, encoding=None, delay=False, utc=False, atTime=None):
        BaseRotatingHandler.__init__(self, filename, 'a', encoding, delay)
        self.when = when.upper()
        self.backupCount = backupCount
        self.utc = utc
        self.atTime = atTime
        # Calculate the real rollover interval, which is just the number of
        # seconds between rollovers.  Also set the filename suffix used when
        # a rollover occurs.  Current 'when' events supported:
        # S - Seconds
        # M - Minutes
        # H - Hours
        # D - Days
        # midnight - roll over at midnight
        # W{0-6} - roll over on a certain day; 0 - Monday
        #
        # Case of the 'when' specifier is not important; lower or upper case
        # will work.
        if self.when == 'S':
            self.interval = 1 # one second
            self.suffix = "%Y-%m-%d_%H-%M-%S"
            self.extMatch = r"^\d{4}-\d{2}-\d{2}_\d{2}-\d{2}-\d{2}(\.\w+)?$"
        elif self.when == 'M':
            self.interval = 60 # one minute
            self.suffix = "%Y-%m-%d_%H-%M"
            self.extMatch = r"^\d{4}-\d{2}-\d{2}_\d{2}-\d{2}(\.\w+)?$"
        elif self.when == 'H':
            self.interval = 60 * 60 # one hour
            self.suffix = "%Y-%m-%d_%H"
            self.extMatch = r"^\d{4}-\d{2}-\d{2}_\d{2}(\.\w+)?$"
        elif self.when == 'D' or self.when == 'MIDNIGHT':
            self.interval = 60 * 60 * 24 # one day
            self.suffix = "%Y-%m-%d"
            self.extMatch = r"^\d{4}-\d{2}-\d{2}(\.\w+)?$"
        elif self.when.startswith('W'):
            self.interval = 60 * 60 * 24 * 7 # one week
            if len(self.when) != 2:
                raise ValueError("You must specify a day for weekly rollover from 0 to 6 (0 is Monday): %s" % self.when)
            if self.when[1] < '0' or self.when[1] > '6':
                raise ValueError("Invalid day specified for weekly rollover: %s" % self.when)
            self.dayOfWeek = int(self.when[1])
            self.suffix = "%Y-%m-%d"
            self.extMatch = r"^\d{4}-\d{2}-\d{2}(\.\w+)?$"
        else:
            raise ValueError("Invalid rollover interval specified: %s" % self.when)

        self.extMatch = re.compile(self.extMatch, re.ASCII)
        self.interval = self.interval * interval # multiply by units requested
        # The following line added because the filename passed in could be a
        # path object (see Issue #27493), but self.baseFilename will be a string
        filename = self.baseFilename
        if os.path.exists(filename):
            t = os.stat(filename)[ST_MTIME]
        else:
            t = int(time.time())
        self.rolloverAt = self.computeRollover(t)

    def computeRollover(self, currentTime):
        """
        Work out the rollover time based on the specified time.
        """
        result = currentTime + self.interval
        # If we are rolling over at midnight or weekly, then the interval is already known.
        # What we need to figure out is WHEN the next interval is.  In other words,
        # if you are rolling over at midnight, then your base interval is 1 day,
        # but you want to start that one day clock at midnight, not now.  So, we
        # have to fudge the rolloverAt value in order to trigger the first rollover
        # at the right time.  After that, the regular interval will take care of
        # the rest.  Note that this code doesn't care about leap seconds. :)
        if self.when == 'MIDNIGHT' or self.when.startswith('W'):
            # This could be done with less code, but I wanted it to be clear
            if self.utc:
                t = time.gmtime(currentTime)
            else:
                t = time.localtime(currentTime)
            currentHour = t[3]
            currentMinute = t[4]
            currentSecond = t[5]
            currentDay = t[6]
            # r is the number of seconds left between now and the next rotation
            if self.atTime is None:
                rotate_ts = _MIDNIGHT
            else:
                rotate_ts = ((self.atTime.hour * 60 + self.atTime.minute)*60 +
                    self.atTime.second)

            r = rotate_ts - ((currentHour * 60 + currentMinute) * 60 +
                currentSecond)
            if r < 0:
                # Rotate time is before the current time (for example when
                # self.rotateAt is 13:45 and it now 14:15), rotation is
                # tomorrow.
                r += _MIDNIGHT
                currentDay = (currentDay + 1) % 7
            result = currentTime + r
            # If we are rolling over on a certain day, add in the number of days until
            # the next rollover, but offset by 1 since we just calculated the time
            # until the next day starts.  There are three cases:
            # Case 1) The day to rollover is today; in this case, do nothing
            # Case 2) The day to rollover is further in the interval (i.e., today is
            #         day 2 (Wednesday) and rollover is on day 6 (Sunday).  Days to
            #         next rollover is simply 6 - 2 - 1, or 3.
            # Case 3) The day to rollover is behind us in the interval (i.e., today
            #         is day 5 (Saturday) and rollover is on day 3 (Thursday).
            #         Days to rollover is 6 - 5 + 3, or 4.  In this case, it's the
            #         number of days left in the current week (1) plus the number
            #         of days in the next week until the rollover day (3).
            # The calculations described in 2) and 3) above need to have a day added.
            # This is because the above time calculation takes us to midnight on this
            # day, i.e. the start of the next day.
            if self.when.startswith('W'):
                day = currentDay # 0 is Monday
                if day != self.dayOfWeek:
                    if day < self.dayOfWeek:
                        daysToWait = self.dayOfWeek - day
                    else:
                        daysToWait = 6 - day + self.dayOfWeek + 1
                    newRolloverAt = result + (daysToWait * (60 * 60 * 24))
                    if not self.utc:
                        dstNow = t[-1]
                        dstAtRollover = time.localtime(newRolloverAt)[-1]
                        if dstNow != dstAtRollover:
                            if not dstNow:  # DST kicks in before next rollover, so we need to deduct an hour
                                addend = -3600
                            else:           # DST bows out before next rollover, so we need to add an hour
                                addend = 3600
                            newRolloverAt += addend
                    result = newRolloverAt
        return result

    def shouldRollover(self, record):
        """
        Determine if rollover should occur.

        record is not used, as we are just comparing times, but it is needed so
        the method signatures are the same
        """
        t = int(time.time())
        if t >= self.rolloverAt:
            return 1
        return 0

    def getFilesToDelete(self):
        """
        Determine the files to delete when rolling over.

        More specific than the earlier method, which just used glob.glob().
        """
        dirName, baseName = os.path.split(self.baseFilename)
        fileNames = os.listdir(dirName)
        result = []
        prefix = baseName + "."
        plen = len(prefix)
        for fileName in fileNames:
            if fileName[:plen] == prefix:
                suffix = fileName[plen:]
                if self.extMatch.match(suffix):
                    result.append(os.path.join(dirName, fileName))
        if len(result) < self.backupCount:
            result = []
        else:
            result.sort()
            result = result[:len(result) - self.backupCount]
        return result

    def doRollover(self):
        """
        do a rollover; in this case, a date/time stamp is appended to the filename
        when the rollover happens.  However, you want the file to be named for the
        start of the interval, not the current time.  If there is a backup count,
        then we have to get a list of matching filenames, sort them and remove
        the one with the oldest suffix.
        """
        if self.stream:
            self.stream.close()
            self.stream = None
        # get the time that this sequence started at and make it a TimeTuple
        currentTime = int(time.time())
        dstNow = time.localtime(currentTime)[-1]
        t = self.rolloverAt - self.interval
        if self.utc:
            timeTuple = time.gmtime(t)
        else:
            timeTuple = time.localtime(t)
            dstThen = timeTuple[-1]
            if dstNow != dstThen:
                if dstNow:
                    addend = 3600
                else:
                    addend = -3600
                timeTuple = time.localtime(t + addend)
        dfn = self.rotation_filename(self.baseFilename + "." +
                                     time.strftime(self.suffix, timeTuple))
        if os.path.exists(dfn):
            os.remove(dfn)
        self.rotate(self.baseFilename, dfn)
        if self.backupCount > 0:
            for s in self.getFilesToDelete():
                os.remove(s)
        if not self.delay:
            self.stream = self._open()
        newRolloverAt = self.computeRollover(currentTime)
        while newRolloverAt <= currentTime:
            newRolloverAt = newRolloverAt + self.interval
        #If DST changes and midnight or weekly rollover, adjust for this.
        if (self.when == 'MIDNIGHT' or self.when.startswith('W')) and not self.utc:
            dstAtRollover = time.localtime(newRolloverAt)[-1]
            if dstNow != dstAtRollover:
                if not dstNow:  # DST kicks in before next rollover, so we need to deduct an hour
                    addend = -3600
                else:           # DST bows out before next rollover, so we need to add an hour
                    addend = 3600
                newRolloverAt += addend
        self.rolloverAt = newRolloverAt

class WatchedFileHandler(logging.FileHandler):
    """
    A handler for logging to a file, which watches the file
    to see if it has changed while in use. This can happen because of
    usage of programs such as newsyslog and logrotate which perform
    log file rotation. This handler, intended for use under Unix,
    watches the file to see if it has changed since the last emit.
    (A file has changed if its device or inode have changed.)
    If it has changed, the old file stream is closed, and the file
    opened to get a new stream.

    This handler is not appropriate for use under Windows, because
    under Windows open files cannot be moved or renamed - logging
    opens the files with exclusive locks - and so there is no need
    for such a handler. Furthermore, ST_INO is not supported under
    Windows; stat always returns zero for this value.

    This handler is based on a suggestion and patch by Chad J.
    Schroeder.
    """
    def __init__(self, filename, mode='a', encoding=None, delay=False):
        logging.FileHandler.__init__(self, filename, mode, encoding, delay)
        self.dev, self.ino = -1, -1
        self._statstream()

    def _statstream(self):
        if self.stream:
            sres = os.fstat(self.stream.fileno())
            self.dev, self.ino = sres[ST_DEV], sres[ST_INO]

    def reopenIfNeeded(self):
        """
        Reopen log file if needed.

        Checks if the underlying file has changed, and if it
        has, close the old stream and reopen the file to get the
        current stream.
        """
        # Reduce the chance of race conditions by stat'ing by path only
        # once and then fstat'ing our new fd if we opened a new log stream.
        # See issue #14632: Thanks to John Mulligan for the problem report
        # and patch.
        try:
            # stat the file by path, checking for existence
            sres = os.stat(self.baseFilename)
        except FileNotFoundError:
            sres = None
        # compare file system stat with that of our stream file handle
        if not sres or sres[ST_DEV] != self.dev or sres[ST_INO] != self.ino:
            if self.stream is not None:
                # we have an open file handle, clean it up
                self.stream.flush()
                self.stream.close()
                self.stream = None  # See Issue #21742: _open () might fail.
                # open a new file handle and get new stat info from that fd
                self.stream = self._open()
                self._statstream()

    def emit(self, record):
        """
        Emit a record.

        If underlying file has changed, reopen the file before emitting the
        record to it.
        """
        self.reopenIfNeeded()
        logging.FileHandler.emit(self, record)


class SocketHandler(logging.Handler):
    """
    A handler class which writes logging records, in pickle format, to
    a streaming socket. The socket is kept open across logging calls.
    If the peer resets it, an attempt is made to reconnect on the next call.
    The pickle which is sent is that of the LogRecord's attribute dictionary
    (__dict__), so that the receiver does not need to have the logging module
    installed in order to process the logging event.

    To unpickle the record at the receiving end into a LogRecord, use the
    makeLogRecord function.
    """

    def __init__(self, host, port):
        """
        Initializes the handler with a specific host address and port.

        When the attribute *closeOnError* is set to True - if a socket error
        occurs, the socket is silently closed and then reopened on the next
        logging call.
        """
        logging.Handler.__init__(self)
        self.host = host
        self.port = port
        if port is None:
            self.address = host
        else:
            self.address = (host, port)
        self.sock = None
        self.closeOnError = False
        self.retryTime = None
        #
        # Exponential backoff parameters.
        #
        self.retryStart = 1.0
        self.retryMax = 30.0
        self.retryFactor = 2.0

    def makeSocket(self, timeout=1):
        """
        A factory method which allows subclasses to define the precise
        type of socket they want.
        """
        if self.port is not None:
            result = socket.create_connection(self.address, timeout=timeout)
        else:
            result = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
            result.settimeout(timeout)
            try:
                result.connect(self.address)
            except OSError:
                result.close()  # Issue 19182
                raise
        return result

    def createSocket(self):
        """
        Try to create a socket, using an exponential backoff with
        a max retry time. Thanks to Robert Olson for the original patch
        (SF #815911) which has been slightly refactored.
        """
        now = time.time()
        # Either retryTime is None, in which case this
        # is the first time back after a disconnect, or
        # we've waited long enough.
        if self.retryTime is None:
            attempt = True
        else:
            attempt = (now >= self.retryTime)
        if attempt:
            try:
                self.sock = self.makeSocket()
                self.retryTime = None # next time, no delay before trying
            except OSError:
                #Creation failed, so set the retry time and return.
                if self.retryTime is None:
                    self.retryPeriod = self.retryStart
                else:
                    self.retryPeriod = self.retryPeriod * self.retryFactor
                    if self.retryPeriod > self.retryMax:
                        self.retryPeriod = self.retryMax
                self.retryTime = now + self.retryPeriod

    def send(self, s):
        """
        Send a pickled string to the socket.

        This function allows for partial sends which can happen when the
        network is busy.
        """
        if self.sock is None:
            self.createSocket()
        #self.sock can be None either because we haven't reached the retry
        #time yet, or because we have reached the retry time and retried,
        #but are still unable to connect.
        if self.sock:
            try:
                self.sock.sendall(s)
            except OSError: #pragma: no cover
                self.sock.close()
                self.sock = None  # so we can call createSocket next time

    def makePickle(self, record):
        """
        Pickles the record in binary format with a length prefix, and
        returns it ready for transmission across the socket.
        """
        ei = record.exc_info
        if ei:
            # just to get traceback text into record.exc_text ...
            dummy = self.format(record)
        # See issue #14436: If msg or args are objects, they may not be
        # available on the receiving end. So we convert the msg % args
        # to a string, save it as msg and zap the args.
        d = dict(record.__dict__)
        d['msg'] = record.getMessage()
        d['args'] = None
        d['exc_info'] = None
        # Issue #25685: delete 'message' if present: redundant with 'msg'
        d.pop('message', None)
        s = pickle.dumps(d, 1)
        slen = struct.pack(">L", len(s))
        return slen + s

    def handleError(self, record):
        """
        Handle an error during logging.

        An error has occurred during logging. Most likely cause -
        connection lost. Close the socket so that we can retry on the
        next event.
        """
        if self.closeOnError and self.sock:
            self.sock.close()
            self.sock = None        #try to reconnect next time
        else:
            logging.Handler.handleError(self, record)

    def emit(self, record):
        """
        Emit a record.

        Pickles the record and writes it to the socket in binary format.
        If there is an error with the socket, silently drop the packet.
        If there was a problem with the socket, re-establishes the
        socket.
        """
        try:
            s = self.makePickle(record)
            self.send(s)
        except Exception:
            self.handleError(record)

    def close(self):
        """
        Closes the socket.
        """
        self.acquire()
        try:
            sock = self.sock
            if sock:
                self.sock = None
                sock.close()
            logging.Handler.close(self)
        finally:
            self.release()

class DatagramHandler(SocketHandler):
    """
    A handler class which writes logging records, in pickle format, to
    a datagram socket.  The pickle which is sent is that of the LogRecord's
    attribute dictionary (__dict__), so that the receiver does not need to
    have the logging module installed in order to process the logging event.

    To unpickle the record at the receiving end into a LogRecord, use the
    makeLogRecord function.

    """
    def __init__(self, host, port):
        """
        Initializes the handler with a specific host address and port.
        """
        SocketHandler.__init__(self, host, port)
        self.closeOnError = False

    def makeSocket(self):
        """
        The factory method of SocketHandler is here overridden to create
        a UDP socket (SOCK_DGRAM).
        """
        if self.port is None:
            family = socket.AF_UNIX
        else:
            family = socket.AF_INET
        s = socket.socket(family, socket.SOCK_DGRAM)
        return s

    def send(self, s):
        """
        Send a pickled string to a socket.

        This function no longer allows for partial sends which can happen
        when the network is busy - UDP does not guarantee delivery and
        can deliver packets out of sequence.
        """
        if self.sock is None:
            self.createSocket()
        self.sock.sendto(s, self.address)

class SysLogHandler(logging.Handler):
    """
    A handler class which sends formatted logging records to a syslog
    server. Based on Sam Rushing's syslog module:
    http://www.nightmare.com/squirl/python-ext/misc/syslog.py
    Contributed by Nicolas Untz (after which minor refactoring changes
    have been made).
    """

    # from <linux/sys/syslog.h>:
    # ======================================================================
    # priorities/facilities are encoded into a single 32-bit quantity, where
    # the bottom 3 bits are the priority (0-7) and the top 28 bits are the
    # facility (0-big number). Both the priorities and the facilities map
    # roughly one-to-one to strings in the syslogd(8) source code.  This
    # mapping is included in this file.
    #
    # priorities (these are ordered)

    LOG_EMERG     = 0       #  system is unusable
    LOG_ALERT     = 1       #  action must be taken immediately
    LOG_CRIT      = 2       #  critical conditions
    LOG_ERR       = 3       #  error conditions
    LOG_WARNING   = 4       #  warning conditions
    LOG_NOTICE    = 5       #  normal but significant condition
    LOG_INFO      = 6       #  informational
    LOG_DEBUG     = 7       #  debug-level messages

    #  facility codes
    LOG_KERN      = 0       #  kernel messages
    LOG_USER      = 1       #  random user-level messages
    LOG_MAIL      = 2       #  mail system
    LOG_DAEMON    = 3       #  system daemons
    LOG_AUTH      = 4       #  security/authorization messages
    LOG_SYSLOG    = 5       #  messages generated internally by syslogd
    LOG_LPR       = 6       #  line printer subsystem
    LOG_NEWS      = 7       #  network news subsystem
    LOG_UUCP      = 8       #  UUCP subsystem
    LOG_CRON      = 9       #  clock daemon
    LOG_AUTHPRIV  = 10      #  security/authorization messages (private)
    LOG_FTP       = 11      #  FTP daemon

    #  other codes through 15 reserved for system use
    LOG_LOCAL0    = 16      #  reserved for local use
    LOG_LOCAL1    = 17      #  reserved for local use
    LOG_LOCAL2    = 18      #  reserved for local use
    LOG_LOCAL3    = 19      #  reserved for local use
    LOG_LOCAL4    = 20      #  reserved for local use
    LOG_LOCAL5    = 21      #  reserved for local use
    LOG_LOCAL6    = 22      #  reserved for local use
    LOG_LOCAL7    = 23      #  reserved for local use

    priority_names = {
        "alert":    LOG_ALERT,
        "crit":     LOG_CRIT,
        "critical": LOG_CRIT,
        "debug":    LOG_DEBUG,
        "emerg":    LOG_EMERG,
        "err":      LOG_ERR,
        "error":    LOG_ERR,        #  DEPRECATED
        "info":     LOG_INFO,
        "notice":   LOG_NOTICE,
        "panic":    LOG_EMERG,      #  DEPRECATED
        "warn":     LOG_WARNING,    #  DEPRECATED
        "warning":  LOG_WARNING,
        }

    facility_names = {
        "auth":     LOG_AUTH,
        "authpriv": LOG_AUTHPRIV,
        "cron":     LOG_CRON,
        "daemon":   LOG_DAEMON,
        "ftp":      LOG_FTP,
        "kern":     LOG_KERN,
        "lpr":      LOG_LPR,
        "mail":     LOG_MAIL,
        "news":     LOG_NEWS,
        "security": LOG_AUTH,       #  DEPRECATED
        "syslog":   LOG_SYSLOG,
        "user":     LOG_USER,
        "uucp":     LOG_UUCP,
        "local0":   LOG_LOCAL0,
        "local1":   LOG_LOCAL1,
        "local2":   LOG_LOCAL2,
        "local3":   LOG_LOCAL3,
        "local4":   LOG_LOCAL4,
        "local5":   LOG_LOCAL5,
        "local6":   LOG_LOCAL6,
        "local7":   LOG_LOCAL7,
        }

    #The map below appears to be trivially lowercasing the key. However,
    #there's more to it than meets the eye - in some locales, lowercasing
    #gives unexpected results. See SF #1524081: in the Turkish locale,
    #"INFO".lower() != "info"
    priority_map = {
        "DEBUG" : "debug",
        "INFO" : "info",
        "WARNING" : "warning",
        "ERROR" : "error",
        "CRITICAL" : "critical"
    }

    def __init__(self, address=('localhost', SYSLOG_UDP_PORT),
                 facility=LOG_USER, socktype=None):
        """
        Initialize a handler.

        If address is specified as a string, a UNIX socket is used. To log to a
        local syslogd, "SysLogHandler(address="/dev/log")" can be used.
        If facility is not specified, LOG_USER is used. If socktype is
        specified as socket.SOCK_DGRAM or socket.SOCK_STREAM, that specific
        socket type will be used. For Unix sockets, you can also specify a
        socktype of None, in which case socket.SOCK_DGRAM will be used, falling
        back to socket.SOCK_STREAM.
        """
        logging.Handler.__init__(self)

        self.address = address
        self.facility = facility
        self.socktype = socktype

        if isinstance(address, str):
            self.unixsocket = True
            # Syslog server may be unavailable during handler initialisation.
            # C's openlog() function also ignores connection errors.
            # Moreover, we ignore these errors while logging, so it not worse
            # to ignore it also here.
            try:
                self._connect_unixsocket(address)
            except OSError:
                pass
        else:
            self.unixsocket = False
            if socktype is None:
                socktype = socket.SOCK_DGRAM
            host, port = address
            ress = socket.getaddrinfo(host, port, 0, socktype)
            if not ress:
                raise OSError("getaddrinfo returns an empty list")
            for res in ress:
                af, socktype, proto, _, sa = res
                err = sock = None
                try:
                    sock = socket.socket(af, socktype, proto)
                    if socktype == socket.SOCK_STREAM:
                        sock.connect(sa)
                    break
                except OSError as exc:
                    err = exc
                    if sock is not None:
                        sock.close()
            if err is not None:
                raise err
            self.socket = sock
            self.socktype = socktype

    def _connect_unixsocket(self, address):
        use_socktype = self.socktype
        if use_socktype is None:
            use_socktype = socket.SOCK_DGRAM
        self.socket = socket.socket(socket.AF_UNIX, use_socktype)
        try:
            self.socket.connect(address)
            # it worked, so set self.socktype to the used type
            self.socktype = use_socktype
        except OSError:
            self.socket.close()
            if self.socktype is not None:
                # user didn't specify falling back, so fail
                raise
            use_socktype = socket.SOCK_STREAM
            self.socket = socket.socket(socket.AF_UNIX, use_socktype)
            try:
                self.socket.connect(address)
                # it worked, so set self.socktype to the used type
                self.socktype = use_socktype
            except OSError:
                self.socket.close()
                raise

    def encodePriority(self, facility, priority):
        """
        Encode the facility and priority. You can pass in strings or
        integers - if strings are passed, the facility_names and
        priority_names mapping dictionaries are used to convert them to
        integers.
        """
        if isinstance(facility, str):
            facility = self.facility_names[facility]
        if isinstance(priority, str):
            priority = self.priority_names[priority]
        return (facility << 3) | priority

    def close(self):
        """
        Closes the socket.
        """
        self.acquire()
        try:
            self.socket.close()
            logging.Handler.close(self)
        finally:
            self.release()

    def mapPriority(self, levelName):
        """
        Map a logging level name to a key in the priority_names map.
        This is useful in two scenarios: when custom levels are being
        used, and in the case where you can't do a straightforward
        mapping by lowercasing the logging level name because of locale-
        specific issues (see SF #1524081).
        """
        return self.priority_map.get(levelName, "warning")

    ident = ''          # prepended to all messages
    append_nul = True   # some old syslog daemons expect a NUL terminator

    def emit(self, record):
        """
        Emit a record.

        The record is formatted, and then sent to the syslog server. If
        exception information is present, it is NOT sent to the server.
        """
        try:
            msg = self.format(record)
            if self.ident:
                msg = self.ident + msg
            if self.append_nul:
                msg += '\000'

            # We need to convert record level to lowercase, maybe this will
            # change in the future.
            prio = '<%d>' % self.encodePriority(self.facility,
                                                self.mapPriority(record.levelname))
            prio = prio.encode('utf-8')
            # Message is a string. Convert to bytes as required by RFC 5424
            msg = msg.encode('utf-8')
            msg = prio + msg
            if self.unixsocket:
                try:
                    self.socket.send(msg)
                except OSError:
                    self.socket.close()
                    self._connect_unixsocket(self.address)
                    self.socket.send(msg)
            elif self.socktype == socket.SOCK_DGRAM:
                self.socket.sendto(msg, self.address)
            else:
                self.socket.sendall(msg)
        except Exception:
            self.handleError(record)

class SMTPHandler(logging.Handler):
    """
    A handler class which sends an SMTP email for each logging event.
    """
    def __init__(self, mailhost, fromaddr, toaddrs, subject,
                 credentials=None, secure=None, timeout=5.0):
        """
        Initialize the handler.

        Initialize the instance with the from and to addresses and subject
        line of the email. To specify a non-standard SMTP port, use the
        (host, port) tuple format for the mailhost argument. To specify
        authentication credentials, supply a (username, password) tuple
        for the credentials argument. To specify the use of a secure
        protocol (TLS), pass in a tuple for the secure argument. This will
        only be used when authentication credentials are supplied. The tuple
        will be either an empty tuple, or a single-value tuple with the name
        of a keyfile, or a 2-value tuple with the names of the keyfile and
        certificate file. (This tuple is passed to the `starttls` method).
        A timeout in seconds can be specified for the SMTP connection (the
        default is one second).
        """
        logging.Handler.__init__(self)
        if isinstance(mailhost, (list, tuple)):
            self.mailhost, self.mailport = mailhost
        else:
            self.mailhost, self.mailport = mailhost, None
        if isinstance(credentials, (list, tuple)):
            self.username, self.password = credentials
        else:
            self.username = None
        self.fromaddr = fromaddr
        if isinstance(toaddrs, str):
            toaddrs = [toaddrs]
        self.toaddrs = toaddrs
        self.subject = subject
        self.secure = secure
        self.timeout = timeout

    def getSubject(self, record):
        """
        Determine the subject for the email.

        If you want to specify a subject line which is record-dependent,
        override this method.
        """
        return self.subject

    def emit(self, record):
        """
        Emit a record.

        Format the record and send it to the specified addressees.
        """
        try:
            import smtplib
            from email.message import EmailMessage
            import email.utils

            port = self.mailport
            if not port:
                port = smtplib.SMTP_PORT
            smtp = smtplib.SMTP(self.mailhost, port, timeout=self.timeout)
            msg = EmailMessage()
            msg['From'] = self.fromaddr
            msg['To'] = ','.join(self.toaddrs)
            msg['Subject'] = self.getSubject(record)
            msg['Date'] = email.utils.localtime()
            msg.set_content(self.format(record))
            if self.username:
                if self.secure is not None:
                    smtp.ehlo()
                    smtp.starttls(*self.secure)
                    smtp.ehlo()
                smtp.login(self.username, self.password)
            smtp.send_message(msg)
            smtp.quit()
        except Exception:
            self.handleError(record)

class NTEventLogHandler(logging.Handler):
    """
    A handler class which sends events to the NT Event Log. Adds a
    registry entry for the specified application name. If no dllname is
    provided, win32service.pyd (which contains some basic message
    placeholders) is used. Note that use of these placeholders will make
    your event logs big, as the entire message source is held in the log.
    If you want slimmer logs, you have to pass in the name of your own DLL
    which contains the message definitions you want to use in the event log.
    """
    def __init__(self, appname, dllname=None, logtype="Application"):
        logging.Handler.__init__(self)
        try:
            import win32evtlogutil, win32evtlog
            self.appname = appname
            self._welu = win32evtlogutil
            if not dllname:
                dllname = os.path.split(self._welu.__file__)
                dllname = os.path.split(dllname[0])
                dllname = os.path.join(dllname[0], r'win32service.pyd')
            self.dllname = dllname
            self.logtype = logtype
            self._welu.AddSourceToRegistry(appname, dllname, logtype)
            self.deftype = win32evtlog.EVENTLOG_ERROR_TYPE
            self.typemap = {
                logging.DEBUG   : win32evtlog.EVENTLOG_INFORMATION_TYPE,
                logging.INFO    : win32evtlog.EVENTLOG_INFORMATION_TYPE,
                logging.WARNING : win32evtlog.EVENTLOG_WARNING_TYPE,
                logging.ERROR   : win32evtlog.EVENTLOG_ERROR_TYPE,
                logging.CRITICAL: win32evtlog.EVENTLOG_ERROR_TYPE,
         }
        except ImportError:
            print("The Python Win32 extensions for NT (service, event "\
                        "logging) appear not to be available.")
            self._welu = None

    def getMessageID(self, record):
        """
        Return the message ID for the event record. If you are using your
        own messages, you could do this by having the msg passed to the
        logger being an ID rather than a formatting string. Then, in here,
        you could use a dictionary lookup to get the message ID. This
        version returns 1, which is the base message ID in win32service.pyd.
        """
        return 1

    def getEventCategory(self, record):
        """
        Return the event category for the record.

        Override this if you want to specify your own categories. This version
        returns 0.
        """
        return 0

    def getEventType(self, record):
        """
        Return the event type for the record.

        Override this if you want to specify your own types. This version does
        a mapping using the handler's typemap attribute, which is set up in
        __init__() to a dictionary which contains mappings for DEBUG, INFO,
        WARNING, ERROR and CRITICAL. If you are using your own levels you will
        either need to override this method or place a suitable dictionary in
        the handler's typemap attribute.
        """
        return self.typemap.get(record.levelno, self.deftype)

    def emit(self, record):
        """
        Emit a record.

        Determine the message ID, event category and event type. Then
        log the message in the NT event log.
        """
        if self._welu:
            try:
                id = self.getMessageID(record)
                cat = self.getEventCategory(record)
                type = self.getEventType(record)
                msg = self.format(record)
                self._welu.ReportEvent(self.appname, id, cat, type, [msg])
            except Exception:
                self.handleError(record)

    def close(self):
        """
        Clean up this handler.

        You can remove the application name from the registry as a
        source of event log entries. However, if you do this, you will
        not be able to see the events as you intended in the Event Log
        Viewer - it needs to be able to access the registry to get the
        DLL name.
        """
        #self._welu.RemoveSourceFromRegistry(self.appname, self.logtype)
        logging.Handler.close(self)

class HTTPHandler(logging.Handler):
    """
    A class which sends records to a Web server, using either GET or
    POST semantics.
    """
    def __init__(self, host, url, method="GET", secure=False, credentials=None,
                 context=None):
        """
        Initialize the instance with the host, the request URL, and the method
        ("GET" or "POST")
        """
        logging.Handler.__init__(self)
        method = method.upper()
        if method not in ["GET", "POST"]:
            raise ValueError("method must be GET or POST")
        if not secure and context is not None:
            raise ValueError("context parameter only makes sense "
                             "with secure=True")
        self.host = host
        self.url = url
        self.method = method
        self.secure = secure
        self.credentials = credentials
        self.context = context

    def mapLogRecord(self, record):
        """
        Default implementation of mapping the log record into a dict
        that is sent as the CGI data. Overwrite in your class.
        Contributed by Franz Glasner.
        """
        return record.__dict__

    def emit(self, record):
        """
        Emit a record.

        Send the record to the Web server as a percent-encoded dictionary
        """
        try:
            import http.client, urllib.parse
            host = self.host
            if self.secure:
                h = http.client.HTTPSConnection(host, context=self.context)
            else:
                h = http.client.HTTPConnection(host)
            url = self.url
            data = urllib.parse.urlencode(self.mapLogRecord(record))
            if self.method == "GET":
                if (url.find('?') >= 0):
                    sep = '&'
                else:
                    sep = '?'
                url = url + "%c%s" % (sep, data)
            h.putrequest(self.method, url)
            # support multiple hosts on one IP address...
            # need to strip optional :port from host, if present
            i = host.find(":")
            if i >= 0:
                host = host[:i]
            # See issue #30904: putrequest call above already adds this header
            # on Python 3.x.
            # h.putheader("Host", host)
            if self.method == "POST":
                h.putheader("Content-type",
                            "application/x-www-form-urlencoded")
                h.putheader("Content-length", str(len(data)))
            if self.credentials:
                import base64
                s = ('%s:%s' % self.credentials).encode('utf-8')
                s = 'Basic ' + base64.b64encode(s).strip().decode('ascii')
                h.putheader('Authorization', s)
            h.endheaders()
            if self.method == "POST":
                h.send(data.encode('utf-8'))
            h.getresponse()    #can't do anything with the result
        except Exception:
            self.handleError(record)

class BufferingHandler(logging.Handler):
    """
  A handler class which buffers logging records in memory. Whenever each
  record is added to the buffer, a check is made to see if the buffer should
  be flushed. If it should, then flush() is expected to do what's needed.
    """
    def __init__(self, capacity):
        """
        Initialize the handler with the buffer size.
        """
        logging.Handler.__init__(self)
        self.capacity = capacity
        self.buffer = []

    def shouldFlush(self, record):
        """
        Should the handler flush its buffer?

        Returns true if the buffer is up to capacity. This method can be
        overridden to implement custom flushing strategies.
        """
        return (len(self.buffer) >= self.capacity)

    def emit(self, record):
        """
        Emit a record.

        Append the record. If shouldFlush() tells us to, call flush() to process
        the buffer.
        """
        self.buffer.append(record)
        if self.shouldFlush(record):
            self.flush()

    def flush(self):
        """
        Override to implement custom flushing behaviour.

        This version just zaps the buffer to empty.
        """
        self.acquire()
        try:
            self.buffer = []
        finally:
            self.release()

    def close(self):
        """
        Close the handler.

        This version just flushes and chains to the parent class' close().
        """
        try:
            self.flush()
        finally:
            logging.Handler.close(self)

class MemoryHandler(BufferingHandler):
    """
    A handler class which buffers logging records in memory, periodically
    flushing them to a target handler. Flushing occurs whenever the buffer
    is full, or when an event of a certain severity or greater is seen.
    """
    def __init__(self, capacity, flushLevel=logging.ERROR, target=None,
                 flushOnClose=True):
        """
        Initialize the handler with the buffer size, the level at which
        flushing should occur and an optional target.

        Note that without a target being set either here or via setTarget(),
        a MemoryHandler is no use to anyone!

        The ``flushOnClose`` argument is ``True`` for backward compatibility
        reasons - the old behaviour is that when the handler is closed, the
        buffer is flushed, even if the flush level hasn't been exceeded nor the
        capacity exceeded. To prevent this, set ``flushOnClose`` to ``False``.
        """
        BufferingHandler.__init__(self, capacity)
        self.flushLevel = flushLevel
        self.target = target
        # See Issue #26559 for why this has been added
        self.flushOnClose = flushOnClose

    def shouldFlush(self, record):
        """
        Check for buffer full or a record at the flushLevel or higher.
        """
        return (len(self.buffer) >= self.capacity) or \
                (record.levelno >= self.flushLevel)

    def setTarget(self, target):
        """
        Set the target handler for this handler.
        """
        self.acquire()
        try:
            self.target = target
        finally:
            self.release()

    def flush(self):
        """
        For a MemoryHandler, flushing means just sending the buffered
        records to the target, if there is one. Override if you want
        different behaviour.

        The record buffer is also cleared by this operation.
        """
        self.acquire()
        try:
            if self.target:
                for record in self.buffer:
                    self.target.handle(record)
                self.buffer = []
        finally:
            self.release()

    def close(self):
        """
        Flush, if appropriately configured, set the target to None and lose the
        buffer.
        """
        try:
            if self.flushOnClose:
                self.flush()
        finally:
            self.acquire()
            try:
                self.target = None
                BufferingHandler.close(self)
            finally:
                self.release()


class QueueHandler(logging.Handler):
    """
    This handler sends events to a queue. Typically, it would be used together
    with a multiprocessing Queue to centralise logging to file in one process
    (in a multi-process application), so as to avoid file write contention
    between processes.

    This code is new in Python 3.2, but this class can be copy pasted into
    user code for use with earlier Python versions.
    """

    def __init__(self, queue):
        """
        Initialise an instance, using the passed queue.
        """
        logging.Handler.__init__(self)
        self.queue = queue

    def enqueue(self, record):
        """
        Enqueue a record.

        The base implementation uses put_nowait. You may want to override
        this method if you want to use blocking, timeouts or custom queue
        implementations.
        """
        self.queue.put_nowait(record)

    def prepare(self, record):
        """
        Prepares a record for queuing. The object returned by this method is
        enqueued.

        The base implementation formats the record to merge the message
        and arguments, and removes unpickleable items from the record
        in-place.

        You might want to override this method if you want to convert
        the record to a dict or JSON string, or send a modified copy
        of the record while leaving the original intact.
        """
        # The format operation gets traceback text into record.exc_text
        # (if there's exception data), and also returns the formatted
        # message. We can then use this to replace the original
        # msg + args, as these might be unpickleable. We also zap the
        # exc_info and exc_text attributes, as they are no longer
        # needed and, if not None, will typically not be pickleable.
        msg = self.format(record)
        # bpo-35726: make copy of record to avoid affecting other handlers in the chain.
        record = copy.copy(record)
        record.message = msg
        record.msg = msg
        record.args = None
        record.exc_info = None
        record.exc_text = None
        return record

    def emit(self, record):
        """
        Emit a record.

        Writes the LogRecord to the queue, preparing it for pickling first.
        """
        try:
            self.enqueue(self.prepare(record))
        except Exception:
            self.handleError(record)


class QueueListener(object):
    """
    This class implements an internal threaded listener which watches for
    LogRecords being added to a queue, removes them and passes them to a
    list of handlers for processing.
    """
    _sentinel = None

    def __init__(self, queue, *handlers, respect_handler_level=False):
        """
        Initialise an instance with the specified queue and
        handlers.
        """
        self.queue = queue
        self.handlers = handlers
        self._thread = None
        self.respect_handler_level = respect_handler_level

    def dequeue(self, block):
        """
        Dequeue a record and return it, optionally blocking.

        The base implementation uses get. You may want to override this method
        if you want to use timeouts or work with custom queue implementations.
        """
        return self.queue.get(block)

    def start(self):
        """
        Start the listener.

        This starts up a background thread to monitor the queue for
        LogRecords to process.
        """
        self._thread = t = threading.Thread(target=self._monitor)
        t.daemon = True
        t.start()

    def prepare(self, record):
        """
        Prepare a record for handling.

        This method just returns the passed-in record. You may want to
        override this method if you need to do any custom marshalling or
        manipulation of the record before passing it to the handlers.
        """
        return record

    def handle(self, record):
        """
        Handle a record.

        This just loops through the handlers offering them the record
        to handle.
        """
        record = self.prepare(record)
        for handler in self.handlers:
            if not self.respect_handler_level:
                process = True
            else:
                process = record.levelno >= handler.level
            if process:
                handler.handle(record)

    def _monitor(self):
        """
        Monitor the queue for records, and ask the handler
        to deal with them.

        This method runs on a separate, internal thread.
        The thread will terminate if it sees a sentinel object in the queue.
        """
        q = self.queue
        has_task_done = hasattr(q, 'task_done')
        while True:
            try:
                record = self.dequeue(True)
                if record is self._sentinel:
                    if has_task_done:
                        q.task_done()
                    break
                self.handle(record)
                if has_task_done:
                    q.task_done()
            except queue.Empty:
                break

    def enqueue_sentinel(self):
        """
        This is used to enqueue the sentinel record.

        The base implementation uses put_nowait. You may want to override this
        method if you want to use timeouts or work with custom queue
        implementations.
        """
        self.queue.put_nowait(self._sentinel)

    def stop(self):
        """
        Stop the listener.

        This asks the thread to terminate, and then waits for it to do so.
        Note that if you don't call this before your application exits, there
        may be some records still left on the queue, which won't be processed.
        """
        self.enqueue_sentinel()
        self._thread.join()
        self._thread = None
__pycache__/handlers.cpython-38.opt-2.pyc000064400000057655150327210140014161 0ustar00U

e5dq��@svddlZddlZddlZddlZddlZddlZddlZddlmZm	Z	m
Z
ddlZddlZddl
Z
dZdZdZdZdZdZdZGd	d
�d
ej�ZGdd�de�ZGd
d�de�ZGdd�dej�ZGdd�dej�ZGdd�de�ZGdd�dej�ZGdd�dej�ZGdd�dej�ZGdd�dej�Z Gdd�dej�Z!Gdd �d e!�Z"Gd!d"�d"ej�Z#Gd#d$�d$e$�Z%dS)%�N)�ST_DEV�ST_INO�ST_MTIMEi<#i=#i>#i?#i�Qc@s.eZdZddd�Zdd�Zdd�Zd	d
�ZdS)�BaseRotatingHandlerNFcCs0tj�|||||�||_||_d|_d|_dS�N)�logging�FileHandler�__init__�mode�encoding�namer�rotator��self�filenamerr�delay�r�(/usr/lib64/python3.8/logging/handlers.pyr
3s
zBaseRotatingHandler.__init__cCsHz$|�|�r|��tj�||�Wntk
rB|�|�YnXdSr)�shouldRollover�
doRolloverrr	�emit�	Exception�handleError�r�recordrrrr=s
zBaseRotatingHandler.emitcCst|j�s|}n
|�|�}|Sr)�callabler
)rZdefault_name�resultrrr�rotation_filenameKs

z%BaseRotatingHandler.rotation_filenamecCs4t|j�s$tj�|�r0t�||�n|�||�dSr)rr�os�path�exists�rename)r�source�destrrr�rotate^s
zBaseRotatingHandler.rotate)NF)�__name__�
__module__�__qualname__r
rrr%rrrrr-s

rc@s&eZdZddd�Zdd�Zd	d
�ZdS)�RotatingFileHandler�arNFcCs.|dkrd}t�|||||�||_||_dS)Nrr*)rr
�maxBytes�backupCount)rrrr+r,rrrrrr
xs
zRotatingFileHandler.__init__cCs�|jr|j��d|_|jdkr�t|jddd�D]^}|�d|j|f�}|�d|j|df�}tj�|�r2tj�|�r�t�	|�t�
||�q2|�|jd�}tj�|�r�t�	|�|�|j|�|js�|�
�|_dS)Nr����z%s.%dz.1)�stream�closer,�ranger�baseFilenamerr r!�remover"r%r�_open)r�iZsfn�dfnrrrr�s&


�

zRotatingFileHandler.doRollovercCsZ|jdkr|��|_|jdkrVd|�|�}|j�dd�|j��t|�|jkrVdSdS)Nrz%s
�r-)r/r4r+�format�seek�tell�len�rr�msgrrrr�s


z"RotatingFileHandler.shouldRollover)r*rrNF)r&r'r(r
rrrrrrr)ss
 r)c@s6eZdZddd�Zdd	�Zd
d�Zdd
�Zdd�ZdS)�TimedRotatingFileHandler�hr-rNFc	
Cs�t�||d||�|��|_||_||_||_|jdkrLd|_d|_d|_	n�|jdkrjd|_d|_d	|_	n�|jd
kr�d|_d|_d
|_	n�|jdks�|jdkr�d|_d|_d|_	n�|j�
d��r*d|_t|j�dkr�td|j��|jddks�|jddk�rtd|j��t
|jd�|_d|_d|_	ntd|j��t�|j	tj�|_	|j||_|j}tj�|��rzt�|�t}	nt
t���}	|�|	�|_dS)Nr*�Sr-z%Y-%m-%d_%H-%M-%Sz-^\d{4}-\d{2}-\d{2}_\d{2}-\d{2}-\d{2}(\.\w+)?$�M�<z%Y-%m-%d_%H-%Mz'^\d{4}-\d{2}-\d{2}_\d{2}-\d{2}(\.\w+)?$�H�z%Y-%m-%d_%Hz!^\d{4}-\d{2}-\d{2}_\d{2}(\.\w+)?$�D�MIDNIGHTrz%Y-%m-%dz^\d{4}-\d{2}-\d{2}(\.\w+)?$�Wi�:	r7zHYou must specify a day for weekly rollover from 0 to 6 (0 is Monday): %s�0�6z-Invalid day specified for weekly rollover: %sz'Invalid rollover interval specified: %s)rr
�upper�whenr,�utc�atTime�interval�suffix�extMatch�
startswithr;�
ValueError�int�	dayOfWeek�re�compile�ASCIIr2rr r!�statr�time�computeRollover�
rolloverAt)
rrrKrNr,rrrLrM�trrrr
�sL



z!TimedRotatingFileHandler.__init__cCsd||j}|jdks"|j�d��r`|jr4t�|�}n
t�|�}|d}|d}|d}|d}|jdkrnt}n |jj	d|jj
d|jj}||d|d|}	|	dkr�|	t7}	|d	d
}||	}|j�d��r`|}
|
|jk�r`|
|jkr�|j|
}nd|
|jd	}||d}|j�s\|d}
t�|�d}|
|k�r\|
�sPd
}nd}||7}|}|S)NrFrG����rBrr-�rr.���rD)
rNrKrQrLrY�gmtime�	localtimerM�	_MIDNIGHTZhourZminute�secondrT)r�currentTimerr\ZcurrentHourZ
currentMinuteZ
currentSecondZ
currentDayZ	rotate_ts�rZdayZ
daysToWait�
newRolloverAt�dstNow�
dstAtRollover�addendrrrrZsL


��

z(TimedRotatingFileHandler.computeRollovercCstt���}||jkrdSdS)Nr-r)rSrYr[)rrr\rrrrIs
z'TimedRotatingFileHandler.shouldRolloverc	Cs�tj�|j�\}}t�|�}g}|d}t|�}|D]@}|d|�|kr4||d�}|j�|�r4|�tj�	||��q4t|�|j
kr�g}n|��|dt|�|j
�}|S)N�.)rr �splitr2�listdirr;rP�match�append�joinr,�sort)	rZdirNameZbaseNameZ	fileNamesr�prefixZplenZfileNamerOrrr�getFilesToDeleteUs
z)TimedRotatingFileHandler.getFilesToDeletecCsv|jr|j��d|_tt���}t�|�d}|j|j}|jrNt�|�}n6t�|�}|d}||kr�|rrd}nd}t�||�}|�	|j
dt�|j|��}t
j�|�r�t
�|�|�|j
|�|jdkr�|��D]}t
�|�q�|js�|��|_|�|�}	|	|k�r|	|j}	�q|jdk�s4|j�d��rl|j�slt�|	�d}
||
k�rl|�s`d}nd}|	|7}	|	|_dS)Nr.rDrbrmrrFrG)r/r0rSrYrdr[rNrLrcrr2�strftimerOrr r!r3r%r,rurr4rZrKrQ)rrgrjr\Z	timeTupleZdstThenrlr6�srirkrrrrlsJ

�




"
z#TimedRotatingFileHandler.doRollover)r?r-rNFFN)r&r'r(r
rZrrurrrrrr>�s

9Ir>c@s.eZdZddd�Zdd�Zdd	�Zd
d�ZdS)
�WatchedFileHandlerr*NFcCs,tj�|||||�d\|_|_|��dS)N)r.r.)rr	r
�dev�ino�_statstreamrrrrr
�szWatchedFileHandler.__init__cCs0|jr,t�|j���}|t|t|_|_dSr)r/r�fstat�filenorrryrz�rZsresrrrr{�szWatchedFileHandler._statstreamcCs�zt�|j�}Wntk
r(d}YnX|rJ|t|jksJ|t|jkr�|jdk	r�|j�	�|j�
�d|_|��|_|��dSr)
rrXr2�FileNotFoundErrorrryrrzr/�flushr0r4r{r~rrr�reopenIfNeeded�s
 



z!WatchedFileHandler.reopenIfNeededcCs|��tj�||�dSr)r�rr	rrrrrr�szWatchedFileHandler.emit)r*NF)r&r'r(r
r{r�rrrrrrx�s
rxc@sNeZdZdd�Zddd�Zdd�Zdd	�Zd
d�Zdd
�Zdd�Z	dd�Z
dS)�
SocketHandlercCsZtj�|�||_||_|dkr(||_n
||f|_d|_d|_d|_d|_	d|_
d|_dS)NFg�?g>@g@)r�Handlerr
�host�port�address�sock�closeOnError�	retryTime�
retryStart�retryMax�retryFactor�rr�r�rrrr
�s
zSocketHandler.__init__r-cCsj|jdk	rtj|j|d�}nJt�tjtj�}|�|�z|�|j�Wntk
rd|�	��YnX|S)N��timeout)
r��socketZcreate_connectionr��AF_UNIX�SOCK_STREAMZ
settimeout�connect�OSErrorr0)rr�rrrr�
makeSocket	s

zSocketHandler.makeSocketcCs�t��}|jdkrd}n
||jk}|r�z|��|_d|_WnVtk
r�|jdkr^|j|_n"|j|j|_|j|jkr�|j|_||j|_YnXdS�NT)	rYr�r�r�r�r�ZretryPeriodr�r�)rZnowZattemptrrr�createSockets





zSocketHandler.createSocketcCsR|jdkr|��|jrNz|j�|�Wn$tk
rL|j��d|_YnXdSr)r�r��sendallr�r0�rrwrrr�send6s

zSocketHandler.sendcCsj|j}|r|�|�}t|j�}|��|d<d|d<d|d<|�dd�t�|d�}t�	dt
|��}||S)Nr=�args�exc_info�messager-z>L)r�r8�dict�__dict__Z
getMessage�pop�pickle�dumps�structZpackr;)rrZeiZdummy�drwZslenrrr�
makePickleIs

zSocketHandler.makePicklecCs0|jr|jr|j��d|_ntj�||�dSr)r�r�r0rr�rrrrrr_s
zSocketHandler.handleErrorcCs<z|�|�}|�|�Wntk
r6|�|�YnXdSr)r�r�rr)rrrwrrrrms
	
zSocketHandler.emitcCs@|��z(|j}|r"d|_|��tj�|�W5|��XdSr)�acquire�releaser�r0rr�)rr�rrrr0|szSocketHandler.closeN)r-)r&r'r(r
r�r�r�r�rrr0rrrrr��s

r�c@s$eZdZdd�Zdd�Zdd�ZdS)�DatagramHandlercCst�|||�d|_dS)NF)r�r
r�r�rrrr
�szDatagramHandler.__init__cCs*|jdkrtj}ntj}t�|tj�}|Sr)r�r�r�ZAF_INET�
SOCK_DGRAM)rZfamilyrwrrrr��s

zDatagramHandler.makeSocketcCs&|jdkr|��|j�||j�dSr)r�r��sendtor�r�rrrr��s
zDatagramHandler.sendN)r&r'r(r
r�r�rrrrr��sr�c@seZdZdZdZdZdZdZdZdZ	dZ
dZdZdZ
dZdZdZdZdZd	Zd
ZdZdZd
ZdZdZdZdZdZdZdZeeee
eeee	eeeed�Zeeeeeeee
eeeeeeeeeeeeed�Z dddddd�Z!de"fedfdd �Z#d!d"�Z$d#d$�Z%d%d&�Z&d'd(�Z'd)Z(d*Z)d+d,�Z*dS)-�
SysLogHandlerrr-r7r]r^r_r`ra��	�
���������)ZalertZcrit�critical�debugZemerg�err�error�infoZnoticeZpanic�warn�warning)ZauthZauthprivZcron�daemonZftpZkernZlprZmailZnewsZsecurityZsyslog�userZuucpZlocal0Zlocal1Zlocal2Zlocal3Zlocal4Zlocal5Zlocal6Zlocal7r�r�r�r�r�)�DEBUG�INFO�WARNING�ERROR�CRITICALZ	localhostNcCs4tj�|�||_||_||_t|t�rTd|_z|�	|�Wnt
k
rPYnXn�d|_|dkrhtj}|\}}t�
||d|�}|s�t
d��|D]�}|\}}}	}
}d}}
z.t�|||	�}
|tjkr�|
�|�W�qWq�t
k
�r}z|}|
dk	�r|
��W5d}~XYq�Xq�|dk	�r$|�|
|_||_dS)NTFrz!getaddrinfo returns an empty list)rr�r
r��facility�socktype�
isinstance�str�
unixsocket�_connect_unixsocketr�r�r�Zgetaddrinfor�r�r0)rr�r�r�r�r�Zress�resZaf�proto�_Zsar�r��excrrrr
sB





zSysLogHandler.__init__cCs�|j}|dkrtj}t�tj|�|_z|j�|�||_Wnxtk
r�|j��|jdk	r`�tj}t�tj|�|_z|j�|�||_Wn tk
r�|j���YnXYnXdSr)r�r�r�r�r�r�r0r�)rr�Zuse_socktyperrrr�Qs&




z!SysLogHandler._connect_unixsocketcCs4t|t�r|j|}t|t�r(|j|}|d>|BS)Nr])r�r��facility_names�priority_names)rr�Zpriorityrrr�encodePriorityis




zSysLogHandler.encodePrioritycCs2|��z|j��tj�|�W5|��XdSr)r�r�r�r0rr��rrrrr0vs

zSysLogHandler.closecCs|j�|d�S)Nr�)�priority_map�get)rZ	levelNamerrr�mapPriority�szSysLogHandler.mapPriority�TcCsz�|�|�}|jr|j|}|jr*|d7}d|�|j|�|j��}|�d�}|�d�}||}|jr�z|j	�
|�Wq�tk
r�|j	��|�
|j�|j	�
|�Yq�Xn*|jt	jkr�|j	�||j�n|j	�|�Wntk
r�|�|�YnXdS)N�z<%d>�utf-8)r8�ident�
append_nulr�r�r�Z	levelname�encoder�r�r�r�r0r�r�r�r�r�r�rr)rrr=Zpriorrrr�s0



�


zSysLogHandler.emit)+r&r'r(Z	LOG_EMERGZ	LOG_ALERTZLOG_CRITZLOG_ERRZLOG_WARNINGZ
LOG_NOTICEZLOG_INFOZ	LOG_DEBUGZLOG_KERNZLOG_USERZLOG_MAILZ
LOG_DAEMONZLOG_AUTHZ
LOG_SYSLOGZLOG_LPRZLOG_NEWSZLOG_UUCPZLOG_CRONZLOG_AUTHPRIVZLOG_FTPZ
LOG_LOCAL0Z
LOG_LOCAL1Z
LOG_LOCAL2Z
LOG_LOCAL3Z
LOG_LOCAL4Z
LOG_LOCAL5Z
LOG_LOCAL6Z
LOG_LOCAL7r�r�r��SYSLOG_UDP_PORTr
r�r�r0r�r�r�rrrrrr��s�����
6

r�c@s&eZdZd	dd�Zdd�Zdd�ZdS)
�SMTPHandlerN�@cCs�tj�|�t|ttf�r(|\|_|_n|d|_|_t|ttf�rR|\|_|_	nd|_||_
t|t�rn|g}||_||_
||_||_dSr)rr�r
r��list�tuple�mailhost�mailport�username�password�fromaddrr��toaddrs�subject�securer�)rr�r�r�r��credentialsr�r�rrrr
�s
zSMTPHandler.__init__cCs|jSr)r�rrrr�
getSubject�szSMTPHandler.getSubjectcCsz�ddl}ddlm}ddl}|j}|s.|j}|j|j||jd�}|�}|j	|d<d�
|j�|d<|�|�|d<|j
��|d<|�|�|��|jr�|jdk	r�|��|j|j�|��|�|j|j�|�|�|��Wntk
r�|�|�YnXdS)	Nr)�EmailMessager�ZFrom�,ZToZSubjectZDate)�smtplibZ
email.messager�Zemail.utilsr�Z	SMTP_PORTZSMTPr�r�r�rrr�r�ZutilsrdZset_contentr8r�r�ZehloZstarttlsZloginr�Zsend_message�quitrr)rrr�r�Zemailr�Zsmtpr=rrrr�s0


zSMTPHandler.emit)NNr�)r&r'r(r
r�rrrrrr��s�
#	r�c@s>eZdZddd�Zdd�Zdd�Zd	d
�Zdd�Zd
d�ZdS)�NTEventLogHandlerN�Applicationc
Cs�tj�|�z�ddl}ddl}||_||_|s`tj�	|jj
�}tj�	|d�}tj�|dd�}||_||_
|j�|||�|j|_tj|jtj|jtj|jtj|jtj|ji|_Wn"tk
r�td�d|_YnXdS)Nrzwin32service.pydzWThe Python Win32 extensions for NT (service, event logging) appear not to be available.)rr�r
�win32evtlogutil�win32evtlog�appname�_welurr rn�__file__rr�dllname�logtypeZAddSourceToRegistryZEVENTLOG_ERROR_TYPE�deftyper�ZEVENTLOG_INFORMATION_TYPEr�r�ZEVENTLOG_WARNING_TYPEr�r��typemap�ImportError�print)rr�r�r�r�r�rrrr
s6�
zNTEventLogHandler.__init__cCsdS)Nr-rrrrr�getMessageID&szNTEventLogHandler.getMessageIDcCsdS)Nrrrrrr�getEventCategory0sz"NTEventLogHandler.getEventCategorycCs|j�|j|j�Sr)r�r��levelnor�rrrr�getEventType9szNTEventLogHandler.getEventTypecCsn|jrjzD|�|�}|�|�}|�|�}|�|�}|j�|j||||g�Wntk
rh|�|�YnXdSr)	r�r�r�rr8ZReportEventr�rr)rr�id�cat�typer=rrrrFs



zNTEventLogHandler.emitcCstj�|�dSr)rr�r0r�rrrr0WszNTEventLogHandler.close)Nr�)	r&r'r(r
r�r�rrr0rrrrr�s


	
r�c@s&eZdZd
dd�Zdd�Zdd	�ZdS)�HTTPHandler�GETFNcCs`tj�|�|��}|dkr$td��|s8|dk	r8td��||_||_||_||_||_	||_
dS)N)r�POSTzmethod must be GET or POSTz3context parameter only makes sense with secure=True)rr�r
rJrRr��url�methodr�r��context)rr�rrr�r�r	rrrr
iszHTTPHandler.__init__cCs|jSr)r�rrrr�mapLogRecord}szHTTPHandler.mapLogRecordcCsx�zPddl}ddl}|j}|jr4|jj||jd�}n|j�|�}|j}|j	�
|�|��}|jdkr�|�
d�dkrvd}nd}|d||f}|�|j|�|�
d�}	|	dkr�|d|	�}|jdkr�|�d	d
�|�dtt|���|j�r$ddl}
d|j�d
�}d|
�|����d�}|�d|�|��|jdk�rH|�|�d
��|��Wn tk
�rr|�|�YnXdS)Nr)r	r�?�&z%c%s�:rzContent-typez!application/x-www-form-urlencodedzContent-lengthz%s:%sr�zBasic �asciiZ
Authorization)Zhttp.clientZurllib.parser�r�ZclientZHTTPSConnectionr	ZHTTPConnectionr�parseZ	urlencoder
r�findZ
putrequestZ	putheaderr�r;r��base64r�Z	b64encode�strip�decodeZ
endheadersr�Zgetresponserr)rrZhttpZurllibr�r?r�data�sepr5rrwrrrr�sB


�zHTTPHandler.emit)rFNN)r&r'r(r
r
rrrrrrds
�
rc@s4eZdZdd�Zdd�Zdd�Zdd�Zd	d
�ZdS)�BufferingHandlercCstj�|�||_g|_dSr)rr�r
�capacity�buffer)rrrrrr
�szBufferingHandler.__init__cCst|j�|jkSr)r;rrrrrr�shouldFlush�szBufferingHandler.shouldFlushcCs"|j�|�|�|�r|��dSr)rrqrr�rrrrr�s
zBufferingHandler.emitcCs"|��z
g|_W5|��XdSr)r�r�rr�rrrr��s
zBufferingHandler.flushc	Cs z|��W5tj�|�XdSr)rr�r0r�r�rrrr0�szBufferingHandler.closeN)r&r'r(r
rrr�r0rrrrr�s
	rc@s>eZdZejddfdd�Zdd�Zdd�Zd	d
�Zdd�Z	dS)
�
MemoryHandlerNTcCs"t�||�||_||_||_dSr)rr
�
flushLevel�target�flushOnClose)rrrrrrrrr
�szMemoryHandler.__init__cCst|j�|jkp|j|jkSr)r;rrr�rrrrrrs
�zMemoryHandler.shouldFlushcCs"|��z
||_W5|��XdSr)r�r�r)rrrrr�	setTarget
s
zMemoryHandler.setTargetcCs@|��z(|jr.|jD]}|j�|�qg|_W5|��XdSr)r�r�rr�handlerrrrr�s

zMemoryHandler.flushcCsBz|jr|��W5|��zd|_t�|�W5|��XXdSr)r�r�rrr0rr�r�rrrr0(szMemoryHandler.close)
r&r'r(rr�r
rrr�r0rrrrr�s�

rc@s,eZdZdd�Zdd�Zdd�Zdd�Zd	S)
�QueueHandlercCstj�|�||_dSr)rr�r
�queue)rr!rrrr
DszQueueHandler.__init__cCs|j�|�dSr)r!�
put_nowaitrrrr�enqueueKszQueueHandler.enqueuecCs6|�|�}t�|�}||_||_d|_d|_d|_|Sr)r8�copyr�r=r�r�Zexc_textr<rrr�prepareUs

zQueueHandler.preparecCs8z|�|�|��Wntk
r2|�|�YnXdSr)r#r%rrrrrrrrszQueueHandler.emitN)r&r'r(r
r#r%rrrrrr 9s
r c@sVeZdZdZdd�dd�Zdd�Zdd	�Zd
d�Zdd
�Zdd�Z	dd�Z
dd�ZdS)�
QueueListenerNF)�respect_handler_levelcGs||_||_d|_||_dSr)r!�handlers�_threadr')rr!r'r(rrrr
�szQueueListener.__init__cCs|j�|�Sr)r!r�)r�blockrrr�dequeue�szQueueListener.dequeuecCs&tj|jd�|_}d|_|��dS)N)rT)�	threadingZThread�_monitorr)r��start)rr\rrrr.�szQueueListener.startcCs|Srrrrrrr%�szQueueListener.preparecCs@|�|�}|jD]*}|js d}n|j|jk}|r|�|�qdSr�)r%r(r'r��levelr)rrZhandlerZprocessrrrr�s

zQueueListener.handlecCsp|j}t|d�}z>|�d�}||jkr6|r2|��Wql|�|�|rL|��Wqtjk
rhYqlYqXqdS)N�	task_doneT)r!�hasattrr+�	_sentinelr0rZEmpty)r�qZ
has_task_donerrrrr-�s



zQueueListener._monitorcCs|j�|j�dSr)r!r"r2r�rrr�enqueue_sentinel�szQueueListener.enqueue_sentinelcCs|��|j��d|_dSr)r4r)rrr�rrr�stop�s
zQueueListener.stop)r&r'r(r2r
r+r.r%rr-r4r5rrrrr&~s
	

r&)&rr�rr�r�rYrUrXrrrr!r,r$ZDEFAULT_TCP_LOGGING_PORTZDEFAULT_UDP_LOGGING_PORTZDEFAULT_HTTP_LOGGING_PORTZDEFAULT_SOAP_LOGGING_PORTr�ZSYSLOG_TCP_PORTrer	rr)r>rxr�r�r�r�r�r�rrrr �objectr&rrrr�<module>s:8FL`E(*PbO9ME__pycache__/config.cpython-38.opt-2.pyc000064400000045176150327210140013621 0ustar00U

e5d��@sJddlZddlZddlZddlZddlZddlZddlZddlZddlZddl	m
Z
mZdZej
Zdad*dd�Zdd�Zd	d
�Zdd�Zd
d�Zdd�Zdd�Zdd�Ze�dej�Zdd�ZGdd�de�ZGdd�dee�ZGdd�de e�Z!Gdd�de"e�Z#Gd d!�d!e�Z$Gd"d#�d#e$�Z%e%Z&d$d%�Z'edfd&d'�Z(d(d)�Z)dS)+�N)�ThreadingTCPServer�StreamRequestHandleriF#TcCs�ddl}t||j�r|}n*|�|�}t|d�r:|�|�n
|�|�t|�}t�	�z t�t||�}t
|||�W5t�
�XdS)Nr�readline)�configparser�
isinstanceZRawConfigParserZConfigParser�hasattrZ	read_file�read�_create_formatters�logging�_acquireLock�_releaseLock�_clearExistingHandlers�_install_handlers�_install_loggers)Zfname�defaults�disable_existing_loggersr�cp�
formatters�handlers�r�&/usr/lib64/python3.8/logging/config.py�
fileConfig3s	



rc	Csl|�d�}|�d�}t|�}|D]F}|d|}zt||�}Wq tk
rdt|�t||�}Yq Xq |S)N�.r)�split�pop�
__import__�getattr�AttributeError)�name�used�found�nrrr�_resolveUs

r"cCsttj|�S�N)�map�str�strip)Zalistrrr�
_strip_spacescsr'cCs�|dd}t|�siS|�d�}t|�}i}|D]v}d|}|j|dddd�}|j|dddd�}|j|d	dd
d�}tj}||�d�}	|	r�t|	�}||||�}
|
||<q2|S)Nr�keys�,zformatter_%s�formatT)�raw�fallback�datefmt�style�%�class)�lenrr'�getr
�	Formatterr")rZflistrZformZsectnameZfsZdfsZstl�c�
class_name�frrrr	fs$

r	c
Cs^|dd}t|�siS|�d�}t|�}i}g}|D�]}|d|}|d}|�dd�}zt|tt��}Wn ttfk
r�t	|�}YnX|�dd	�}	t|	tt��}	|�d
d�}
t|
tt��}
||	|
�}d|kr�|d}|�
|�t|�r�|�||�t|tj
j��r2|�d
d�}
t|
��r2|�||
f�|||<q6|D]\}}|�||��q@|S)Nrr(r)z
handler_%sr0�	formatter��args�()�kwargsz{}�level�target)r1rr'r2�eval�varsr
r�	NameErrorr"�setLevel�setFormatter�
issubclassr�
MemoryHandler�appendZ	setTarget)rr�hlistrZfixups�hand�section�klass�fmtr9r;�hr<r=�trrrr|sB





rcCsTtj}|D]D}|jj|}||krHt|tj�sN|�tj�g|_d|_	q
||_
q
dS)NT)r
�root�manager�
loggerDictrZPlaceHolderrAZNOTSETr�	propagate�disabled)�existing�
child_loggers�disable_existingrM�log�loggerrrr�_handle_existing_loggers�srWcCs|dd}|�d�}tt|��}|�d�|d}tj}|}d|krX|d}|�|�|jdd�D]}|�|�qf|d}	t	|	�r�|	�d�}	t|	�}	|	D]}
|�
||
�q�t|jj�
��}|��g}|D�](}|d|}|d	}
|jd
dd�}t�|
�}|
|k�rv|�|
�d}|
d
}t	|�}t	|�}||k�rl||d|�|k�r`|�||�|d7}�q2|�|
�d|k�r�|d}|�|�|jdd�D]}|�|��q�||_d|_|d}	t	|	�r�|	�d�}	t|	�}	|	D]}
|�
||
��q�q�t|||�dS)N�loggersr(r)rMZlogger_rootr<rz	logger_%s�qualnamerP�)r,rr)r�listr'�remover
rMrAr�
removeHandlerr1�
addHandlerrNrOr(�sortZgetint�	getLogger�indexrErPrQrW)rrrTZllistrHrMrUr<rKrFrGrRrSZqnrPrV�i�prefixed�pflen�num_existingrrrr�sd











rcCs.tj��t�tjdd��tjdd�=dSr#)r
�	_handlers�clearZshutdownZ_handlerListrrrrr
s
r
z^[a-z_][a-z0-9_]*$cCst�|�}|std|��dS)Nz!Not a valid Python identifier: %rT)�
IDENTIFIER�match�
ValueError)�s�mrrr�valid_idents
rmc@seZdZddd�Zdd�ZdS)�ConvertingMixinTcCsB|j�|�}||k	r>|r |||<t|�tttfkr>||_||_|Sr#)�configurator�convert�type�ConvertingDict�ConvertingList�ConvertingTuple�parent�key)�selfrv�value�replace�resultrrr�convert_with_key"s
�z ConvertingMixin.convert_with_keycCs0|j�|�}||k	r,t|�tttfkr,||_|Sr#)rorprqrrrsrtru)rwrxrzrrrrp.s
�zConvertingMixin.convertN)T)�__name__�
__module__�__qualname__r{rprrrrrns
rnc@s(eZdZdd�Zddd�Zd	dd�ZdS)
rrcCst�||�}|�||�Sr#)�dict�__getitem__r{�rwrvrxrrrr�CszConvertingDict.__getitem__NcCst�|||�}|�||�Sr#)rr2r{�rwrv�defaultrxrrrr2GszConvertingDict.getcCst�|||�}|j||dd�S�NF)ry)rrr{r�rrrrKszConvertingDict.pop)N)N)r|r}r~r�r2rrrrrrr@s
rrc@seZdZdd�Zddd�ZdS)rscCst�||�}|�||�Sr#)r[r�r{r�rrrr�QszConvertingList.__getitem__���cCst�||�}|�|�Sr#)r[rrp)rw�idxrxrrrrUszConvertingList.popN)r�)r|r}r~r�rrrrrrsOsrsc@seZdZdd�ZdS)rtcCst�||�}|j||dd�Sr�)�tupler�r{r�rrrr�[szConvertingTuple.__getitem__N)r|r}r~r�rrrrrtYsrtc@s�eZdZe�d�Ze�d�Ze�d�Ze�d�Ze�d�Z	ddd�Z
ee�Z
d	d
�Zdd�Zd
d�Zdd�Zdd�Zdd�Zdd�ZdS)�BaseConfiguratorz%^(?P<prefix>[a-z]+)://(?P<suffix>.*)$z^\s*(\w+)\s*z^\.\s*(\w+)\s*z^\[\s*(\w+)\s*\]\s*z^\d+$�ext_convert�cfg_convert)ZextZcfgcCst|�|_||j_dSr#)rr�configro)rwr�rrr�__init__ts
zBaseConfigurator.__init__c		Cs�|�d�}|�d�}z^|�|�}|D]H}|d|7}zt||�}Wq$tk
rj|�|�t||�}Yq$Xq$|WStk
r�t��dd�\}}td||f�}|||_	|_
|�YnXdS)NrrrZzCannot resolve %r: %s)rr�importerrr�ImportError�sys�exc_inforj�	__cause__�
__traceback__)	rwrkrrr Zfrag�e�tb�vrrr�resolvexs"



zBaseConfigurator.resolvecCs
|�|�Sr#)r��rwrxrrrr��szBaseConfigurator.ext_convertcCs�|}|j�|�}|dkr&td|��n�||��d�}|j|��d}|r�|j�|�}|rn||��d}nd|j�|�}|r�|��d}|j�|�s�||}n2zt	|�}||}Wnt
k
r�||}YnX|r�||��d�}qHtd||f��qH|S)NzUnable to convert %rrzUnable to convert %r at %r)�WORD_PATTERNrirj�endr��groups�DOT_PATTERN�
INDEX_PATTERN�
DIGIT_PATTERN�int�	TypeError)rwrx�restrl�dr�r!rrrr��s4
�zBaseConfigurator.cfg_convertcCs�t|t�s$t|t�r$t|�}||_n�t|t�sHt|t�rHt|�}||_n�t|t�svt|t�rvt|d�svt|�}||_nVt|t	�r�|j
�|�}|r�|��}|d}|j
�|d�}|r�|d}t||�}||�}|S)N�_fields�prefix�suffix)rrrrrorsr[rtr�rr%�CONVERT_PATTERNri�	groupdict�value_convertersr2r)rwrxrlr�r�Z	converterr�rrrrp�s0
��

zBaseConfigurator.convertcsj��d�}t|�s|�|�}��dd�}�fdd��D�}|f|�}|rf|��D]\}}t|||�qP|S)Nr:rcsi|]}t|�r|�|�qSr�rm��.0�k�r�rr�
<dictcomp>�sz5BaseConfigurator.configure_custom.<locals>.<dictcomp>)r�callabler��items�setattr)rwr�r4�propsr;rzrrxrr�r�configure_custom�s


z!BaseConfigurator.configure_customcCst|t�rt|�}|Sr#)rr[r�r�rrr�as_tuple�s
zBaseConfigurator.as_tupleN)r|r}r~�re�compiler�r�r�r�r�r��staticmethodrr�r�r�r�r�rpr�r�rrrrr�`s 




�"r�c@sZeZdZdd�Zdd�Zdd�Zdd�Zd	d
�Zdd�Zddd�Z	ddd�Z
ddd�ZdS)�DictConfiguratorcCs�|j}d|krtd��|ddkr2td|d��|�dd�}i}t���zn|�r�|�d|�}|D]�}|tjkr�td|��qdz6tj|}||}|�d	d�}|r�|�t�	|��Wqdt
k
r�}	ztd
|�|	�W5d}	~	XYqdXqd|�d|�}
|
D]N}z|�||
|d�Wq�t
k
�rF}	ztd
|�|	�W5d}	~	XYq�Xq�|�dd�}|�r�z|�|d�Wn.t
k
�r�}	ztd�|	�W5d}	~	XYnX�n|�dd�}t
�|�d|�}
|
D]P}z|�|
|�|
|<Wn2t
k
�r}	ztd|�|	�W5d}	~	XYnX�q�|�d|�}|D]P}z|�||�||<Wn2t
k
�rp}	ztd|�|	�W5d}	~	XYnX�q$|�d|�}g}t|�D]v}z |�||�}||_|||<WnNt
k
�r}	z.dt|	j�k�r�|�|�ntd
|�|	�W5d}	~	XYnX�q�|D]Z}z |�||�}||_|||<Wn2t
k
�r`}	ztd
|�|	�W5d}	~	XYnX�q
tj}t|jj���}|��g}|�d|�}
|
D]�}||k�r|�|�d}|d}t|�}t|�}||k�r||d|�|k�r�|�||�|d7}�q�|�|�z|�||
|�Wn2t
k
�rV}	ztd
|�|	�W5d}	~	XYnX�q�t|||�|�dd�}|�r�z|�|�Wn.t
k
�r�}	ztd�|	�W5d}	~	XYnXW5t��XdS)N�versionz$dictionary doesn't specify a versionrZzUnsupported version: %s�incrementalFrzNo handler found with name %rr<zUnable to configure handler %rrXTzUnable to configure logger %rrMzUnable to configure root loggerrrz Unable to configure formatter %r�filterszUnable to configure filter %r�target not configured yetr) r�rjrr
rrr2rfrA�_checkLevel�	Exception�configure_logger�configure_rootr
�configure_formatter�configure_filter�sorted�configure_handlerrr%r�rErMr[rNrOr(r_rar1r\rW)rwr�r�Z
EMPTY_DICTrr�handlerZhandler_configr<r�rXrMrTrr�ZdeferredrRrSrbrcrdrerrr�	configure�s
�
��������������



����zDictConfigurator.configurec

Cs�d|krr|d}z|�|�}Wq�tk
rn}z2dt|�kr>�|�d�|d<||d<|�|�}W5d}~XYq�Xnl|�dd�}|�dd�}|�dd�}|�dd�}|s�tj}	nt|�}	d	|kr�|	||||d	�}n|	|||�}|S)
Nr:z'format'r*rJr-r.r/r0Zvalidate)r�r�r%rr2r
r3r")
rwr��factoryrz�terJZdfmtr.�cnamer4rrrr��s*z$DictConfigurator.configure_formattercCs.d|kr|�|�}n|�dd�}t�|�}|S)Nr:rr8)r�r2r
ZFilter)rwr�rzrrrrr��s

z!DictConfigurator.configure_filtercCsX|D]N}z|�|jd|�Wqtk
rP}ztd|�|�W5d}~XYqXqdS)Nr�zUnable to add filter %r)Z	addFilterr�r�rj)rwZfiltererr�r6r�rrr�add_filters�s
zDictConfigurator.add_filtersc
s�t��}��dd�}|r\z|jd|}Wn0tk
rZ}ztd|�|�W5d}~XYnX��dd�}��dd�}d�kr���d�}t|�s�|�|�}|}�n��d�}	|�|	�}
t|
tj	j
��rFd�k�rFz>|jd	�d}t|tj��s��
|�td
��|�d<Wn6tk
�rB}ztd�d�|�W5d}~XYnXnZt|
tj	j��rtd�k�rt|��d��d<n,t|
tj	j��r�d
�k�r�|��d
��d
<|
}��dd�}�fdd��D�}
z|f|
�}WnLtk
�r}z,dt|�k�r�|
�d�|
d<|f|
�}W5d}~XYnX|�r.|�|�|dk	�rH|�t�|��|�rZ|�||�|�r�|��D]\}}t|||��qh|S)Nr7rzUnable to set formatter %rr<r�r:r0r=rr�zUnable to set target handler %rZmailhostZaddressrcsi|]}t|�r|�|�qSrr�r�r�rrr��sz6DictConfigurator.configure_handler.<locals>.<dictcomp>z'stream'�streamZstrm)rrr�r�rjr�r�rCr
rrDrZHandler�updater�ZSMTPHandlerr�Z
SysLogHandlerr%rBrAr�r�r�r�)rwr�Zconfig_copyr7r�r<r�r4r�r�rIZthr�r;rzr�rrxrr�rr��s~��



�
����

z"DictConfigurator.configure_handlercCsX|D]N}z|�|jd|�Wqtk
rP}ztd|�|�W5d}~XYqXqdS)NrzUnable to add handler %r)r^r�r�rj)rwrVrrKr�rrr�add_handlers�s
zDictConfigurator.add_handlersFcCs�|�dd�}|dk	r$|�t�|��|s~|jdd�D]}|�|�q6|�dd�}|rb|�||�|�dd�}|r~|�||�dS)Nr<rr�)r2rAr
r�rr]r�r�)rwrVr�r�r<rKrr�rrr�common_logger_configsz%DictConfigurator.common_logger_configcCs6t�|�}|�|||�|�dd�}|dk	r2||_dS)NrP)r
r`r�r2rP)rwrr�r�rVrPrrrr�s

z!DictConfigurator.configure_loggercCst��}|�|||�dSr#)r
r`r�)rwr�r�rMrrrr�szDictConfigurator.configure_rootN)F)F)F)r|r}r~r�r�r�r�r�r�r�r�r�rrrrr��s$	?

r�cCst|���dSr#)�dictConfigClassr�r�rrr�
dictConfig&sr�csDGdd�dt�}Gdd�dt�}G�fdd�dtj���||||�S)Nc@seZdZdd�ZdS)z#listen.<locals>.ConfigStreamHandlercSsD�z
|j}|�d�}t|�dk�r
t�d|�d}|j�|�}t|�|krb||�|t|��}q>|jjdk	rz|j�|�}|dk	r�|�d�}zddl}|�	|�}t
|�WnHtk
r�t�
|�}zt|�Wntk
r�t��YnXYnX|jj�r
|jj��Wn2tk
�r>}z|jtk�r.�W5d}~XYnXdS)N�z>Lrzutf-8)Z
connectionZrecvr1�structZunpack�server�verify�decode�json�loadsr�r��io�StringIOr�	traceback�	print_exc�ready�set�OSError�errno�RESET_ERROR)rwZconn�chunkZslenr�r��filer�rrr�handleFs6




z*listen.<locals>.ConfigStreamHandler.handleN)r|r}r~r�rrrr�ConfigStreamHandler?sr�c@s,eZdZdZdedddfdd�Zdd�ZdS)z$listen.<locals>.ConfigSocketReceiverrZZ	localhostNcSs>t�|||f|�t��d|_t��d|_||_||_dS)NrrZ)	rr�r
r�abortr�timeoutr�r�)rwZhost�portr�r�r�rrrr�tsz-listen.<locals>.ConfigSocketReceiver.__init__cSs`ddl}d}|sT|�|j��ggg|j�\}}}|r<|��t��|j}t��q|�	�dS)Nr)
�selectZsocket�filenor�Zhandle_requestr
rr�rZserver_close)rwr�r�ZrdZwrZexrrr�serve_until_stopped~s�

z8listen.<locals>.ConfigSocketReceiver.serve_until_stopped)r|r}r~Zallow_reuse_address�DEFAULT_LOGGING_CONFIG_PORTr�r�rrrr�ConfigSocketReceiverms�

r�cs&eZdZ��fdd�Zdd�Z�ZS)zlisten.<locals>.Servercs4t�|���||_||_||_||_t��|_dSr#)	�superr��rcvr�hdlrr�r��	threadingZEventr�)rwr�r�r�r�)�Server�	__class__rrr��szlisten.<locals>.Server.__init__cSsZ|j|j|j|j|jd�}|jdkr0|jd|_|j��t��|a	t�
�|��dS)N)r�r�r�r�rrZ)r�r�r�r�r�Zserver_addressr�r
r�	_listenerrr�)rwr�rrr�run�s�

zlisten.<locals>.Server.run)r|r}r~r�r��
__classcell__r�r�)r�rr��sr�)rrr�ZThread)r�r�r�r�rr�r�listen+s.r�cCs*t��ztrdt_daW5t��XdS)NrZ)r
rrr�r�rrrr�
stopListening�sr�)NT)*r�r�r
Zlogging.handlersr�r�r�r�r�Zsocketserverrrr�Z
ECONNRESETr�r�rr"r'r	rrWrr
r��Irhrm�objectrnrrrr[rsr�rtr�r�r�r�r�r�rrrr�<module>sF
"%W!
Az__pycache__/config.cpython-38.opt-1.pyc000064400000055214150327210150013613 0ustar00U

e5d��@sNdZddlZddlZddlZddlZddlZddlZddlZddlZddl	Z	ddl
mZmZdZ
ejZdad+dd�Zdd	�Zd
d�Zdd
�Zdd�Zdd�Zdd�Zdd�Ze�dej�Zdd�ZGdd�de�ZGdd�dee�Z Gdd�de!e�Z"Gdd �d e#e�Z$Gd!d"�d"e�Z%Gd#d$�d$e%�Z&e&Z'd%d&�Z(e
dfd'd(�Z)d)d*�Z*dS),a
Configuration functions for the logging package for Python. The core package
is based on PEP 282 and comments thereto in comp.lang.python, and influenced
by Apache's log4j system.

Copyright (C) 2001-2019 Vinay Sajip. All Rights Reserved.

To use, simply 'import logging' and log away!
�N)�ThreadingTCPServer�StreamRequestHandleriF#TcCs�ddl}t||j�r|}n*|�|�}t|d�r:|�|�n
|�|�t|�}t�	�z t�t||�}t
|||�W5t�
�XdS)aD
    Read the logging configuration from a ConfigParser-format file.

    This can be called several times from an application, allowing an end user
    the ability to select from various pre-canned configurations (if the
    developer provides a mechanism to present the choices and load the chosen
    configuration).
    rN�readline)�configparser�
isinstanceZRawConfigParserZConfigParser�hasattrZ	read_file�read�_create_formatters�logging�_acquireLock�_releaseLock�_clearExistingHandlers�_install_handlers�_install_loggers)Zfname�defaults�disable_existing_loggersr�cp�
formatters�handlers�r�&/usr/lib64/python3.8/logging/config.py�
fileConfig3s	



rc	Csl|�d�}|�d�}t|�}|D]F}|d|}zt||�}Wq tk
rdt|�t||�}Yq Xq |S)z)Resolve a dotted name to a global object.�.r)�split�pop�
__import__�getattr�AttributeError)�name�used�found�nrrr�_resolveUs

r"cCsttj|�S�N)�map�str�strip)Zalistrrr�
_strip_spacescsr'cCs�|dd}t|�siS|�d�}t|�}i}|D]v}d|}|j|dddd�}|j|d	ddd�}|j|d
ddd�}tj}||�d�}	|	r�t|	�}||||�}
|
||<q2|S)
zCreate and return formattersr�keys�,zformatter_%s�formatTN)�raw�fallback�datefmt�style�%�class)�lenrr'�getr
�	Formatterr")rZflistrZformZsectnameZfsZdfsZstl�c�
class_name�frrrr	fs$

r	c
Cs^|dd}t|�siS|�d�}t|�}i}g}|D�]}|d|}|d}|�dd�}zt|tt��}Wn ttfk
r�t	|�}YnX|�dd	�}	t|	tt��}	|�d
d�}
t|
tt��}
||	|
�}d|kr�|d}|�
|�t|�r�|�||�t|tj
j��r2|�d
d�}
t|
��r2|�||
f�|||<q6|D]\}}|�||��q@|S)zInstall and return handlersrr(r)z
handler_%sr0�	formatter��args�()�kwargsz{}�level�target)r1rr'r2�eval�varsr
r�	NameErrorr"�setLevel�setFormatter�
issubclassr�
MemoryHandler�appendZ	setTarget)rr�hlistrZfixups�hand�section�klass�fmtr9r;�hr<r=�trrrr|sB





rcCsTtj}|D]D}|jj|}||krHt|tj�sN|�tj�g|_d|_	q
||_
q
dS)a�
    When (re)configuring logging, handle loggers which were in the previous
    configuration but are not in the new configuration. There's no point
    deleting them as other threads may continue to hold references to them;
    and by disabling them, you stop them doing any logging.

    However, don't disable children of named loggers, as that's probably not
    what was intended by the user. Also, allow existing loggers to NOT be
    disabled if disable_existing is false.
    TN)r
�root�manager�
loggerDictrZPlaceHolderrAZNOTSETr�	propagate�disabled)�existing�
child_loggers�disable_existingrM�log�loggerrrr�_handle_existing_loggers�srWcCs|dd}|�d�}tt|��}|�d�|d}tj}|}d|krX|d}|�|�|jdd�D]}|�|�qf|d}	t	|	�r�|	�d�}	t|	�}	|	D]}
|�
||
�q�t|jj�
��}|��g}|D�](}|d	|}|d
}
|jddd
�}t�|
�}|
|k�rv|�|
�d}|
d}t	|�}t	|�}||k�rl||d|�|k�r`|�||�|d7}�q2|�|
�d|k�r�|d}|�|�|jdd�D]}|�|��q�||_d|_|d}	t	|	�r�|	�d�}	t|	�}	|	D]}
|�
||
��q�q�t|||�dS)zCreate and install loggers�loggersr(r)rMZlogger_rootr<Nrz	logger_%s�qualnamerP�)r,rr)r�listr'�remover
rMrAr�
removeHandlerr1�
addHandlerrNrOr(�sortZgetint�	getLogger�indexrErPrQrW)rrrTZllistrHrMrUr<rKrFrGrRrSZqnrPrV�i�prefixed�pflen�num_existingrrrr�sd











rcCs.tj��t�tjdd��tjdd�=dS)z!Clear and close existing handlersN)r
�	_handlers�clearZshutdownZ_handlerListrrrrr
s
r
z^[a-z_][a-z0-9_]*$cCst�|�}|std|��dS)Nz!Not a valid Python identifier: %rT)�
IDENTIFIER�match�
ValueError)�s�mrrr�valid_idents
rmc@s"eZdZdZddd�Zdd�ZdS)	�ConvertingMixinz?For ConvertingXXX's, this mixin class provides common functionsTcCsB|j�|�}||k	r>|r |||<t|�tttfkr>||_||_|Sr#)�configurator�convert�type�ConvertingDict�ConvertingList�ConvertingTuple�parent�key)�selfrv�value�replace�resultrrr�convert_with_key"s
�z ConvertingMixin.convert_with_keycCs0|j�|�}||k	r,t|�tttfkr,||_|Sr#)rorprqrrrsrtru)rwrxrzrrrrp.s
�zConvertingMixin.convertN)T)�__name__�
__module__�__qualname__�__doc__r{rprrrrrns
rnc@s,eZdZdZdd�Zd	dd�Zd
dd�ZdS)rrz A converting dictionary wrapper.cCst�||�}|�||�Sr#)�dict�__getitem__r{�rwrvrxrrrr�CszConvertingDict.__getitem__NcCst�|||�}|�||�Sr#)r�r2r{�rwrv�defaultrxrrrr2GszConvertingDict.getcCst�|||�}|j||dd�S�NF)ry)r�rr{r�rrrrKszConvertingDict.pop)N)N)r|r}r~rr�r2rrrrrrr@s
rrc@s"eZdZdZdd�Zddd�ZdS)	rszA converting list wrapper.cCst�||�}|�||�Sr#)r[r�r{r�rrrr�QszConvertingList.__getitem__���cCst�||�}|�|�Sr#)r[rrp)rw�idxrxrrrrUszConvertingList.popN)r�)r|r}r~rr�rrrrrrsOsrsc@seZdZdZdd�ZdS)rtzA converting tuple wrapper.cCst�||�}|j||dd�Sr�)�tupler�r{r�rrrr�[szConvertingTuple.__getitem__N)r|r}r~rr�rrrrrtYsrtc@s�eZdZdZe�d�Ze�d�Ze�d�Ze�d�Z	e�d�Z
ddd	�Zee
�Zd
d�Zdd
�Zdd�Zdd�Zdd�Zdd�Zdd�ZdS)�BaseConfiguratorzI
    The configurator base class which defines some useful defaults.
    z%^(?P<prefix>[a-z]+)://(?P<suffix>.*)$z^\s*(\w+)\s*z^\.\s*(\w+)\s*z^\[\s*(\w+)\s*\]\s*z^\d+$�ext_convert�cfg_convert)ZextZcfgcCst|�|_||j_dSr#)rr�configro)rwr�rrr�__init__ts
zBaseConfigurator.__init__c		Cs�|�d�}|�d�}z^|�|�}|D]H}|d|7}zt||�}Wq$tk
rj|�|�t||�}Yq$Xq$|WStk
r�t��dd�\}}td||f�}|||_	|_
|�YnXdS)z`
        Resolve strings to objects using standard import and attribute
        syntax.
        rrrZNzCannot resolve %r: %s)rr�importerrr�ImportError�sys�exc_inforj�	__cause__�
__traceback__)	rwrkrrr Zfrag�e�tb�vrrr�resolvexs"



zBaseConfigurator.resolvecCs
|�|�S)z*Default converter for the ext:// protocol.)r��rwrxrrrr��szBaseConfigurator.ext_convertcCs�|}|j�|�}|dkr&td|��n�||��d�}|j|��d}|r�|j�|�}|rn||��d}nd|j�|�}|r�|��d}|j�|�s�||}n2zt	|�}||}Wnt
k
r�||}YnX|r�||��d�}qHtd||f��qH|S)z*Default converter for the cfg:// protocol.NzUnable to convert %rrzUnable to convert %r at %r)�WORD_PATTERNrirj�endr��groups�DOT_PATTERN�
INDEX_PATTERN�
DIGIT_PATTERN�int�	TypeError)rwrx�restrl�dr�r!rrrr��s4
�zBaseConfigurator.cfg_convertcCs�t|t�s$t|t�r$t|�}||_n�t|t�sHt|t�rHt|�}||_n�t|t�svt|t�rvt|d�svt|�}||_nVt|t	�r�|j
�|�}|r�|��}|d}|j
�|d�}|r�|d}t||�}||�}|S)z�
        Convert values to an appropriate type. dicts, lists and tuples are
        replaced by their converting alternatives. Strings are checked to
        see if they have a conversion format and are converted if they do.
        �_fields�prefixN�suffix)rrrr�rorsr[rtr�rr%�CONVERT_PATTERNri�	groupdict�value_convertersr2r)rwrxrlr�r�Z	converterr�rrrrp�s0
��

zBaseConfigurator.convertcsj��d�}t|�s|�|�}��dd�}�fdd��D�}|f|�}|rf|��D]\}}t|||�qP|S)z1Configure an object with a user-supplied factory.r:rNcsi|]}t|�r|�|�qSr�rm��.0�k�r�rr�
<dictcomp>�sz5BaseConfigurator.configure_custom.<locals>.<dictcomp>)r�callabler��items�setattr)rwr�r4�propsr;rzrrxrr�r�configure_custom�s


z!BaseConfigurator.configure_customcCst|t�rt|�}|S)z0Utility function which converts lists to tuples.)rr[r�r�rrr�as_tuple�s
zBaseConfigurator.as_tupleN)r|r}r~r�re�compiler�r�r�r�r�r��staticmethodrr�r�r�r�r�rpr�r�rrrrr�`s"




�"r�c@s^eZdZdZdd�Zdd�Zdd�Zdd	�Zd
d�Zdd
�Z	ddd�Z
ddd�Zddd�ZdS)�DictConfiguratorz]
    Configure logging using a dictionary-like object to describe the
    configuration.
    cCs�|j}d|krtd��|ddkr2td|d��|�dd�}i}t���zn|�r�|�d|�}|D]�}|tjkr�td|��qdz6tj|}||}|�d	d
�}|r�|�t�	|��Wqdt
k
r�}	ztd|�|	�W5d
}	~	XYqdXqd|�d|�}
|
D]N}z|�||
|d
�Wq�t
k
�rF}	ztd|�|	�W5d
}	~	XYq�Xq�|�dd
�}|�r�z|�|d
�Wn.t
k
�r�}	ztd�|	�W5d
}	~	XYnX�n|�dd
�}t
�|�d|�}
|
D]P}z|�|
|�|
|<Wn2t
k
�r}	ztd|�|	�W5d
}	~	XYnX�q�|�d|�}|D]P}z|�||�||<Wn2t
k
�rp}	ztd|�|	�W5d
}	~	XYnX�q$|�d|�}g}t|�D]v}z |�||�}||_|||<WnNt
k
�r}	z.dt|	j�k�r�|�|�ntd|�|	�W5d
}	~	XYnX�q�|D]Z}z |�||�}||_|||<Wn2t
k
�r`}	ztd|�|	�W5d
}	~	XYnX�q
tj}t|jj���}|��g}|�d|�}
|
D]�}||k�r|�|�d}|d}t|�}t|�}||k�r||d
|�|k�r�|�||�|d7}�q�|�|�z|�||
|�Wn2t
k
�rV}	ztd|�|	�W5d
}	~	XYnX�q�t|||�|�dd
�}|�r�z|�|�Wn.t
k
�r�}	ztd�|	�W5d
}	~	XYnXW5t��Xd
S)zDo the configuration.�versionz$dictionary doesn't specify a versionrZzUnsupported version: %s�incrementalFrzNo handler found with name %rr<NzUnable to configure handler %rrXTzUnable to configure logger %rrMzUnable to configure root loggerrrz Unable to configure formatter %r�filterszUnable to configure filter %r�target not configured yetr) r�rjrr
rrr2rfrA�_checkLevel�	Exception�configure_logger�configure_rootr
�configure_formatter�configure_filter�sorted�configure_handlerrr%r�rErMr[rNrOr(r_rar1r\rW)rwr�r�Z
EMPTY_DICTrr�handlerZhandler_configr<r�rXrMrTrr�ZdeferredrRrSrbrcrdrerrr�	configure�s
�
��������������



����zDictConfigurator.configurec

Cs�d|krr|d}z|�|�}Wq�tk
rn}z2dt|�kr>�|�d�|d<||d<|�|�}W5d}~XYq�Xnl|�dd�}|�dd�}|�dd�}|�d	d�}|s�tj}	nt|�}	d
|kr�|	||||d
�}n|	|||�}|S)z(Configure a formatter from a dictionary.r:z'format'r*rJNr-r.r/r0Zvalidate)r�r�r%rr2r
r3r")
rwr��factoryrz�terJZdfmtr.�cnamer4rrrr��s*z$DictConfigurator.configure_formattercCs.d|kr|�|�}n|�dd�}t�|�}|S)z%Configure a filter from a dictionary.r:rr8)r�r2r
ZFilter)rwr�rzrrrrr��s

z!DictConfigurator.configure_filtercCsX|D]N}z|�|jd|�Wqtk
rP}ztd|�|�W5d}~XYqXqdS)z/Add filters to a filterer from a list of names.r�zUnable to add filter %rN)Z	addFilterr�r�rj)rwZfiltererr�r6r�rrr�add_filters�s
zDictConfigurator.add_filtersc
s�t��}��dd�}|r\z|jd|}Wn0tk
rZ}ztd|�|�W5d}~XYnX��dd�}��dd�}d�kr���d�}t|�s�|�|�}|}�n��d�}	|�|	�}
t|
tj	j
��rFd	�k�rFz>|jd
�d	}t|tj��s��
|�td��|�d	<Wn6tk
�rB}ztd�d	�|�W5d}~XYnXnZt|
tj	j��rtd
�k�rt|��d
��d
<n,t|
tj	j��r�d�k�r�|��d��d<|
}��dd�}�fdd��D�}
z|f|
�}WnLtk
�r}z,dt|�k�r�|
�d�|
d<|f|
�}W5d}~XYnX|�r.|�|�|dk	�rH|�t�|��|�rZ|�||�|�r�|��D]\}}t|||��qh|S)z&Configure a handler from a dictionary.r7NrzUnable to set formatter %rr<r�r:r0r=rr�zUnable to set target handler %rZmailhostZaddressrcsi|]}t|�r|�|�qSrr�r�r�rrr��sz6DictConfigurator.configure_handler.<locals>.<dictcomp>z'stream'�streamZstrm)r�rr�r�rjr�r�rCr
rrDrZHandler�updater�ZSMTPHandlerr�Z
SysLogHandlerr%rBrAr�r�r�r�)rwr�Zconfig_copyr7r�r<r�r4r�r�rIZthr�r;rzr�rrxrr�rr��s~��



�
����

z"DictConfigurator.configure_handlercCsX|D]N}z|�|jd|�Wqtk
rP}ztd|�|�W5d}~XYqXqdS)z.Add handlers to a logger from a list of names.rzUnable to add handler %rN)r^r�r�rj)rwrVrrKr�rrr�add_handlers�s
zDictConfigurator.add_handlersFcCs�|�dd�}|dk	r$|�t�|��|s~|jdd�D]}|�|�q6|�dd�}|rb|�||�|�dd�}|r~|�||�dS)zU
        Perform configuration which is common to root and non-root loggers.
        r<Nrr�)r2rAr
r�rr]r�r�)rwrVr�r�r<rKrr�rrr�common_logger_configsz%DictConfigurator.common_logger_configcCs6t�|�}|�|||�|�dd�}|dk	r2||_dS)z.Configure a non-root logger from a dictionary.rPN)r
r`r�r2rP)rwrr�r�rVrPrrrr�s

z!DictConfigurator.configure_loggercCst��}|�|||�dS)z*Configure a root logger from a dictionary.N)r
r`r�)rwr�r�rMrrrr�szDictConfigurator.configure_rootN)F)F)F)
r|r}r~rr�r�r�r�r�r�r�r�r�rrrrr��s$	?

r�cCst|���dS)z%Configure logging using a dictionary.N)�dictConfigClassr�r�rrr�
dictConfig&sr�csDGdd�dt�}Gdd�dt�}G�fdd�dtj���||||�S)au
    Start up a socket server on the specified port, and listen for new
    configurations.

    These will be sent as a file suitable for processing by fileConfig().
    Returns a Thread object on which you can call start() to start the server,
    and which you can join() when appropriate. To stop the server, call
    stopListening().

    Use the ``verify`` argument to verify any bytes received across the wire
    from a client. If specified, it should be a callable which receives a
    single argument - the bytes of configuration data received across the
    network - and it should return either ``None``, to indicate that the
    passed in bytes could not be verified and should be discarded, or a
    byte string which is then passed to the configuration machinery as
    normal. Note that you can return transformed bytes, e.g. by decrypting
    the bytes passed in.
    c@seZdZdZdd�ZdS)z#listen.<locals>.ConfigStreamHandlerz�
        Handler for a logging configuration request.

        It expects a completely new logging configuration and uses fileConfig
        to install it.
        cSsD�z
|j}|�d�}t|�dk�r
t�d|�d}|j�|�}t|�|krb||�|t|��}q>|jjdk	rz|j�|�}|dk	r�|�d�}zddl}|�	|�}t
|�WnHtk
r�t�
|�}zt|�Wntk
r�t��YnXYnX|jj�r
|jj��Wn2tk
�r>}z|jtk�r.�W5d}~XYnXdS)z�
            Handle a request.

            Each request is expected to be a 4-byte length, packed using
            struct.pack(">L", n), followed by the config file.
            Uses fileConfig() to do the grunt work.
            �z>LrNzutf-8)Z
connectionZrecvr1�structZunpack�server�verify�decode�json�loadsr�r��io�StringIOr�	traceback�	print_exc�ready�set�OSError�errno�RESET_ERROR)rwZconn�chunkZslenr�r��filer�rrr�handleFs6




z*listen.<locals>.ConfigStreamHandler.handleN)r|r}r~rr�rrrr�ConfigStreamHandler?sr�c@s0eZdZdZdZdedddfdd�Zdd�ZdS)	z$listen.<locals>.ConfigSocketReceiverzD
        A simple TCP socket-based logging config receiver.
        rZZ	localhostNcSs>t�|||f|�t��d|_t��d|_||_||_dS)NrrZ)	rr�r
r�abortr�timeoutr�r�)rwZhost�portr�r�r�rrrr�tsz-listen.<locals>.ConfigSocketReceiver.__init__cSs`ddl}d}|sT|�|j��ggg|j�\}}}|r<|��t��|j}t��q|�	�dS)Nr)
�selectZsocket�filenor�Zhandle_requestr
rr�rZserver_close)rwr�r�ZrdZwrZexrrr�serve_until_stopped~s�

z8listen.<locals>.ConfigSocketReceiver.serve_until_stopped)r|r}r~rZallow_reuse_address�DEFAULT_LOGGING_CONFIG_PORTr�r�rrrr�ConfigSocketReceiverms�

r�cs&eZdZ��fdd�Zdd�Z�ZS)zlisten.<locals>.Servercs4t�|���||_||_||_||_t��|_dSr#)	�superr��rcvr�hdlrr�r��	threadingZEventr�)rwr�r�r�r�)�Server�	__class__rrr��szlisten.<locals>.Server.__init__cSsZ|j|j|j|j|jd�}|jdkr0|jd|_|j��t��|a	t�
�|��dS)N)r�r�r�r�rrZ)r�r�r�r�r�Zserver_addressr�r
r�	_listenerrr�)rwr�rrr�run�s�

zlisten.<locals>.Server.run)r|r}r~r�r��
__classcell__r�r�)r�rr��sr�)rrr�ZThread)r�r�r�r�rr�r�listen+s.r�cCs*t��ztrdt_daW5t��XdS)zN
    Stop the listening server which was created with a call to listen().
    rZN)r
rrr�r�rrrr�
stopListening�sr�)NT)+rr�r�r
Zlogging.handlersr�r�r�r�r�Zsocketserverrrr�Z
ECONNRESETr�r�rr"r'r	rrWrr
r��Irhrm�objectrnr�rrr[rsr�rtr�r�r�r�r�r�rrrr�<module>sH

"%W!
Az__pycache__/__init__.cpython-38.opt-1.pyc000064400000177340150327210150014112 0ustar00U

e5d�0�*@s6dZddlZddlZddlZddlZddlZddlZddlZddlZddl	Z
ddlmZddlm
Zddddd	d
ddd
ddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.g*ZddlZd/Zd0Zd1Zd2Ze��Zd3Zd3Zd3Zd3Zd4ZeZd5Zd6ZeZd7Zd8Z dZ!eded	edede de!diZ"eeeeeee e!d9�Z#d:d!�Z$d;d�Z%e&ed<��rdd=d>�Z'nd?d@�Z'ej(�)e%j*j+�Z,dAdB�Z-e�.�Z/dCdD�Z0dEdF�Z1e&edG��s�dHdI�Z2n(e�3�Z4dJdI�Z2dKdL�Z5ej6e0e5e1dM�GdNd�de7�Z8e8a9dOd,�Z:dPd+�Z;dQd&�Z<e�Z=[GdRdS�dSe7�Z>GdTdU�dUe>�Z?GdVdW�dWe>�Z@dXZAe>eAfe?dYfe@dZfd[�ZBGd\d
�d
e7�Z
e
�ZCGd]d�de7�ZDGd^d�de7�ZEGd_d`�d`e7�ZFe�G�ZHgZIdadb�ZJdcdd�ZKGded�deF�ZLGdfd�deL�ZMGdgd�deM�ZNGdhdi�dieM�ZOeOe�ZPePZQGdjdk�dke7�ZRdld'�ZSdmd#�ZTGdndo�doe7�ZUGdpd�deF�ZVGdqdr�dreV�ZWeVaXGdsd�de7�ZYeWe�ZZeZeV_ZeUeVjZ�eV_[dtd�Z\d�dud"�Z]dvd�Z^e^Z_dwd�Z`d3dx�dyd�Zadzd*�Zbd{d)�Zcd|d$�Zdd}d�Zed~d%�Zfefdd�ZgeIfd�d(�ZhddliZiei�jeh�Gd�d�deL�Zkdald�d�d��Zmd�d�ZndS)�z�
Logging package for Python. Based on PEP 282 and comments thereto in
comp.lang.python.

Copyright (C) 2001-2017 Vinay Sajip. All Rights Reserved.

To use, simply 'import logging' and log away!
�N)�Template)�	Formatter�BASIC_FORMAT�BufferingFormatter�CRITICAL�DEBUG�ERROR�FATAL�FileHandler�Filterr�Handler�INFO�	LogRecord�Logger�
LoggerAdapter�NOTSET�NullHandler�
StreamHandler�WARN�WARNING�addLevelName�basicConfig�captureWarnings�critical�debug�disable�error�	exception�fatal�getLevelName�	getLogger�getLoggerClass�info�log�
makeLogRecord�setLoggerClass�shutdown�warn�warning�getLogRecordFactory�setLogRecordFactory�
lastResort�raiseExceptionsz&Vinay Sajip <vinay_sajip@red-dove.com>Z
productionz0.5.1.2z07 February 2010T�2�(���
)rr	rrrr
rrcCs4t�|�}|dk	r|St�|�}|dk	r,|Sd|S)a�
    Return the textual or numeric representation of logging level 'level'.

    If the level is one of the predefined levels (CRITICAL, ERROR, WARNING,
    INFO, DEBUG) then you get the corresponding string. If you have
    associated levels with names using addLevelName then the name you have
    associated with 'level' is returned.

    If a numeric value corresponding to one of the defined levels is passed
    in, the corresponding string representation is returned.

    If a string representation of the level is passed in, the corresponding
    numeric value is returned.

    If no matching numeric or string value is passed in, the string
    'Level %s' % level is returned.
    NzLevel %s)�_levelToName�get�_nameToLevel)�level�result�r7�(/usr/lib64/python3.8/logging/__init__.pyrws

cCs(t�z|t|<|t|<W5t�XdS)zy
    Associate 'levelName' with 'level'.

    This is used when converting levels to text during message formatting.
    N)�_acquireLock�_releaseLockr2r4)r5Z	levelNamer7r7r8r�s
�	_getframecCs
t�d�S)N�)�sysr;r7r7r7r8�<lambda>��r>cCs2zt�Wn$tk
r,t��djjYSXdS)z5Return the frame object for the caller's stack frame.�N)�	Exceptionr=�exc_info�tb_frame�f_backr7r7r7r8�currentframe�srEcCsJt|t�r|}n6t|�|kr:|tkr0td|��t|}ntd|��|S)NzUnknown level: %rz*Level not an integer or a valid string: %r)�
isinstance�int�strr4�
ValueError�	TypeError)r5�rvr7r7r8�_checkLevel�s

rLcCstrt��dS)z�
    Acquire the module-level lock for serializing access to shared data.

    This should be released with _releaseLock().
    N)�_lock�acquirer7r7r7r8r9�sr9cCstrt��dS)zK
    Release the module-level lock acquired by calling _acquireLock().
    N)rM�releaser7r7r7r8r:�sr:�register_at_forkcCsdS�Nr7��instancer7r7r8�_register_at_fork_reinit_lock�srTcCs"t�zt�|�W5t�XdSrQ)r9r:�_at_fork_reinit_lock_weakset�addrRr7r7r8rT�scCsXtD]H}z|��Wqtk
rJ}ztdtd|tjd�W5d}~XYqXqt�dS)Nz&Ignoring exception from logging atforkz._reinit_lock() method:��file)rU�
createLockrA�printrSr=�stderrr:)�handler�errr7r7r8�!_after_at_fork_child_reinit_locks�s�r^)ZbeforeZafter_in_childZafter_in_parentc@s*eZdZdZd	dd�Zdd�Zdd�ZdS)
ra
    A LogRecord instance represents an event being logged.

    LogRecord instances are created every time something is logged. They
    contain all the information pertinent to the event being logged. The
    main information passed in is in msg and args, which are combined
    using str(msg) % args to create the message field of the record. The
    record also includes information such as when the record was created,
    the source line where the logging call was made, and any exception
    information to be logged.
    Nc


Ks�t��}||_||_|rFt|�dkrFt|dtjj�rF|drF|d}||_t	|�|_
||_||_z&t
j�|�|_t
j�|j�d|_Wn&tttfk
r�||_d|_YnX||_d|_|	|_||_||_||_|t|�d|_|jtd|_t �rt!�"�|_#t!�$�j|_%nd|_#d|_%t&�s.d|_'nDd|_'t(j)�*d�}|dk	�rrz|�+�j|_'Wnt,k
�rpYnXt-�r�t.t
d��r�t
�/�|_0nd|_0dS)	zK
        Initialize a logging record with interesting information.
        �rzUnknown moduleNi�ZMainProcessZmultiprocessing�getpid)1�time�name�msg�lenrF�collections�abc�Mapping�argsrZ	levelname�levelno�pathname�os�path�basename�filename�splitext�modulerJrI�AttributeErrorrB�exc_text�
stack_info�linenoZfuncName�createdrG�msecs�
_startTimeZrelativeCreated�
logThreads�	threading�	get_ident�threadZcurrent_threadZ
threadName�logMultiprocessingZprocessNamer=�modulesr3Zcurrent_processrA�logProcesses�hasattrr`�process)
�selfrbr5rjrtrcrhrB�func�sinfo�kwargs�ctZmpr7r7r8�__init__ sT"�


zLogRecord.__init__cCsd|j|j|j|j|jfS)Nz!<LogRecord: %s, %s, %s, %s, "%s">)rbrirjrtrc�r�r7r7r8�__repr__hs

�zLogRecord.__repr__cCst|j�}|jr||j}|S)z�
        Return the message for this LogRecord.

        Return the message for this LogRecord after merging any user-supplied
        arguments with the message.
        )rHrcrh)r�rcr7r7r8�
getMessagels

zLogRecord.getMessage)NN)�__name__�
__module__�__qualname__�__doc__r�r�r�r7r7r7r8rs�
HcCs|adS)z�
    Set the factory to be used when instantiating a log record.

    :param factory: A callable which will be called to instantiate
    a log record.
    N��_logRecordFactory)�factoryr7r7r8r*}scCstS)zH
    Return the factory to be used when instantiating a log record.
    r�r7r7r7r8r)�sc	Cs&tdddddddd�}|j�|�|S)z�
    Make a LogRecord whose attributes are defined by the specified dictionary,
    This function is useful for converting a logging event received over
    a socket connection (which is sent as a dictionary) into a LogRecord
    instance.
    N�rr7)r��__dict__�update)�dictrKr7r7r8r$�sc@sNeZdZdZdZdZe�dej�Z	dd�Z
dd�Zd	d
�Zdd�Z
d
d�ZdS)�PercentStylez%(message)sz%(asctime)sz
%(asctime)z5%\(\w+\)[#0+ -]*(\*|\d+)?(\.(\*|\d+))?[diouxefgcrsa%]cCs|p|j|_dSrQ)�default_format�_fmt�r��fmtr7r7r8r��szPercentStyle.__init__cCs|j�|j�dkS)Nr)r��find�asctime_searchr�r7r7r8�usesTime�szPercentStyle.usesTimecCs*|j�|j�s&td|j|jdf��dS)z>Validate the input format, ensure it matches the correct stylez"Invalid format '%s' for '%s' stylerN)�validation_pattern�searchr�rIr�r�r7r7r8�validate�szPercentStyle.validatecCs|j|jSrQ)r�r��r��recordr7r7r8�_format�szPercentStyle._formatc
Cs@z|�|�WStk
r:}ztd|��W5d}~XYnXdS)Nz(Formatting field not found in record: %s)r��KeyErrorrI)r�r��er7r7r8�format�szPercentStyle.formatN)r�r�r�r��asctime_formatr��re�compile�Ir�r�r�r�r�r�r7r7r7r8r��sr�c@s@eZdZdZdZdZe�dej�Z	e�d�Z
dd�Zdd	�Zd
S)�StrFormatStylez	{message}z	{asctime}z{asctimezF^(.?[<>=^])?[+ -]?#?0?(\d+|{\w+})?[,_]?(\.(\d+|{\w+}))?[bcdefgnosx%]?$z^(\d+|\w+)(\.\w+|\[[^]]+\])*$cCs|jjf|j�SrQ)r�r�r�r�r7r7r8r��szStrFormatStyle._formatc
Cs�t�}zxt�|j�D]f\}}}}|rF|j�|�s<td|��|�|�|r^|dkr^td|��|r|j�|�std|��qWn.tk
r�}ztd|��W5d}~XYnX|s�td��dS)zKValidate the input format, ensure it is the correct string formatting stylez!invalid field name/expression: %rZrsazinvalid conversion: %rzbad specifier: %rzinvalid format: %sN�invalid format: no fields)	�set�_str_formatter�parser��
field_spec�matchrIrV�fmt_spec)r��fields�_Z	fieldname�specZ
conversionr�r7r7r8r��s
zStrFormatStyle.validateN)
r�r�r�r�r�r�r�r�r�r�r�r�r�r7r7r7r8r��s
r�c@s8eZdZdZdZdZdd�Zdd�Zdd�Zd	d
�Z	dS)�StringTemplateStylez
${message}z
${asctime}cCs|p|j|_t|j�|_dSrQ)r�r�r�_tplr�r7r7r8r��szStringTemplateStyle.__init__cCs$|j}|�d�dkp"|�|j�dkS)Nz$asctimer)r�r�r�r�r7r7r8r��szStringTemplateStyle.usesTimecCs|tj}t�}|�|j�D]R}|��}|dr<|�|d�q|drT|�|d�q|�d�dkrtd��q|sxtd��dS)NZnamedZbracedr�$z$invalid format: bare '$' not allowedr�)	r�patternr��finditerr��	groupdictrV�grouprI)r�r�r��m�dr7r7r8r��s
zStringTemplateStyle.validatecCs|jjf|j�SrQ)r�Z
substituter�r�r7r7r8r��szStringTemplateStyle._formatN)
r�r�r�r�r�r�r�r�r�r�r7r7r7r8r��sr�z"%(levelname)s:%(name)s:%(message)sz{levelname}:{name}:{message}z${levelname}:${name}:${message})�%�{r�c@sZeZdZdZejZddd�ZdZdZ	dd	d
�Z
dd�Zd
d�Zdd�Z
dd�Zdd�ZdS)ra�
    Formatter instances are used to convert a LogRecord to text.

    Formatters need to know how a LogRecord is constructed. They are
    responsible for converting a LogRecord to (usually) a string which can
    be interpreted by either a human or an external system. The base Formatter
    allows a formatting string to be specified. If none is supplied, the
    style-dependent default value, "%(message)s", "{message}", or
    "${message}", is used.

    The Formatter can be initialized with a format string which makes use of
    knowledge of the LogRecord attributes - e.g. the default value mentioned
    above makes use of the fact that the user's message and arguments are pre-
    formatted into a LogRecord's message attribute. Currently, the useful
    attributes in a LogRecord are described by:

    %(name)s            Name of the logger (logging channel)
    %(levelno)s         Numeric logging level for the message (DEBUG, INFO,
                        WARNING, ERROR, CRITICAL)
    %(levelname)s       Text logging level for the message ("DEBUG", "INFO",
                        "WARNING", "ERROR", "CRITICAL")
    %(pathname)s        Full pathname of the source file where the logging
                        call was issued (if available)
    %(filename)s        Filename portion of pathname
    %(module)s          Module (name portion of filename)
    %(lineno)d          Source line number where the logging call was issued
                        (if available)
    %(funcName)s        Function name
    %(created)f         Time when the LogRecord was created (time.time()
                        return value)
    %(asctime)s         Textual time when the LogRecord was created
    %(msecs)d           Millisecond portion of the creation time
    %(relativeCreated)d Time in milliseconds when the LogRecord was created,
                        relative to the time the logging module was loaded
                        (typically at application startup time)
    %(thread)d          Thread ID (if available)
    %(threadName)s      Thread name (if available)
    %(process)d         Process ID (if available)
    %(message)s         The result of record.getMessage(), computed just as
                        the record is emitted
    Nr�TcCsR|tkrtdd�t�����t|d|�|_|r>|j��|jj|_||_dS)a�
        Initialize the formatter with specified format strings.

        Initialize the formatter either with the specified format string, or a
        default as described above. Allow for specialized date formatting with
        the optional datefmt argument. If datefmt is omitted, you get an
        ISO8601-like (or RFC 3339-like) format.

        Use a style parameter of '%', '{' or '$' to specify that you want to
        use one of %-formatting, :meth:`str.format` (``{}``) formatting or
        :class:`string.Template` formatting in your format string.

        .. versionchanged:: 3.2
           Added the ``style`` parameter.
        �Style must be one of: %s�,rN)�_STYLESrI�join�keys�_styler�r��datefmt)r�r�r��styler�r7r7r8r�/s�

zFormatter.__init__z%Y-%m-%d %H:%M:%Sz%s,%03dcCs@|�|j�}|rt�||�}nt�|j|�}|j||jf}|S)a%
        Return the creation time of the specified LogRecord as formatted text.

        This method should be called from format() by a formatter which
        wants to make use of a formatted time. This method can be overridden
        in formatters to provide for any specific requirement, but the
        basic behaviour is as follows: if datefmt (a string) is specified,
        it is used with time.strftime() to format the creation time of the
        record. Otherwise, an ISO8601-like (or RFC 3339-like) format is used.
        The resulting string is returned. This function uses a user-configurable
        function to convert the creation time to a tuple. By default,
        time.localtime() is used; to change this for a particular formatter
        instance, set the 'converter' attribute to a function with the same
        signature as time.localtime() or time.gmtime(). To change it for all
        formatters, for example if you want all logging times to be shown in GMT,
        set the 'converter' attribute in the Formatter class.
        )�	converterrura�strftime�default_time_format�default_msec_formatrv)r�r�r�r��s�tr7r7r8�
formatTimeLszFormatter.formatTimecCsZt��}|d}t�|d|d|d|�|��}|��|dd�dkrV|dd�}|S)z�
        Format and return the specified exception information as a string.

        This default implementation just uses
        traceback.print_exception()
        r@rr_N����
)�io�StringIO�	traceback�print_exception�getvalue�close)r�Zei�sio�tbr�r7r7r8�formatExceptionfszFormatter.formatExceptioncCs
|j��S)zK
        Check if the format uses the creation time of the record.
        )r�r�r�r7r7r8r�yszFormatter.usesTimecCs|j�|�SrQ)r�r�r�r7r7r8�
formatMessageszFormatter.formatMessagecCs|S)aU
        This method is provided as an extension point for specialized
        formatting of stack information.

        The input data is a string as returned from a call to
        :func:`traceback.print_stack`, but with the last trailing newline
        removed.

        The base implementation just returns the value passed in.
        r7)r�rsr7r7r8�formatStack�szFormatter.formatStackcCs�|��|_|��r"|�||j�|_|�|�}|jrF|jsF|�	|j�|_|jrn|dd�dkrd|d}||j}|j
r�|dd�dkr�|d}||�|j
�}|S)az
        Format the specified record as text.

        The record's attribute dictionary is used as the operand to a
        string formatting operation which yields the returned string.
        Before formatting the dictionary, a couple of preparatory steps
        are carried out. The message attribute of the record is computed
        using LogRecord.getMessage(). If the formatting string uses the
        time (as determined by a call to usesTime(), formatTime() is
        called to format the event time. If there is exception information,
        it is formatted using formatException() and appended to the message.
        r�Nr�)r��messager�r�r��asctimer�rBrrr�rsr�)r�r�r�r7r7r8r��s 


zFormatter.format)NNr�T)N)r�r�r�r�ra�	localtimer�r�r�r�r�r�r�r�r�r�r7r7r7r8rs*


c@s2eZdZdZddd�Zdd�Zdd�Zd	d
�ZdS)rzB
    A formatter suitable for formatting a number of records.
    NcCs|r||_nt|_dS)zm
        Optionally specify a formatter which will be used to format each
        individual record.
        N)�linefmt�_defaultFormatter)r�r�r7r7r8r��szBufferingFormatter.__init__cCsdS)zE
        Return the header string for the specified records.
        r�r7�r��recordsr7r7r8�formatHeader�szBufferingFormatter.formatHeadercCsdS)zE
        Return the footer string for the specified records.
        r�r7r�r7r7r8�formatFooter�szBufferingFormatter.formatFootercCsJd}t|�dkrF||�|�}|D]}||j�|�}q"||�|�}|S)zQ
        Format the specified records and return the result as a string.
        r�r)rdr�r�r�r�)r�r�rKr�r7r7r8r��szBufferingFormatter.format)N)r�r�r�r�r�r�r�r�r7r7r7r8r�s


c@s"eZdZdZddd�Zdd�ZdS)	ra�
    Filter instances are used to perform arbitrary filtering of LogRecords.

    Loggers and Handlers can optionally use Filter instances to filter
    records as desired. The base filter class only allows events which are
    below a certain point in the logger hierarchy. For example, a filter
    initialized with "A.B" will allow events logged by loggers "A.B",
    "A.B.C", "A.B.C.D", "A.B.D" etc. but not "A.BB", "B.A.B" etc. If
    initialized with the empty string, all events are passed.
    r�cCs||_t|�|_dS)z�
        Initialize a filter.

        Initialize with the name of the logger which, together with its
        children, will have its events allowed through the filter. If no
        name is specified, allow every event.
        N)rbrd�nlen�r�rbr7r7r8r��szFilter.__init__cCsJ|jdkrdS|j|jkrdS|j�|jd|j�dkr:dS|j|jdkS)z�
        Determine if the specified record is to be logged.

        Returns True if the record should be logged, or False otherwise.
        If deemed appropriate, the record may be modified in-place.
        rTF�.)r�rbr�r�r7r7r8�filter�s
z
Filter.filterN)r�)r�r�r�r�r�r�r7r7r7r8r�s

c@s0eZdZdZdd�Zdd�Zdd�Zdd	�Zd
S)�Filtererz[
    A base class for loggers and handlers which allows them to share
    common code.
    cCs
g|_dS)zE
        Initialize the list of filters to be an empty list.
        N)�filtersr�r7r7r8r�szFilterer.__init__cCs||jkr|j�|�dS)z;
        Add the specified filter to this handler.
        N)r��append�r�r�r7r7r8�	addFilters
zFilterer.addFiltercCs||jkr|j�|�dS)z@
        Remove the specified filter from this handler.
        N)r��remover�r7r7r8�removeFilters
zFilterer.removeFiltercCs>d}|jD].}t|d�r$|�|�}n||�}|s
d}q:q
|S)ah
        Determine if a record is loggable by consulting all the filters.

        The default is to allow the record to be logged; any filter can veto
        this and the record is then dropped. Returns a zero value if a record
        is to be dropped, else non-zero.

        .. versionchanged:: 3.2

           Allow filters to be just callables.
        Tr�F)r�rr�)r�r�rK�fr6r7r7r8r�s

zFilterer.filterN)r�r�r�r�r�r�r�r�r7r7r7r8r�s
r�cCsFttt}}}|rB|rB|rB|�z||kr6|�|�W5|�XdS)zD
    Remove a handler reference from the internal cleanup list.
    N)r9r:�_handlerListr�)�wrrNrO�handlersr7r7r8�_removeHandlerRef:sr�cCs*t�zt�t�|t��W5t�XdS)zL
    Add a handler to the internal cleanup list using a weak reference.
    N)r9r:r�r��weakref�refr�)r\r7r7r8�_addHandlerRefKsr�c@s�eZdZdZefdd�Zdd�Zdd�Zeee�Z	dd	�Z
d
d�Zdd
�Zdd�Z
dd�Zdd�Zdd�Zdd�Zdd�Zdd�Zdd�Zdd�Zd S)!raq
    Handler instances dispatch logging events to specific destinations.

    The base handler class. Acts as a placeholder which defines the Handler
    interface. Handlers can optionally use Formatter instances to format
    records as desired. By default, no formatter is specified; in this case,
    the 'raw' message as determined by record.message is logged.
    cCs4t�|�d|_t|�|_d|_t|�|��dS)zz
        Initializes the instance - basically setting the formatter to None
        and the filter list to empty.
        N)r�r��_namerLr5�	formatterr�rY�r�r5r7r7r8r�^s

zHandler.__init__cCs|jSrQ)r�r�r7r7r8�get_namekszHandler.get_namecCs<t�z(|jtkrt|j=||_|r,|t|<W5t�XdSrQ�r9r:r��	_handlersr�r7r7r8�set_namens
zHandler.set_namecCst��|_t|�dS)zU
        Acquire a thread lock for serializing access to the underlying I/O.
        N)ry�RLock�lockrTr�r7r7r8rY{s
zHandler.createLockcCs|jr|j��dS)z.
        Acquire the I/O thread lock.
        N)rrNr�r7r7r8rN�szHandler.acquirecCs|jr|j��dS)z.
        Release the I/O thread lock.
        N)rrOr�r7r7r8rO�szHandler.releasecCst|�|_dS)zX
        Set the logging level of this handler.  level must be an int or a str.
        N)rLr5r�r7r7r8�setLevel�szHandler.setLevelcCs|jr|j}nt}|�|�S)z�
        Format the specified record.

        If a formatter is set, use it. Otherwise, use the default formatter
        for the module.
        )r�r�r�)r�r�r�r7r7r8r��szHandler.formatcCstd��dS)z�
        Do whatever it takes to actually log the specified logging record.

        This version is intended to be implemented by subclasses and so
        raises a NotImplementedError.
        z.emit must be implemented by Handler subclassesN)�NotImplementedErrorr�r7r7r8�emit�szHandler.emitcCs4|�|�}|r0|��z|�|�W5|��X|S)a<
        Conditionally emit the specified logging record.

        Emission depends on filters which may have been added to the handler.
        Wrap the actual emission of the record with acquisition/release of
        the I/O thread lock. Returns whether the filter passed the record for
        emission.
        )r�rNrOr)r�r�rKr7r7r8�handle�s	

zHandler.handlecCs
||_dS)z5
        Set the formatter for this handler.
        N)r�r�r7r7r8�setFormatter�szHandler.setFormattercCsdS)z�
        Ensure all logging output has been flushed.

        This version does nothing and is intended to be implemented by
        subclasses.
        Nr7r�r7r7r8�flush�sz
Handler.flushcCs0t�z|jr |jtkr t|j=W5t�XdS)a%
        Tidy up any resources used by the handler.

        This version removes the handler from an internal map of handlers,
        _handlers, which is used for handler lookup by name. Subclasses
        should ensure that this gets called from overridden close()
        methods.
        Nr�r�r7r7r8r��s

z
Handler.closecCs t�rtj�rt��\}}}z�z�tj�d�t�|||dtj�tj�d�|j}|rvtj	�
|jj�t
dkrv|j}qR|r�tj|tjd�ntj�d|j|jf�ztj�d|j|jf�Wn4tk
r��Yn tk
r�tj�d�YnXWntk
�rYnXW5~~~XdS)	aD
        Handle errors which occur during an emit() call.

        This method should be called from handlers when an exception is
        encountered during an emit() call. If raiseExceptions is false,
        exceptions get silently ignored. This is what is mostly wanted
        for a logging system - most users will not care about errors in
        the logging system, they are more interested in application errors.
        You could, however, replace this with a custom handler if you wish.
        The record which was being processed is passed in to this method.
        z--- Logging error ---
NzCall stack:
rrWzLogged from file %s, line %s
zMessage: %r
Arguments: %s
zwUnable to print the message and arguments - possible formatting error.
Use the traceback above to help find the error.
)r,r=r[rB�writer�r�rCrkrl�dirname�f_code�co_filename�__path__rD�print_stackrnrtrcrh�RecursionErrorrA�OSError)r�r�r��vr��framer7r7r8�handleError�s<����

zHandler.handleErrorcCst|j�}d|jj|fS)Nz	<%s (%s)>)rr5�	__class__r�r�r7r7r8r�s
zHandler.__repr__N)r�r�r�r�rr�r�r��propertyrbrYrNrOrr�rrrrr�rr�r7r7r7r8rUs"



	/c@s>eZdZdZdZddd�Zdd�Zdd	�Zd
d�Zdd
�Z	dS)rz�
    A handler class which writes logging records, appropriately formatted,
    to a stream. Note that this class does not close the stream, as
    sys.stdout or sys.stderr may be used.
    r�NcCs"t�|�|dkrtj}||_dS)zb
        Initialize the handler.

        If stream is not specified, sys.stderr is used.
        N)rr�r=r[�stream�r�rr7r7r8r�s
zStreamHandler.__init__cCs8|��z |jr&t|jd�r&|j��W5|��XdS)z%
        Flushes the stream.
        rN)rNrOrrrr�r7r7r8r&s
zStreamHandler.flushcCsdz,|�|�}|j}|�||j�|��Wn2tk
rB�Yntk
r^|�|�YnXdS)a�
        Emit a record.

        If a formatter is specified, it is used to format the record.
        The record is then written to the stream with a trailing newline.  If
        exception information is present, it is formatted using
        traceback.print_exception and appended to the stream.  If the stream
        has an 'encoding' attribute, it is used to determine how to do the
        output to the stream.
        N)r�rr�
terminatorrr
rAr)r�r�rcrr7r7r8r1s
zStreamHandler.emitcCs@||jkrd}n,|j}|��z|��||_W5|��X|S)z�
        Sets the StreamHandler's stream to the specified value,
        if it is different.

        Returns the old stream, if the stream was changed, or None
        if it wasn't.
        N)rrNrOr)r�rr6r7r7r8�	setStreamGs


zStreamHandler.setStreamcCs>t|j�}t|jdd�}t|�}|r,|d7}d|jj||fS)Nrbr�� z<%s %s(%s)>)rr5�getattrrrHrr�)r�r5rbr7r7r8r�[s
zStreamHandler.__repr__)N)
r�r�r�r�rr�rrrr�r7r7r7r8rs
c@s:eZdZdZddd�Zdd�Zd	d
�Zdd�Zd
d�ZdS)r
zO
    A handler class which writes formatted logging records to disk files.
    �aNFcCsTt�|�}tj�|�|_||_||_||_|r@t�	|�d|_
nt�	||���dS)zO
        Open the specified file and use it as the stream for logging.
        N)
rk�fspathrl�abspath�baseFilename�mode�encoding�delayrr�rr�_open)r�rnrrr r7r7r8r�is

zFileHandler.__init__c	Csb|��zJz8|jr@z|��W5|j}d|_t|d�r>|��XW5t�|�XW5|��XdS)z$
        Closes the stream.
        Nr�)rNrOrr�rrrrr7r7r8r�}s
zFileHandler.closecCst|j|j|jd�S)zx
        Open the current base file with the (original) mode and encoding.
        Return the resulting stream.
        )r)�openrrrr�r7r7r8r!�szFileHandler._opencCs$|jdkr|��|_t�||�dS)z�
        Emit a record.

        If the stream was not opened because 'delay' was specified in the
        constructor, open it before calling the superclass's emit.
        N)rr!rrr�r7r7r8r�s

zFileHandler.emitcCst|j�}d|jj|j|fS�Nz<%s %s (%s)>)rr5rr�rr�r7r7r8r��s
zFileHandler.__repr__)rNF)	r�r�r�r�r�r�r!rr�r7r7r7r8r
es
c@s(eZdZdZefdd�Zedd��ZdS)�_StderrHandlerz�
    This class is like a StreamHandler using sys.stderr, but always uses
    whatever sys.stderr is currently set to rather than the value of
    sys.stderr at handler construction time.
    cCst�||�dS)z)
        Initialize the handler.
        N)rr�r�r7r7r8r��sz_StderrHandler.__init__cCstjSrQ)r=r[r�r7r7r8r�sz_StderrHandler.streamN)r�r�r�r�rr�rrr7r7r7r8r$�sr$c@s eZdZdZdd�Zdd�ZdS)�PlaceHolderz�
    PlaceHolder instances are used in the Manager logger hierarchy to take
    the place of nodes for which no loggers have been defined. This class is
    intended for internal use only and not as part of the public API.
    cCs|di|_dS)zY
        Initialize with the specified logger being a child of this placeholder.
        N��	loggerMap�r��aloggerr7r7r8r��szPlaceHolder.__init__cCs||jkrd|j|<dS)zJ
        Add the specified logger as a child of this placeholder.
        Nr&r(r7r7r8r��s
zPlaceHolder.appendN)r�r�r�r�r�r�r7r7r7r8r%�sr%cCs(|tkr t|t�s td|j��|adS)z�
    Set the class to be used when instantiating a logger. The class should
    define __init__() such that only a name argument is required, and the
    __init__() should call Logger.__init__()
    �(logger not derived from logging.Logger: N)r�
issubclassrJr��_loggerClass)�klassr7r7r8r%�s
�cCstS)zB
    Return the class to be used when instantiating a logger.
    )r,r7r7r7r8r!�sc@sbeZdZdZdd�Zedd��Zejdd��Zdd�Zd	d
�Z	dd�Z
d
d�Zdd�Zdd�Z
dS)�Managerzt
    There is [under normal circumstances] just one Manager instance, which
    holds the hierarchy of loggers.
    cCs(||_d|_d|_i|_d|_d|_dS)zT
        Initialize the manager with the root node of the logger hierarchy.
        rFN)�rootr�emittedNoHandlerWarning�
loggerDict�loggerClass�logRecordFactory)r�Zrootnoder7r7r8r��szManager.__init__cCs|jSrQ)�_disabler�r7r7r8r�szManager.disablecCst|�|_dSrQ)rLr4�r��valuer7r7r8rscCs�d}t|t�std��t�z�||jkrv|j|}t|t�r�|}|jpHt|�}||_	||j|<|�
||�|�|�n(|jp~t|�}||_	||j|<|�|�W5t�X|S)a�
        Get a logger with the specified name (channel name), creating it
        if it doesn't yet exist. This name is a dot-separated hierarchical
        name, such as "a", "a.b", "a.b.c" or similar.

        If a PlaceHolder existed for the specified name [i.e. the logger
        didn't exist but a child of it did], replace it with the created
        logger and fix up the parent/child references which pointed to the
        placeholder to now point to the logger.
        NzA logger name must be a string)rFrHrJr9r:r1r%r2r,�manager�_fixupChildren�
_fixupParents)r�rbrK�phr7r7r8r s(





zManager.getLoggercCs*|tkr t|t�s td|j��||_dS)zY
        Set the class to be used when instantiating a logger with this Manager.
        r*N)rr+rJr�r2)r�r-r7r7r8r%&s
�zManager.setLoggerClasscCs
||_dS)zg
        Set the factory to be used when instantiating a log record with this
        Manager.
        N)r3)r�r�r7r7r8r*0szManager.setLogRecordFactorycCs�|j}|�d�}d}|dkr~|s~|d|�}||jkrFt|�|j|<n$|j|}t|t�r`|}n
|�|�|�dd|d�}q|s�|j}||_dS)z�
        Ensure that there are either loggers or placeholders all the way
        from the specified logger to the root of the logger hierarchy.
        r�Nrr_)	rb�rfindr1r%rFrr�r/�parent)r�r)rb�irKZsubstr�objr7r7r8r97s




zManager._fixupParentscCsD|j}t|�}|j��D]&}|jjd|�|kr|j|_||_qdS)zk
        Ensure that children of the placeholder ph are connected to the
        specified logger.
        N)rbrdr'r�r<)r�r:r)rbZnamelen�cr7r7r8r8OszManager._fixupChildrencCs@t�|j��D]}t|t�r|j��q|jj��t�dS)zj
        Clear the cache for all loggers in loggerDict
        Called when level changes are made
        N)	r9r1�valuesrFr�_cache�clearr/r:�r��loggerr7r7r8�_clear_cache\s
zManager._clear_cacheN)r�r�r�r�r�rr�setterr r%r*r9r8rEr7r7r7r8r.�s

"

r.c@s�eZdZdZefdd�Zdd�Zdd�Zdd	�Zd
d�Z	dd
�Z
dd�Zdd�dd�Zdd�Z
e
Zdd�Zd5dd�Zd6dd�Zd7dd �Zd!d"�Zd#d$�Zd%d&�Zd'd(�Zd)d*�Zd+d,�Zd-d.�Zd/d0�Zd1d2�Zd3d4�ZdS)8rar
    Instances of the Logger class represent a single logging channel. A
    "logging channel" indicates an area of an application. Exactly how an
    "area" is defined is up to the application developer. Since an
    application can have any number of areas, logging channels are identified
    by a unique string. Application areas can be nested (e.g. an area
    of "input processing" might include sub-areas "read CSV files", "read
    XLS files" and "read Gnumeric files"). To cater for this natural nesting,
    channel names are organized into a namespace hierarchy where levels are
    separated by periods, much like the Java or Python package namespace. So
    in the instance given above, channel names might be "input" for the upper
    level, and "input.csv", "input.xls" and "input.gnu" for the sub-levels.
    There is no arbitrary limit to the depth of nesting.
    cCs<t�|�||_t|�|_d|_d|_g|_d|_i|_	dS)zJ
        Initialize the logger with a name and an optional level.
        NTF)
r�r�rbrLr5r<�	propagater��disabledrA)r�rbr5r7r7r8r�|s

zLogger.__init__cCst|�|_|j��dS)zW
        Set the logging level of this logger.  level must be an int or a str.
        N)rLr5r7rEr�r7r7r8r�s
zLogger.setLevelcOs |�t�r|jt||f|�dS)z�
        Log 'msg % args' with severity 'DEBUG'.

        To pass exception information, use the keyword argument exc_info with
        a true value, e.g.

        logger.debug("Houston, we have a %s", "thorny problem", exc_info=1)
        N)�isEnabledForr�_log�r�rcrhr�r7r7r8r�s	
zLogger.debugcOs |�t�r|jt||f|�dS)z�
        Log 'msg % args' with severity 'INFO'.

        To pass exception information, use the keyword argument exc_info with
        a true value, e.g.

        logger.info("Houston, we have a %s", "interesting problem", exc_info=1)
        N)rIr
rJrKr7r7r8r"�s	
zLogger.infocOs |�t�r|jt||f|�dS)z�
        Log 'msg % args' with severity 'WARNING'.

        To pass exception information, use the keyword argument exc_info with
        a true value, e.g.

        logger.warning("Houston, we have a %s", "bit of a problem", exc_info=1)
        N)rIrrJrKr7r7r8r(�s	
zLogger.warningcOs$t�dtd�|j|f|�|�dS�Nz6The 'warn' method is deprecated, use 'warning' insteadr@��warningsr'�DeprecationWarningr(rKr7r7r8r'�s
�zLogger.warncOs |�t�r|jt||f|�dS)z�
        Log 'msg % args' with severity 'ERROR'.

        To pass exception information, use the keyword argument exc_info with
        a true value, e.g.

        logger.error("Houston, we have a %s", "major problem", exc_info=1)
        N)rIrrJrKr7r7r8r�s	
zLogger.errorT�rBcOs|j|f|�d|i|��dS)zU
        Convenience method for logging an ERROR with exception information.
        rBN�r�r�rcrBrhr�r7r7r8r�szLogger.exceptioncOs |�t�r|jt||f|�dS)z�
        Log 'msg % args' with severity 'CRITICAL'.

        To pass exception information, use the keyword argument exc_info with
        a true value, e.g.

        logger.critical("Houston, we have a %s", "major disaster", exc_info=1)
        N)rIrrJrKr7r7r8r�s	
zLogger.criticalcOs<t|t�strtd��ndS|�|�r8|j|||f|�dS)z�
        Log 'msg % args' with the integer severity 'level'.

        To pass exception information, use the keyword argument exc_info with
        a true value, e.g.

        logger.log(level, "We have a %s", "mysterious problem", exc_info=1)
        zlevel must be an integerN)rFrGr,rJrIrJ�r�r5rcrhr�r7r7r8r#�s	


z
Logger.logFr_c
Cs�t�}|dk	r|j}|}|r4|dkr4|j}|d8}q|s<|}d}t|d�r�|j}tj�|j�}|tkrn|j}q@d}|r�t	�
�}	|	�d�tj
||	d�|	��}|ddkr�|dd�}|	��|j|j|j|f}q�q@|S)	z�
        Find the stack frame of the caller so that we can note the source
        file name, line number and function name.
        Nr_)�(unknown file)r�(unknown function)Nr	zStack (most recent call last):
rWr�r�)rErDrr	rkrl�normcaser
�_srcfiler�r�rr�rr�r��f_lineno�co_name)
r�rs�
stacklevelr�Zorig_frK�cornr�r�r7r7r8�
findCaller�s8


zLogger.findCallerNc

CsZt|||||||||
�	}|	dk	rV|	D]0}|dks:||jkrFtd|��|	||j|<q$|S)zr
        A factory method which can be overridden in subclasses to create
        specialized LogRecords.
        N)r�r�z$Attempt to overwrite %r in LogRecord)r�r�r�)
r�rbr5�fn�lnorcrhrBr��extrar�rK�keyr7r7r8�
makeRecords�zLogger.makeRecordc
Cs�d}trBz|�||�\}	}
}}WqLtk
r>d\}	}
}YqLXn
d\}	}
}|r~t|t�rlt|�||jf}nt|t�s~t�	�}|�
|j||	|
||||||�
}|�|�dS)z�
        Low-level logging routine which creates a LogRecord and then calls
        all the handlers of this logger to handle the record.
        N)rTrrU)
rWr\rIrF�
BaseException�type�
__traceback__�tupler=rBrarbr)
r�r5rcrhrBr_rsrZr�r]r^r�r�r7r7r8rJs&


�zLogger._logcCs|js|�|�r|�|�dS)z�
        Call the handlers for the specified record.

        This method is used for unpickled records received from a socket, as
        well as those created locally. Logger-level filtering is applied.
        N)rHr��callHandlersr�r7r7r8r7sz
Logger.handlecCs.t�z||jkr|j�|�W5t�XdS)z;
        Add the specified handler to this logger.
        N)r9r:r�r��r��hdlrr7r7r8�
addHandlerAs

zLogger.addHandlercCs.t�z||jkr|j�|�W5t�XdS)z@
        Remove the specified handler from this logger.
        N)r9r:r�r�rgr7r7r8�
removeHandlerLs

zLogger.removeHandlercCs.|}d}|r*|jrd}q*|js"q*q|j}q|S)a�
        See if this logger has any handlers configured.

        Loop through all handlers for this logger and its parents in the
        logger hierarchy. Return True if a handler was found, else False.
        Stop searching up the hierarchy whenever a logger with the "propagate"
        attribute set to zero is found - that will be the last logger which
        is checked for the existence of handlers.
        FT)r�rGr<)r�r?rKr7r7r8�hasHandlersWs
zLogger.hasHandlerscCs�|}d}|rJ|jD]"}|d}|j|jkr|�|�q|jsBd}q|j}q|dkr�trn|jtjkr�t�|�n&tr�|jj	s�t
j�d|j
�d|j_	dS)a�
        Pass a record to all relevant handlers.

        Loop through all handlers for this logger and its parents in the
        logger hierarchy. If no handler was found, output a one-off error
        message to sys.stderr. Stop searching up the hierarchy whenever a
        logger with the "propagate" attribute set to zero is found - that
        will be the last logger whose handlers are called.
        rr_Nz+No handlers could be found for logger "%s"
T)r�rir5rrGr<r+r,r7r0r=r[rrb)r�r�r?�foundrhr7r7r8rfms&

�zLogger.callHandlerscCs |}|r|jr|jS|j}qtS)z�
        Get the effective level for this logger.

        Loop through this logger and its parents in the logger hierarchy,
        looking for a non-zero logging level. Return the first one found.
        )r5r<rrCr7r7r8�getEffectiveLevel�szLogger.getEffectiveLevelc
Csz|jr
dSz|j|WStk
rtt�z6|jj|krJd}|j|<n||��k}|j|<W5t�X|YSXdS)�;
        Is this logger enabled for level 'level'?
        FN)rHrAr�r9r:r7rrm)r�r5Z
is_enabledr7r7r8rI�s
�zLogger.isEnabledForcCs&|j|k	rd�|j|f�}|j�|�S)ab
        Get a logger which is a descendant to this one.

        This is a convenience method, such that

        logging.getLogger('abc').getChild('def.ghi')

        is the same as

        logging.getLogger('abc.def.ghi')

        It's useful, for example, when the parent logger is named using
        __name__ rather than a literal string.
        r�)r/r�rbr7r )r��suffixr7r7r8�getChild�s
zLogger.getChildcCs t|���}d|jj|j|fSr#)rrmrr�rbr�r7r7r8r��szLogger.__repr__cCs,t|j�|k	r ddl}|�d��t|jffS)Nrzlogger cannot be pickled)r rb�pickleZ
PicklingError)r�rqr7r7r8�
__reduce__�s
zLogger.__reduce__)Fr_)NNN)NNFr_)r�r�r�r�rr�rrr"r(r'rrrrr#r\rarJrrirjrkrfrmrIrpr�rrr7r7r7r8rms<

%�
�

c@s eZdZdZdd�Zdd�ZdS)�
RootLoggerz�
    A root logger is not that different to any other logger, except that
    it must have a logging level and there is only one instance of it in
    the hierarchy.
    cCst�|d|�dS)z=
        Initialize the logger with the name "root".
        r/N)rr�r�r7r7r8r��szRootLogger.__init__cCstdfS)Nr7)r r�r7r7r8rr�szRootLogger.__reduce__N)r�r�r�r�r�rrr7r7r7r8rs�srsc@s�eZdZdZdd�Zdd�Zdd�Zdd	�Zd
d�Zdd
�Z	dd�Z
dd�dd�Zdd�Zdd�Z
dd�Zdd�Zdd�Zdd�Zd+d"d#�Zed$d%��Zejd&d%��Zed'd(��Zd)d*�Zd S),rzo
    An adapter for loggers which makes it easier to specify contextual
    information in logging output.
    cCs||_||_dS)ax
        Initialize the adapter with a logger and a dict-like object which
        provides contextual information. This constructor signature allows
        easy stacking of LoggerAdapters, if so desired.

        You can effectively pass keyword arguments as shown in the
        following example:

        adapter = LoggerAdapter(someLogger, dict(p1=v1, p2="v2"))
        N)rDr_)r�rDr_r7r7r8r��szLoggerAdapter.__init__cCs|j|d<||fS)a�
        Process the logging message and keyword arguments passed in to
        a logging call to insert contextual information. You can either
        manipulate the message itself, the keyword args or both. Return
        the message and kwargs modified (or not) to suit your needs.

        Normally, you'll only need to override this one method in a
        LoggerAdapter subclass for your specific needs.
        r_)r_)r�rcr�r7r7r8r��s

zLoggerAdapter.processcOs|jt|f|�|�dS)zA
        Delegate a debug call to the underlying logger.
        N)r#rrKr7r7r8rszLoggerAdapter.debugcOs|jt|f|�|�dS)zA
        Delegate an info call to the underlying logger.
        N)r#r
rKr7r7r8r"
szLoggerAdapter.infocOs|jt|f|�|�dS)zC
        Delegate a warning call to the underlying logger.
        N)r#rrKr7r7r8r(szLoggerAdapter.warningcOs$t�dtd�|j|f|�|�dSrLrMrKr7r7r8r's
�zLoggerAdapter.warncOs|jt|f|�|�dS)zB
        Delegate an error call to the underlying logger.
        N�r#rrKr7r7r8rszLoggerAdapter.errorTrPcOs |jt|f|�d|i|��dS)zF
        Delegate an exception call to the underlying logger.
        rBNrtrRr7r7r8r!szLoggerAdapter.exceptioncOs|jt|f|�|�dS)zD
        Delegate a critical call to the underlying logger.
        N)r#rrKr7r7r8r'szLoggerAdapter.criticalcOs4|�|�r0|�||�\}}|jj||f|�|�dS)z�
        Delegate a log call to the underlying logger, after adding
        contextual information from this adapter instance.
        N)rIr�rDr#rSr7r7r8r#-s
zLoggerAdapter.logcCs|j�|�S)rn)rDrIr�r7r7r8rI6szLoggerAdapter.isEnabledForcCs|j�|�dS)zC
        Set the specified level on the underlying logger.
        N)rDrr�r7r7r8r<szLoggerAdapter.setLevelcCs
|j��S)zD
        Get the effective level for the underlying logger.
        )rDrmr�r7r7r8rmBszLoggerAdapter.getEffectiveLevelcCs
|j��S)z@
        See if the underlying logger has any handlers.
        )rDrkr�r7r7r8rkHszLoggerAdapter.hasHandlersNFcCs|jj||||||d�S)zX
        Low-level log implementation, proxied to allow nested logger adapters.
        )rBr_rs)rDrJ)r�r5rcrhrBr_rsr7r7r8rJNs�zLoggerAdapter._logcCs|jjSrQ�rDr7r�r7r7r8r7[szLoggerAdapter.managercCs||j_dSrQrur5r7r7r8r7_scCs|jjSrQ)rDrbr�r7r7r8rbcszLoggerAdapter.namecCs&|j}t|���}d|jj|j|fSr#)rDrrmrr�rb)r�rDr5r7r7r8r�gszLoggerAdapter.__repr__)NNF)r�r�r�r�r�r�rr"r(r'rrrr#rIrrmrkrJrr7rFrbr�r7r7r7r8r�s.	




c
Ks�t��z�|�dd�}|r@tjdd�D]}t�|�|��q(ttj�dk�r�|�dd�}|dkr~d|kr�d|kr�td��nd|ks�d|kr�td	��|dkr�|�dd�}|�d
d�}|r�t	||�}n|�dd�}t
|�}|g}|�dd�}|�d
d�}|tk�rtdd�t�
����|�dt|d�}	t|	||�}
|D]&}|jdk�rV|�|
�t�|��q<|�dd�}|dk	�r�t�|�|�r�d�|�
��}td|��W5t�XdS)a'
    Do basic configuration for the logging system.

    This function does nothing if the root logger already has handlers
    configured, unless the keyword argument *force* is set to ``True``.
    It is a convenience method intended for use by simple scripts
    to do one-shot configuration of the logging package.

    The default behaviour is to create a StreamHandler which writes to
    sys.stderr, set a formatter using the BASIC_FORMAT format string, and
    add the handler to the root logger.

    A number of optional keyword arguments may be specified, which can alter
    the default behaviour.

    filename  Specifies that a FileHandler be created, using the specified
              filename, rather than a StreamHandler.
    filemode  Specifies the mode to open the file, if filename is specified
              (if filemode is unspecified, it defaults to 'a').
    format    Use the specified format string for the handler.
    datefmt   Use the specified date/time format.
    style     If a format string is specified, use this to specify the
              type of format string (possible values '%', '{', '$', for
              %-formatting, :meth:`str.format` and :class:`string.Template`
              - defaults to '%').
    level     Set the root logger level to the specified level.
    stream    Use the specified stream to initialize the StreamHandler. Note
              that this argument is incompatible with 'filename' - if both
              are present, 'stream' is ignored.
    handlers  If specified, this should be an iterable of already created
              handlers, which will be added to the root handler. Any handler
              in the list which does not have a formatter assigned will be
              assigned the formatter created in this function.
    force     If this keyword  is specified as true, any existing handlers
              attached to the root logger are removed and closed, before
              carrying out the configuration as specified by the other
              arguments.
    Note that you could specify a stream created using open(filename, mode)
    rather than passing the filename and mode in. However, it should be
    remembered that StreamHandler does not close its stream (since it may be
    using sys.stdout or sys.stderr), whereas FileHandler closes its stream
    when the handler is closed.

    .. versionchanged:: 3.8
       Added the ``force`` parameter.

    .. versionchanged:: 3.2
       Added the ``style`` parameter.

    .. versionchanged:: 3.3
       Added the ``handlers`` parameter. A ``ValueError`` is now thrown for
       incompatible arguments (e.g. ``handlers`` specified together with
       ``filename``/``filemode``, or ``filename``/``filemode`` specified
       together with ``stream``, or ``handlers`` specified together with
       ``stream``.
    �forceFNrr�rrnz8'stream' and 'filename' should not be specified togetherzG'stream' or 'filename' should not be specified together with 'handlers'�filemoderr�r�r�r�r�r�r_r5z, zUnrecognised argument(s): %s)r9r:�popr/r�rjr�rdrIr
rr�r�r�rr�rrir)
r�rv�hr�rnrrZdfsr�Zfsr�r5r�r7r7r8rtsR;



�


cCs|rtj�|�StSdS)z�
    Return a logger with the specified name, creating it if necessary.

    If no name is specified, return the root logger.
    N)rr7r r/)rbr7r7r8r �scOs*ttj�dkrt�tj|f|�|�dS)z�
    Log a message with severity 'CRITICAL' on the root logger. If the logger
    has no handlers, call basicConfig() to add a console handler with a
    pre-defined format.
    rN)rdr/r�rr�rcrhr�r7r7r8r�scOs*ttj�dkrt�tj|f|�|�dS)z�
    Log a message with severity 'ERROR' on the root logger. If the logger has
    no handlers, call basicConfig() to add a console handler with a pre-defined
    format.
    rN)rdr/r�rrrzr7r7r8r�srPcOst|f|�d|i|��dS)z�
    Log a message with severity 'ERROR' on the root logger, with exception
    information. If the logger has no handlers, basicConfig() is called to add
    a console handler with a pre-defined format.
    rBNrQ)rcrBrhr�r7r7r8rscOs*ttj�dkrt�tj|f|�|�dS)z�
    Log a message with severity 'WARNING' on the root logger. If the logger has
    no handlers, call basicConfig() to add a console handler with a pre-defined
    format.
    rN)rdr/r�rr(rzr7r7r8r(scOs"t�dtd�t|f|�|�dS)Nz8The 'warn' function is deprecated, use 'warning' insteadr@rMrzr7r7r8r's
�cOs*ttj�dkrt�tj|f|�|�dS)z�
    Log a message with severity 'INFO' on the root logger. If the logger has
    no handlers, call basicConfig() to add a console handler with a pre-defined
    format.
    rN)rdr/r�rr"rzr7r7r8r"scOs*ttj�dkrt�tj|f|�|�dS)z�
    Log a message with severity 'DEBUG' on the root logger. If the logger has
    no handlers, call basicConfig() to add a console handler with a pre-defined
    format.
    rN)rdr/r�rrrzr7r7r8r$scOs,ttj�dkrt�tj||f|�|�dS)z�
    Log 'msg % args' with the integer severity 'level' on the root logger. If
    the logger has no handlers, call basicConfig() to add a console handler
    with a pre-defined format.
    rN)rdr/r�rr#)r5rcrhr�r7r7r8r#.scCs|tj_tj��dS)zB
    Disable all logging calls of severity 'level' and below.
    N)r/r7rrE)r5r7r7r8r8sc
Cs�t|dd��D]l}zT|�}|rfz:z|��|��|��Wnttfk
rVYnXW5|��XWqtrv�YqXqdS)z�
    Perform any cleanup actions in the logging system (e.g. flushing
    buffers).

    Should be called at application exit.
    N)�reversedrOrNrr�rrIr,)ZhandlerListr�ryr7r7r8r&?s
c@s(eZdZdZdd�Zdd�Zdd�ZdS)	ra�
    This handler does nothing. It's intended to be used to avoid the
    "No handlers could be found for logger XXX" one-off warning. This is
    important for library code, which may contain code to log events. If a user
    of the library does not configure logging, the one-off warning might be
    produced; to avoid this, the library developer simply needs to instantiate
    a NullHandler and add it to the top-level logger of the library module or
    package.
    cCsdS�zStub.Nr7r�r7r7r8rmszNullHandler.handlecCsdSr|r7r�r7r7r8rpszNullHandler.emitcCs
d|_dSrQ)rr�r7r7r8rYsszNullHandler.createLockN)r�r�r�r�rrrYr7r7r7r8rcs	cCs`|dk	r$tdk	r\t||||||�n8t�|||||�}td�}|jsP|�t��|�d|�dS)a�
    Implementation of showwarnings which redirects to logging, which will first
    check to see if the file parameter is None. If a file is specified, it will
    delegate to the original warnings implementation of showwarning. Otherwise,
    it will call warnings.formatwarning and will log the resulting string to a
    warnings logger named "py.warnings" with level logging.WARNING.
    Nzpy.warningsz%s)�_warnings_showwarningrN�
formatwarningr r�rirr()r��categoryrnrtrX�liner�rDr7r7r8�_showwarningzsr�cCs0|rtdkr,tjatt_ntdk	r,tt_dadS)z�
    If capture is true, redirect all warnings to the logging package.
    If capture is False, ensure that warnings are not redirected to logging
    but to their original destinations.
    N)r}rN�showwarningr�)Zcapturer7r7r8r�s)N)NN)or�r=rkrar�r�r�rNr�Zcollections.abcre�stringrrZStrFormatter�__all__ry�
__author__Z
__status__�__version__Z__date__rwr,rxr|r~rr	rrrr
rrr2r4rrrrErlrV�__code__r
rWrLr�rMr9r:rTZWeakSetrUr^rP�objectrr�r*r)r$r�r�r�r�rr�r�rrr�ZWeakValueDictionaryr�r�r�r�rrr
r$Z_defaultLastResortr+r%r%r!r.rrsr,rr/r7rr rrrrr(r'r"rr#rr&�atexit�registerrr}r�rr7r7r7r8�<module>sN	H
�
	
�	�

	

�	g
�1*%4
>SE
d
n








__pycache__/__init__.cpython-38.opt-2.pyc000064400000107365150327210150014113 0ustar00U

e5d�0�*@s2ddlZddlZddlZddlZddlZddlZddlZddlZddlZ	ddl
mZddl
mZ
dddddd	d
ddd
ddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-g*ZddlZd.Zd/Zd0Zd1Ze��Zd2Zd2Zd2Zd2Zd3ZeZd4Zd5ZeZd6Zd7ZdZ ededededede diZ!eeeeeeee d8�Z"d9d �Z#d:d�Z$e%ed;��r`d<d=�Z&nd>d?�Z&ej'�(e$j)j*�Z+d@dA�Z,e�-�Z.dBdC�Z/dDdE�Z0e%edF��s�dGdH�Z1n(e�2�Z3dIdH�Z1dJdK�Z4ej5e/e4e0dL�GdMd�de6�Z7e7a8dNd+�Z9dOd*�Z:dPd%�Z;e
�Z<[
GdQdR�dRe6�Z=GdSdT�dTe=�Z>GdUdV�dVe=�Z?dWZ@e=e@fe>dXfe?dYfdZ�ZAGd[d�de6�Ze�ZBGd\d�de6�ZCGd]d�de6�ZDGd^d_�d_e6�ZEe�F�ZGgZHd`da�ZIdbdc�ZJGddd
�d
eE�ZKGded�deK�ZLGdfd
�d
eL�ZMGdgdh�dheL�ZNeNe�ZOeOZPGdidj�dje6�ZQdkd&�ZRdld"�ZSGdmdn�dne6�ZTGdod�deE�ZUGdpdq�dqeU�ZVeUaWGdrd�de6�ZXeVe�ZYeYeU_YeTeUjY�eU_Zdsd�Z[d�dtd!�Z\dud�Z]e]Z^dvd�Z_d2dw�dxd�Z`dyd)�Zadzd(�Zbd{d#�Zcd|d�Zdd}d$�Zeefd~d�ZfeHfdd'�ZgddlhZheh�ieg�Gd�d�deK�Zjdakd�d�d��Zld�d�ZmdS)��N)�Template)�	Formatter�BASIC_FORMAT�BufferingFormatter�CRITICAL�DEBUG�ERROR�FATAL�FileHandler�Filterr�Handler�INFO�	LogRecord�Logger�
LoggerAdapter�NOTSET�NullHandler�
StreamHandler�WARN�WARNING�addLevelName�basicConfig�captureWarnings�critical�debug�disable�error�	exception�fatal�getLevelName�	getLogger�getLoggerClass�info�log�
makeLogRecord�setLoggerClass�shutdown�warn�warning�getLogRecordFactory�setLogRecordFactory�
lastResort�raiseExceptionsz&Vinay Sajip <vinay_sajip@red-dove.com>Z
productionz0.5.1.2z07 February 2010T�2�(���
)rr	rrrr
rrcCs4t�|�}|dk	r|St�|�}|dk	r,|Sd|S)NzLevel %s)�_levelToName�get�_nameToLevel)�level�result�r7�(/usr/lib64/python3.8/logging/__init__.pyrws

cCs(t�z|t|<|t|<W5t�XdS�N)�_acquireLock�_releaseLockr2r4)r5Z	levelNamer7r7r8r�s
�	_getframecCs
t�d�S)N�)�sysr<r7r7r7r8�<lambda>��r?cCs2zt�Wn$tk
r,t��djjYSXdS)N�)�	Exceptionr>�exc_info�tb_frame�f_backr7r7r7r8�currentframe�srFcCsJt|t�r|}n6t|�|kr:|tkr0td|��t|}ntd|��|S)NzUnknown level: %rz*Level not an integer or a valid string: %r)�
isinstance�int�strr4�
ValueError�	TypeError)r5�rvr7r7r8�_checkLevel�s

rMcCstrt��dSr9)�_lock�acquirer7r7r7r8r:�sr:cCstrt��dSr9)rN�releaser7r7r7r8r;�sr;�register_at_forkcCsdSr9r7��instancer7r7r8�_register_at_fork_reinit_lock�srTcCs"t�zt�|�W5t�XdSr9)r:r;�_at_fork_reinit_lock_weakset�addrRr7r7r8rT�scCsXtD]H}z|��Wqtk
rJ}ztdtd|tjd�W5d}~XYqXqt�dS)Nz&Ignoring exception from logging atforkz._reinit_lock() method:��file)rU�
createLockrB�printrSr>�stderrr;)�handler�errr7r7r8�!_after_at_fork_child_reinit_locks�s�r^)ZbeforeZafter_in_childZafter_in_parentc@s&eZdZddd�Zdd�Zdd�ZdS)	rNc


Ks�t��}||_||_|rFt|�dkrFt|dtjj�rF|drF|d}||_t	|�|_
||_||_z&t
j�|�|_t
j�|j�d|_Wn&tttfk
r�||_d|_YnX||_d|_|	|_||_||_||_|t|�d|_|jtd|_t �rt!�"�|_#t!�$�j|_%nd|_#d|_%t&�s.d|_'nDd|_'t(j)�*d�}|dk	�rrz|�+�j|_'Wnt,k
�rpYnXt-�r�t.t
d��r�t
�/�|_0nd|_0dS)N�rzUnknown modulei�ZMainProcessZmultiprocessing�getpid)1�time�name�msg�lenrG�collections�abc�Mapping�argsrZ	levelname�levelno�pathname�os�path�basename�filename�splitext�modulerKrJ�AttributeErrorrC�exc_text�
stack_info�linenoZfuncName�createdrH�msecs�
_startTimeZrelativeCreated�
logThreads�	threading�	get_ident�threadZcurrent_threadZ
threadName�logMultiprocessingZprocessNamer>�modulesr3Zcurrent_processrB�logProcesses�hasattrr`�process)
�selfrbr5rjrtrcrhrC�func�sinfo�kwargs�ctZmpr7r7r8�__init__ sT"�


zLogRecord.__init__cCsd|j|j|j|j|jfS)Nz!<LogRecord: %s, %s, %s, %s, "%s">)rbrirjrtrc�r�r7r7r8�__repr__hs

�zLogRecord.__repr__cCst|j�}|jr||j}|Sr9)rIrcrh)r�rcr7r7r8�
getMessagels

zLogRecord.getMessage)NN)�__name__�
__module__�__qualname__r�r�r�r7r7r7r8rs

�
HcCs|adSr9��_logRecordFactory)�factoryr7r7r8r*}scCstSr9r�r7r7r7r8r)�sc	Cs&tdddddddd�}|j�|�|S)N�rr7)r��__dict__�update)�dictrLr7r7r8r$�sc@sNeZdZdZdZdZe�dej�Z	dd�Z
dd�Zd	d
�Zdd�Z
d
d�ZdS)�PercentStylez%(message)sz%(asctime)sz
%(asctime)z5%\(\w+\)[#0+ -]*(\*|\d+)?(\.(\*|\d+))?[diouxefgcrsa%]cCs|p|j|_dSr9)�default_format�_fmt�r��fmtr7r7r8r��szPercentStyle.__init__cCs|j�|j�dkS�Nr)r��find�asctime_searchr�r7r7r8�usesTime�szPercentStyle.usesTimecCs*|j�|j�s&td|j|jdf��dS)Nz"Invalid format '%s' for '%s' styler)�validation_pattern�searchr�rJr�r�r7r7r8�validate�szPercentStyle.validatecCs|j|jSr9)r�r��r��recordr7r7r8�_format�szPercentStyle._formatc
Cs@z|�|�WStk
r:}ztd|��W5d}~XYnXdS)Nz(Formatting field not found in record: %s)r��KeyErrorrJ)r�r��er7r7r8�format�szPercentStyle.formatN)r�r�r�r��asctime_formatr��re�compile�Ir�r�r�r�r�r�r7r7r7r8r��sr�c@s@eZdZdZdZdZe�dej�Z	e�d�Z
dd�Zdd	�Zd
S)�StrFormatStylez	{message}z	{asctime}z{asctimezF^(.?[<>=^])?[+ -]?#?0?(\d+|{\w+})?[,_]?(\.(\d+|{\w+}))?[bcdefgnosx%]?$z^(\d+|\w+)(\.\w+|\[[^]]+\])*$cCs|jjf|j�Sr9)r�r�r�r�r7r7r8r��szStrFormatStyle._formatc
Cs�t�}zxt�|j�D]f\}}}}|rF|j�|�s<td|��|�|�|r^|dkr^td|��|r|j�|�std|��qWn.tk
r�}ztd|��W5d}~XYnX|s�td��dS)Nz!invalid field name/expression: %rZrsazinvalid conversion: %rzbad specifier: %rzinvalid format: %s�invalid format: no fields)	�set�_str_formatter�parser��
field_spec�matchrJrV�fmt_spec)r��fields�_Z	fieldname�specZ
conversionr�r7r7r8r��s
zStrFormatStyle.validateN)
r�r�r�r�r�r�r�r�r�r�r�r�r�r7r7r7r8r��s
r�c@s8eZdZdZdZdZdd�Zdd�Zdd�Zd	d
�Z	dS)�StringTemplateStylez
${message}z
${asctime}cCs|p|j|_t|j�|_dSr9)r�r�r�_tplr�r7r7r8r��szStringTemplateStyle.__init__cCs$|j}|�d�dkp"|�|j�dkS)Nz$asctimer)r�r�r�r�r7r7r8r��szStringTemplateStyle.usesTimecCs|tj}t�}|�|j�D]R}|��}|dr<|�|d�q|drT|�|d�q|�d�dkrtd��q|sxtd��dS)NZnamedZbracedr�$z$invalid format: bare '$' not allowedr�)	r�patternr��finditerr��	groupdictrV�grouprJ)r�r�r��m�dr7r7r8r��s
zStringTemplateStyle.validatecCs|jjf|j�Sr9)r�Z
substituter�r�r7r7r8r��szStringTemplateStyle._formatN)
r�r�r�r�r�r�r�r�r�r�r7r7r7r8r��sr�z"%(levelname)s:%(name)s:%(message)sz{levelname}:{name}:{message}z${levelname}:${name}:${message})�%�{r�c@sVeZdZejZddd�ZdZdZddd	�Z	d
d�Z
dd
�Zdd�Zdd�Z
dd�ZdS)rNr�TcCsR|tkrtdd�t�����t|d|�|_|r>|j��|jj|_||_dS)N�Style must be one of: %s�,r)�_STYLESrJ�join�keys�_styler�r��datefmt)r�r�r��styler�r7r7r8r�/s�

zFormatter.__init__z%Y-%m-%d %H:%M:%Sz%s,%03dcCs@|�|j�}|rt�||�}nt�|j|�}|j||jf}|Sr9)�	converterrura�strftime�default_time_format�default_msec_formatrv)r�r�r�r��s�tr7r7r8�
formatTimeLszFormatter.formatTimecCsZt��}|d}t�|d|d|d|�|��}|��|dd�dkrV|dd�}|S)NrArr_����
)�io�StringIO�	traceback�print_exception�getvalue�close)r�Zei�sio�tbr�r7r7r8�formatExceptionfszFormatter.formatExceptioncCs
|j��Sr9)r�r�r�r7r7r8r�yszFormatter.usesTimecCs|j�|�Sr9)r�r�r�r7r7r8�
formatMessageszFormatter.formatMessagecCs|Sr9r7)r�rsr7r7r8�formatStack�szFormatter.formatStackcCs�|��|_|��r"|�||j�|_|�|�}|jrF|jsF|�	|j�|_|jrn|dd�dkrd|d}||j}|j
r�|dd�dkr�|d}||�|j
�}|S)Nr�r�)r��messager�r�r��asctimer�rCrrr�rsr�)r�r�r�r7r7r8r��s 


zFormatter.format)NNr�T)N)r�r�r�ra�	localtimer�r�r�r�r�r�r�r�r�r�r7r7r7r8rs+


c@s.eZdZd
dd�Zdd�Zdd�Zdd	�ZdS)rNcCs|r||_nt|_dSr9)�linefmt�_defaultFormatter)r�r�r7r7r8r��szBufferingFormatter.__init__cCsdS�Nr�r7�r��recordsr7r7r8�formatHeader�szBufferingFormatter.formatHeadercCsdSr�r7r�r7r7r8�formatFooter�szBufferingFormatter.formatFootercCsJd}t|�dkrF||�|�}|D]}||j�|�}q"||�|�}|S)Nr�r)rdr�r�r�r�)r�r�rLr�r7r7r8r��szBufferingFormatter.format)N)r�r�r�r�r�r�r�r7r7r7r8r�s

c@seZdZddd�Zdd�ZdS)rr�cCs||_t|�|_dSr9)rbrd�nlen�r�rbr7r7r8r��szFilter.__init__cCsJ|jdkrdS|j|jkrdS|j�|jd|j�dkr:dS|j|jdkS)NrTF�.)r�rbr�r�r7r7r8�filter�s
z
Filter.filterN)r�)r�r�r�r�r�r7r7r7r8r�s
c@s,eZdZdd�Zdd�Zdd�Zdd�Zd	S)
�FilterercCs
g|_dSr9)�filtersr�r7r7r8r�szFilterer.__init__cCs||jkr|j�|�dSr9)r��append�r�r�r7r7r8�	addFilters
zFilterer.addFiltercCs||jkr|j�|�dSr9)r��remover�r7r7r8�removeFilters
zFilterer.removeFiltercCs>d}|jD].}t|d�r$|�|�}n||�}|s
d}q:q
|S)NTr�F)r�rr�)r�r�rL�fr6r7r7r8r�s

zFilterer.filterN)r�r�r�r�r�r�r�r7r7r7r8r�sr�cCsFttt}}}|rB|rB|rB|�z||kr6|�|�W5|�XdSr9)r:r;�_handlerListr�)�wrrOrP�handlersr7r7r8�_removeHandlerRef:sr�cCs*t�zt�t�|t��W5t�XdSr9)r:r;r�r��weakref�refr�)r\r7r7r8�_addHandlerRefKsr�c@s�eZdZefdd�Zdd�Zdd�Zeee�Zdd�Z	d	d
�Z
dd�Zd
d�Zdd�Z
dd�Zdd�Zdd�Zdd�Zdd�Zdd�Zdd�ZdS) rcCs4t�|�d|_t|�|_d|_t|�|��dSr9)r�r��_namerMr5�	formatterr�rY�r�r5r7r7r8r�^s

zHandler.__init__cCs|jSr9)r�r�r7r7r8�get_namekszHandler.get_namecCs<t�z(|jtkrt|j=||_|r,|t|<W5t�XdSr9�r:r;r��	_handlersr�r7r7r8�set_namens
zHandler.set_namecCst��|_t|�dSr9)ry�RLock�lockrTr�r7r7r8rY{s
zHandler.createLockcCs|jr|j��dSr9)rrOr�r7r7r8rO�szHandler.acquirecCs|jr|j��dSr9)rrPr�r7r7r8rP�szHandler.releasecCst|�|_dSr9)rMr5r�r7r7r8�setLevel�szHandler.setLevelcCs|jr|j}nt}|�|�Sr9)r�r�r�)r�r�r�r7r7r8r��szHandler.formatcCstd��dS)Nz.emit must be implemented by Handler subclasses)�NotImplementedErrorr�r7r7r8�emit�szHandler.emitcCs4|�|�}|r0|��z|�|�W5|��X|Sr9)r�rOrPr)r�r�rLr7r7r8�handle�s	

zHandler.handlecCs
||_dSr9)r�r�r7r7r8�setFormatter�szHandler.setFormattercCsdSr9r7r�r7r7r8�flush�sz
Handler.flushcCs0t�z|jr |jtkr t|j=W5t�XdSr9r�r�r7r7r8r��s

z
Handler.closecCs t�rtj�rt��\}}}z�z�tj�d�t�|||dtj�tj�d�|j}|rvtj	�
|jj�t
dkrv|j}qR|r�tj|tjd�ntj�d|j|jf�ztj�d|j|jf�Wn4tk
r��Yn tk
r�tj�d�YnXWntk
�rYnXW5~~~XdS)Nz--- Logging error ---
zCall stack:
rrWzLogged from file %s, line %s
zMessage: %r
Arguments: %s
zwUnable to print the message and arguments - possible formatting error.
Use the traceback above to help find the error.
)r,r>r[rC�writer�r�rDrkrl�dirname�f_code�co_filename�__path__rE�print_stackrnrtrcrh�RecursionErrorrB�OSError)r�r�r��vr��framer7r7r8�handleError�s<����

zHandler.handleErrorcCst|j�}d|jj|fS)Nz	<%s (%s)>)rr5�	__class__r�r�r7r7r8r�s
zHandler.__repr__N)r�r�r�rr�r�r��propertyrbrYrOrPrr�rrrrr�rr�r7r7r7r8rUs 	



	/c@s:eZdZdZd
dd�Zdd�Zdd�Zd	d
�Zdd�ZdS)rr�NcCs"t�|�|dkrtj}||_dSr9)rr�r>r[�stream�r�rr7r7r8r�s
zStreamHandler.__init__cCs8|��z |jr&t|jd�r&|j��W5|��XdS)Nr)rOrPrrrr�r7r7r8r&s
zStreamHandler.flushcCsdz,|�|�}|j}|�||j�|��Wn2tk
rB�Yntk
r^|�|�YnXdSr9)r�rr�
terminatorrrrBr)r�r�rcrr7r7r8r1s
zStreamHandler.emitcCs@||jkrd}n,|j}|��z|��||_W5|��X|Sr9)rrOrPr)r�rr6r7r7r8�	setStreamGs


zStreamHandler.setStreamcCs>t|j�}t|jdd�}t|�}|r,|d7}d|jj||fS)Nrbr�� z<%s %s(%s)>)rr5�getattrrrIrr�)r�r5rbr7r7r8r�[s
zStreamHandler.__repr__)N)	r�r�r�rr�rrrr�r7r7r7r8rs
c@s6eZdZddd�Zdd�Zdd	�Zd
d�Zdd
�ZdS)r
�aNFcCsTt�|�}tj�|�|_||_||_||_|r@t�	|�d|_
nt�	||���dSr9)
rk�fspathrl�abspath�baseFilename�mode�encoding�delayrr�rr�_open)r�rnrr r!r7r7r8r�is

zFileHandler.__init__c	Csb|��zJz8|jr@z|��W5|j}d|_t|d�r>|��XW5t�|�XW5|��XdS)Nr�)rOrPrr�rrrrr7r7r8r�}s
zFileHandler.closecCst|j|j|jd�S)N)r )�openrrr r�r7r7r8r"�szFileHandler._opencCs$|jdkr|��|_t�||�dSr9)rr"rrr�r7r7r8r�s

zFileHandler.emitcCst|j�}d|jj|j|fS�Nz<%s %s (%s)>)rr5rr�rr�r7r7r8r��s
zFileHandler.__repr__)rNF)r�r�r�r�r�r"rr�r7r7r7r8r
es

c@s$eZdZefdd�Zedd��ZdS)�_StderrHandlercCst�||�dSr9)rr�r�r7r7r8r��sz_StderrHandler.__init__cCstjSr9)r>r[r�r7r7r8r�sz_StderrHandler.streamN)r�r�r�rr�rrr7r7r7r8r%�sr%c@seZdZdd�Zdd�ZdS)�PlaceHoldercCs|di|_dSr9��	loggerMap�r��aloggerr7r7r8r��szPlaceHolder.__init__cCs||jkrd|j|<dSr9r'r)r7r7r8r��s
zPlaceHolder.appendN)r�r�r�r�r�r7r7r7r8r&�sr&cCs(|tkr t|t�s td|j��|adS�Nz(logger not derived from logging.Logger: )r�
issubclassrKr��_loggerClass)�klassr7r7r8r%�s
�cCstSr9)r-r7r7r7r8r!�sc@s^eZdZdd�Zedd��Zejdd��Zdd�Zdd	�Zd
d�Z	dd
�Z
dd�Zdd�ZdS)�ManagercCs(||_d|_d|_i|_d|_d|_dS)NrF)�rootr�emittedNoHandlerWarning�
loggerDict�loggerClass�logRecordFactory)r�Zrootnoder7r7r8r��szManager.__init__cCs|jSr9)�_disabler�r7r7r8r�szManager.disablecCst|�|_dSr9)rMr5�r��valuer7r7r8rscCs�d}t|t�std��t�z�||jkrv|j|}t|t�r�|}|jpHt|�}||_	||j|<|�
||�|�|�n(|jp~t|�}||_	||j|<|�|�W5t�X|S)NzA logger name must be a string)rGrIrKr:r;r2r&r3r-�manager�_fixupChildren�
_fixupParents)r�rbrL�phr7r7r8r s(





zManager.getLoggercCs*|tkr t|t�s td|j��||_dSr+)rr,rKr�r3)r�r.r7r7r8r%&s
�zManager.setLoggerClasscCs
||_dSr9)r4)r�r�r7r7r8r*0szManager.setLogRecordFactorycCs�|j}|�d�}d}|dkr~|s~|d|�}||jkrFt|�|j|<n$|j|}t|t�r`|}n
|�|�|�dd|d�}q|s�|j}||_dS)Nr�rr_)	rb�rfindr2r&rGrr�r0�parent)r�r*rb�irLZsubstr�objr7r7r8r:7s




zManager._fixupParentscCsD|j}t|�}|j��D]&}|jjd|�|kr|j|_||_qdSr9)rbrdr(r�r=)r�r;r*rbZnamelen�cr7r7r8r9OszManager._fixupChildrencCs@t�|j��D]}t|t�r|j��q|jj��t�dSr9)	r:r2�valuesrGr�_cache�clearr0r;�r��loggerr7r7r8�_clear_cache\s
zManager._clear_cacheN)
r�r�r�r�rr�setterr r%r*r:r9rFr7r7r7r8r/�s

"

r/c@s�eZdZefdd�Zdd�Zdd�Zdd�Zd	d
�Zdd�Z	d
d�Z
dd�dd�Zdd�ZeZ
dd�Zd4dd�Zd5dd�Zd6dd�Zd d!�Zd"d#�Zd$d%�Zd&d'�Zd(d)�Zd*d+�Zd,d-�Zd.d/�Zd0d1�Zd2d3�ZdS)7rcCs<t�|�||_t|�|_d|_d|_g|_d|_i|_	dS)NTF)
r�r�rbrMr5r=�	propagater��disabledrB)r�rbr5r7r7r8r�|s

zLogger.__init__cCst|�|_|j��dSr9)rMr5r8rFr�r7r7r8r�s
zLogger.setLevelcOs |�t�r|jt||f|�dSr9)�isEnabledForr�_log�r�rcrhr�r7r7r8r�s	
zLogger.debugcOs |�t�r|jt||f|�dSr9)rJr
rKrLr7r7r8r"�s	
zLogger.infocOs |�t�r|jt||f|�dSr9)rJrrKrLr7r7r8r(�s	
zLogger.warningcOs$t�dtd�|j|f|�|�dS�Nz6The 'warn' method is deprecated, use 'warning' insteadrA��warningsr'�DeprecationWarningr(rLr7r7r8r'�s
�zLogger.warncOs |�t�r|jt||f|�dSr9)rJrrKrLr7r7r8r�s	
zLogger.errorT�rCcOs|j|f|�d|i|��dS�NrC�r�r�rcrCrhr�r7r7r8r�szLogger.exceptioncOs |�t�r|jt||f|�dSr9)rJrrKrLr7r7r8r�s	
zLogger.criticalcOs<t|t�strtd��ndS|�|�r8|j|||f|�dS)Nzlevel must be an integer)rGrHr,rKrJrK�r�r5rcrhr�r7r7r8r#�s	


z
Logger.logFr_c
Cs�t�}|dk	r|j}|}|r4|dkr4|j}|d8}q|s<|}d}t|d�r�|j}tj�|j�}|tkrn|j}q@d}|r�t	�
�}	|	�d�tj
||	d�|	��}|ddkr�|dd�}|	��|j|j|j|f}q�q@|S)Nr_)�(unknown file)r�(unknown function)Nr
zStack (most recent call last):
rWr�r�)rFrErr
rkrl�normcaser�_srcfiler�r�rr�r
r�r��f_lineno�co_name)
r�rs�
stacklevelr�Zorig_frL�cornr�r�r7r7r8�
findCaller�s8


zLogger.findCallerNc

CsZt|||||||||
�	}|	dk	rV|	D]0}|dks:||jkrFtd|��|	||j|<q$|S)N)r�r�z$Attempt to overwrite %r in LogRecord)r�r�r�)
r�rbr5�fn�lnorcrhrCr��extrar�rL�keyr7r7r8�
makeRecords�zLogger.makeRecordc
Cs�d}trBz|�||�\}	}
}}WqLtk
r>d\}	}
}YqLXn
d\}	}
}|r~t|t�rlt|�||jf}nt|t�s~t�	�}|�
|j||	|
||||||�
}|�|�dS)N)rVrrW)
rYr^rJrG�
BaseException�type�
__traceback__�tupler>rCrcrbr)
r�r5rcrhrCrarsr\r�r_r`r�r�r7r7r8rKs&


�zLogger._logcCs|js|�|�r|�|�dSr9)rIr��callHandlersr�r7r7r8r7sz
Logger.handlecCs.t�z||jkr|j�|�W5t�XdSr9)r:r;r�r��r��hdlrr7r7r8�
addHandlerAs

zLogger.addHandlercCs.t�z||jkr|j�|�W5t�XdSr9)r:r;r�r�rir7r7r8�
removeHandlerLs

zLogger.removeHandlercCs.|}d}|r*|jrd}q*|js"q*q|j}q|S)NFT)r�rHr=)r�r@rLr7r7r8�hasHandlersWs
zLogger.hasHandlerscCs�|}d}|rJ|jD]"}|d}|j|jkr|�|�q|jsBd}q|j}q|dkr�trn|jtjkr�t�|�n&tr�|jj	s�t
j�d|j
�d|j_	dS)Nrr_z+No handlers could be found for logger "%s"
T)r�rir5rrHr=r+r,r8r1r>r[rrb)r�r�r@�foundrjr7r7r8rhms&

�zLogger.callHandlerscCs |}|r|jr|jS|j}qtSr9)r5r=rrDr7r7r8�getEffectiveLevel�szLogger.getEffectiveLevelc
Csz|jr
dSz|j|WStk
rtt�z6|jj|krJd}|j|<n||��k}|j|<W5t�X|YSXdS)NF)rIrBr�r:r;r8rro)r�r5Z
is_enabledr7r7r8rJ�s
�zLogger.isEnabledForcCs&|j|k	rd�|j|f�}|j�|�S)Nr�)r0r�rbr8r )r��suffixr7r7r8�getChild�s
zLogger.getChildcCs t|���}d|jj|j|fSr$)rrorr�rbr�r7r7r8r��szLogger.__repr__cCs,t|j�|k	r ddl}|�d��t|jffS)Nrzlogger cannot be pickled)r rb�pickleZ
PicklingError)r�rrr7r7r8�
__reduce__�s
zLogger.__reduce__)Fr_)NNN)NNFr_)r�r�r�rr�rrr"r(r'rrrrr#r^rcrKrrkrlrmrhrorJrqr�rsr7r7r7r8rms:

%�
�

c@seZdZdd�Zdd�ZdS)�
RootLoggercCst�|d|�dS)Nr0)rr�r�r7r7r8r��szRootLogger.__init__cCstdfS)Nr7)r r�r7r7r8rs�szRootLogger.__reduce__N)r�r�r�r�rsr7r7r7r8rt�srtc@s�eZdZdd�Zdd�Zdd�Zdd�Zd	d
�Zdd�Zd
d�Z	dd�dd�Z
dd�Zdd�Zdd�Z
dd�Zdd�Zdd�Zd*d!d"�Zed#d$��Zejd%d$��Zed&d'��Zd(d)�ZdS)+rcCs||_||_dSr9)rEra)r�rErar7r7r8r��szLoggerAdapter.__init__cCs|j|d<||fS)Nra)ra)r�rcr�r7r7r8r��s

zLoggerAdapter.processcOs|jt|f|�|�dSr9)r#rrLr7r7r8rszLoggerAdapter.debugcOs|jt|f|�|�dSr9)r#r
rLr7r7r8r"
szLoggerAdapter.infocOs|jt|f|�|�dSr9)r#rrLr7r7r8r(szLoggerAdapter.warningcOs$t�dtd�|j|f|�|�dSrMrNrLr7r7r8r's
�zLoggerAdapter.warncOs|jt|f|�|�dSr9�r#rrLr7r7r8rszLoggerAdapter.errorTrQcOs |jt|f|�d|i|��dSrRrurTr7r7r8r!szLoggerAdapter.exceptioncOs|jt|f|�|�dSr9)r#rrLr7r7r8r'szLoggerAdapter.criticalcOs4|�|�r0|�||�\}}|jj||f|�|�dSr9)rJr�rEr#rUr7r7r8r#-s
zLoggerAdapter.logcCs|j�|�Sr9)rErJr�r7r7r8rJ6szLoggerAdapter.isEnabledForcCs|j�|�dSr9)rErr�r7r7r8r<szLoggerAdapter.setLevelcCs
|j��Sr9)rEror�r7r7r8roBszLoggerAdapter.getEffectiveLevelcCs
|j��Sr9)rErmr�r7r7r8rmHszLoggerAdapter.hasHandlersNFcCs|jj||||||d�S)N)rCrars)rErK)r�r5rcrhrCrarsr7r7r8rKNs�zLoggerAdapter._logcCs|jjSr9�rEr8r�r7r7r8r8[szLoggerAdapter.managercCs||j_dSr9rvr6r7r7r8r8_scCs|jjSr9)rErbr�r7r7r8rbcszLoggerAdapter.namecCs&|j}t|���}d|jj|j|fSr$)rErrorr�rb)r�rEr5r7r7r8r�gszLoggerAdapter.__repr__)NNF)r�r�r�r�r�rr"r(r'rrrr#rJrrormrKrr8rGrbr�r7r7r7r8r�s,	




c
Ks�t��z�|�dd�}|r@tjdd�D]}t�|�|��q(ttj�dk�r�|�dd�}|dkr~d|kr�d|kr�td��nd|ks�d|kr�td��|dkr�|�dd�}|�d	d
�}|r�t	||�}n|�dd�}t
|�}|g}|�dd�}|�dd
�}|tk�rtdd�t�
����|�dt|d�}	t|	||�}
|D]&}|jdk�rV|�|
�t�|��q<|�dd�}|dk	�r�t�|�|�r�d�|�
��}td|��W5t�XdS)N�forceFrr�rrnz8'stream' and 'filename' should not be specified togetherzG'stream' or 'filename' should not be specified together with 'handlers'�filemoderr�r�r�r�r�r�r_r5z, zUnrecognised argument(s): %s)r:r;�popr0r�rlr�rdrJr
rr�r�r�rr�rrkr)
r�rw�hr�rnrrZdfsr�Zfsr�r5r�r7r7r8rtsR;



�


cCs|rtj�|�StSdSr9)rr8r r0)rbr7r7r8r �scOs*ttj�dkrt�tj|f|�|�dSr�)rdr0r�rr�rcrhr�r7r7r8r�scOs*ttj�dkrt�tj|f|�|�dSr�)rdr0r�rrr{r7r7r8r�srQcOst|f|�d|i|��dSrRrS)rcrCrhr�r7r7r8rscOs*ttj�dkrt�tj|f|�|�dSr�)rdr0r�rr(r{r7r7r8r(scOs"t�dtd�t|f|�|�dS)Nz8The 'warn' function is deprecated, use 'warning' insteadrArNr{r7r7r8r's
�cOs*ttj�dkrt�tj|f|�|�dSr�)rdr0r�rr"r{r7r7r8r"scOs*ttj�dkrt�tj|f|�|�dSr�)rdr0r�rrr{r7r7r8r$scOs,ttj�dkrt�tj||f|�|�dSr�)rdr0r�rr#)r5rcrhr�r7r7r8r#.scCs|tj_tj��dSr9)r0r8rrF)r5r7r7r8r8sc
Cs�t|dd��D]l}zT|�}|rfz:z|��|��|��Wnttfk
rVYnXW5|��XWqtrv�YqXqdSr9)�reversedrPrOrr�rrJr,)ZhandlerListr�rzr7r7r8r&?s
c@s$eZdZdd�Zdd�Zdd�ZdS)rcCsdSr9r7r�r7r7r8rmszNullHandler.handlecCsdSr9r7r�r7r7r8rpszNullHandler.emitcCs
d|_dSr9)rr�r7r7r8rYsszNullHandler.createLockN)r�r�r�rrrYr7r7r7r8rcs
cCs`|dk	r$tdk	r\t||||||�n8t�|||||�}td�}|jsP|�t��|�d|�dS)Nzpy.warningsz%s)�_warnings_showwarningrO�
formatwarningr r�rkrr()r��categoryrnrtrX�liner�rEr7r7r8�_showwarningzsr�cCs0|rtdkr,tjatt_ntdk	r,tt_dadSr9)r}rO�showwarningr�)Zcapturer7r7r8r�s)N)NN)nr>rkrar�r�r�rOr�Zcollections.abcre�stringrrZStrFormatter�__all__ry�
__author__Z
__status__�__version__Z__date__rwr,rxr|r~rr	rrrr
rrr2r4rrrrFrlrX�__code__rrYrMrrNr:r;rTZWeakSetrUr^rQ�objectrr�r*r)r$r�r�r�r�rr�r�rrr�ZWeakValueDictionaryr�r�r�r�rrr
r%Z_defaultLastResortr+r&r%r!r/rrtr-rr0r8rr rrrrr(r'r"rr#rr&�atexit�registerrr}r�rr7r7r7r8�<module>sLH
�
	
�	�

	

�	g
�1*%4
>SE
d
n








__pycache__/handlers.cpython-38.opt-1.pyc000064400000124300150327210150014137 0ustar00U

e5dq��@szdZddlZddlZddlZddlZddlZddlZddlZddlm	Z	m
Z
mZddlZddl
Z
ddlZdZdZdZdZdZdZd	ZGd
d�dej�ZGdd
�d
e�ZGdd�de�ZGdd�dej�ZGdd�dej�ZGdd�de�ZGdd�dej�ZGdd�dej�ZGdd�dej�Z Gdd�dej�Z!Gdd�dej�Z"Gd d!�d!e"�Z#Gd"d#�d#ej�Z$Gd$d%�d%e%�Z&dS)&z�
Additional handlers for the logging package for Python. The core package is
based on PEP 282 and comments thereto in comp.lang.python.

Copyright (C) 2001-2016 Vinay Sajip. All Rights Reserved.

To use, simply 'import logging.handlers' and log away!
�N)�ST_DEV�ST_INO�ST_MTIMEi<#i=#i>#i?#i�Qc@s2eZdZdZddd�Zdd�Zdd	�Zd
d�ZdS)
�BaseRotatingHandlerz�
    Base class for handlers that rotate log files at a certain point.
    Not meant to be instantiated directly.  Instead, use RotatingFileHandler
    or TimedRotatingFileHandler.
    NFcCs0tj�|||||�||_||_d|_d|_dS)zA
        Use the specified filename for streamed logging
        N)�logging�FileHandler�__init__�mode�encoding�namer�rotator��self�filenamer
r�delay�r�(/usr/lib64/python3.8/logging/handlers.pyr	3s
zBaseRotatingHandler.__init__cCsHz$|�|�r|��tj�||�Wntk
rB|�|�YnXdS)z�
        Emit a record.

        Output the record to the file, catering for rollover as described
        in doRollover().
        N)�shouldRollover�
doRolloverrr�emit�	Exception�handleError�r�recordrrrr=s
zBaseRotatingHandler.emitcCst|j�s|}n
|�|�}|S)a�
        Modify the filename of a log file when rotating.

        This is provided so that a custom filename can be provided.

        The default implementation calls the 'namer' attribute of the
        handler, if it's callable, passing the default name to
        it. If the attribute isn't callable (the default is None), the name
        is returned unchanged.

        :param default_name: The default name for the log file.
        )�callabler)rZdefault_name�resultrrr�rotation_filenameKs

z%BaseRotatingHandler.rotation_filenamecCs4t|j�s$tj�|�r0t�||�n|�||�dS)aL
        When rotating, rotate the current log.

        The default implementation calls the 'rotator' attribute of the
        handler, if it's callable, passing the source and dest arguments to
        it. If the attribute isn't callable (the default is None), the source
        is simply renamed to the destination.

        :param source: The source filename. This is normally the base
                       filename, e.g. 'test.log'
        :param dest:   The destination filename. This is normally
                       what the source is rotated to, e.g. 'test.log.1'.
        N)rr
�os�path�exists�rename)r�source�destrrr�rotate^s
zBaseRotatingHandler.rotate)NF)�__name__�
__module__�__qualname__�__doc__r	rrr$rrrrr-s


rc@s*eZdZdZddd�Zdd	�Zd
d�ZdS)
�RotatingFileHandlerz�
    Handler for logging to a set of files, which switches from one file
    to the next when the current file reaches a certain size.
    �arNFcCs.|dkrd}t�|||||�||_||_dS)a�
        Open the specified file and use it as the stream for logging.

        By default, the file grows indefinitely. You can specify particular
        values of maxBytes and backupCount to allow the file to rollover at
        a predetermined size.

        Rollover occurs whenever the current log file is nearly maxBytes in
        length. If backupCount is >= 1, the system will successively create
        new files with the same pathname as the base file, but with extensions
        ".1", ".2" etc. appended to it. For example, with a backupCount of 5
        and a base file name of "app.log", you would get "app.log",
        "app.log.1", "app.log.2", ... through to "app.log.5". The file being
        written to is always "app.log" - when it gets filled up, it is closed
        and renamed to "app.log.1", and if files "app.log.1", "app.log.2" etc.
        exist, then they are renamed to "app.log.2", "app.log.3" etc.
        respectively.

        If maxBytes is zero, rollover never occurs.
        rr*N)rr	�maxBytes�backupCount)rrr
r+r,rrrrrr	xs
zRotatingFileHandler.__init__cCs�|jr|j��d|_|jdkr�t|jddd�D]^}|�d|j|f�}|�d|j|df�}tj�|�r2tj�|�r�t�	|�t�
||�q2|�|jd�}tj�|�r�t�	|�|�|j|�|js�|�
�|_dS)z<
        Do a rollover, as described in __init__().
        Nr����z%s.%dz.1)�stream�closer,�ranger�baseFilenamerrr �remover!r$r�_open)r�iZsfn�dfnrrrr�s&


�

zRotatingFileHandler.doRollovercCsZ|jdkr|��|_|jdkrVd|�|�}|j�dd�|j��t|�|jkrVdSdS)z�
        Determine if rollover should occur.

        Basically, see if the supplied record would cause the file to exceed
        the size limit we have.
        Nrz%s
�r-)r/r4r+�format�seek�tell�len�rr�msgrrrr�s


z"RotatingFileHandler.shouldRollover)r*rrNF)r%r&r'r(r	rrrrrrr)ss
 r)c@s:eZdZdZddd�Zd	d
�Zdd�Zd
d�Zdd�ZdS)�TimedRotatingFileHandlerz�
    Handler for logging to a file, rotating the log file at certain timed
    intervals.

    If backupCount is > 0, when rollover is done, no more than backupCount
    files are kept - the oldest ones are deleted.
    �hr-rNFc	
Cs�t�||d||�|��|_||_||_||_|jdkrLd|_d|_d|_	n�|jdkrjd|_d|_d	|_	n�|jd
kr�d|_d|_d
|_	n�|jdks�|jdkr�d|_d|_d|_	n�|j�
d��r*d|_t|j�dkr�td|j��|jddks�|jddk�rtd|j��t
|jd�|_d|_d|_	ntd|j��t�|j	tj�|_	|j||_|j}tj�|��rzt�|�t}	nt
t���}	|�|	�|_dS)Nr*�Sr-z%Y-%m-%d_%H-%M-%Sz-^\d{4}-\d{2}-\d{2}_\d{2}-\d{2}-\d{2}(\.\w+)?$�M�<z%Y-%m-%d_%H-%Mz'^\d{4}-\d{2}-\d{2}_\d{2}-\d{2}(\.\w+)?$�H�z%Y-%m-%d_%Hz!^\d{4}-\d{2}-\d{2}_\d{2}(\.\w+)?$�D�MIDNIGHTrz%Y-%m-%dz^\d{4}-\d{2}-\d{2}(\.\w+)?$�Wi�:	r7zHYou must specify a day for weekly rollover from 0 to 6 (0 is Monday): %s�0�6z-Invalid day specified for weekly rollover: %sz'Invalid rollover interval specified: %s)rr	�upper�whenr,�utc�atTime�interval�suffix�extMatch�
startswithr;�
ValueError�int�	dayOfWeek�re�compile�ASCIIr2rrr �statr�time�computeRollover�
rolloverAt)
rrrKrNr,rrrLrM�trrrr	�sL



z!TimedRotatingFileHandler.__init__cCsd||j}|jdks"|j�d��r`|jr4t�|�}n
t�|�}|d}|d}|d}|d}|jdkrnt}n |jj	d|jj
d|jj}||d|d|}	|	d	kr�|	t7}	|d
d}||	}|j�d��r`|}
|
|jk�r`|
|jkr�|j|
}nd|
|jd
}||d}|j�s\|d
}
t�|�d
}|
|k�r\|
�sPd}nd}||7}|}|S)zI
        Work out the rollover time based on the specified time.
        rFrG����NrBrr-�rr.���rD)
rNrKrQrLrY�gmtime�	localtimerM�	_MIDNIGHTZhourZminute�secondrT)r�currentTimerr\ZcurrentHourZ
currentMinuteZ
currentSecondZ
currentDayZ	rotate_ts�rZdayZ
daysToWait�
newRolloverAt�dstNow�
dstAtRollover�addendrrrrZsL


��

z(TimedRotatingFileHandler.computeRollovercCstt���}||jkrdSdS)z�
        Determine if rollover should occur.

        record is not used, as we are just comparing times, but it is needed so
        the method signatures are the same
        r-r)rSrYr[)rrr\rrrrIs
z'TimedRotatingFileHandler.shouldRolloverc	Cs�tj�|j�\}}t�|�}g}|d}t|�}|D]@}|d|�|kr4||d�}|j�|�r4|�tj�	||��q4t|�|j
kr�g}n|��|dt|�|j
�}|S)z�
        Determine the files to delete when rolling over.

        More specific than the earlier method, which just used glob.glob().
        �.N)rr�splitr2�listdirr;rP�match�append�joinr,�sort)	rZdirNameZbaseNameZ	fileNamesr�prefixZplenZfileNamerOrrr�getFilesToDeleteUs
z)TimedRotatingFileHandler.getFilesToDeletecCsv|jr|j��d|_tt���}t�|�d}|j|j}|jrNt�|�}n6t�|�}|d}||kr�|rrd}nd}t�||�}|�	|j
dt�|j|��}t
j�|�r�t
�|�|�|j
|�|jdkr�|��D]}t
�|�q�|js�|��|_|�|�}	|	|k�r|	|j}	�q|jdk�s4|j�d��rl|j�slt�|	�d}
||
k�rl|�s`d}nd}|	|7}	|	|_dS)	ax
        do a rollover; in this case, a date/time stamp is appended to the filename
        when the rollover happens.  However, you want the file to be named for the
        start of the interval, not the current time.  If there is a backup count,
        then we have to get a list of matching filenames, sort them and remove
        the one with the oldest suffix.
        Nr.rDrbrmrrFrG)r/r0rSrYrdr[rNrLrcrr2�strftimerOrrr r3r$r,rurr4rZrKrQ)rrgrjr\Z	timeTupleZdstThenrlr6�srirkrrrrlsJ

�




"
z#TimedRotatingFileHandler.doRollover)r?r-rNFFN)	r%r&r'r(r	rZrrurrrrrr>�s
9Ir>c@s2eZdZdZd
dd�Zdd�Zd	d
�Zdd�ZdS)�WatchedFileHandlera�
    A handler for logging to a file, which watches the file
    to see if it has changed while in use. This can happen because of
    usage of programs such as newsyslog and logrotate which perform
    log file rotation. This handler, intended for use under Unix,
    watches the file to see if it has changed since the last emit.
    (A file has changed if its device or inode have changed.)
    If it has changed, the old file stream is closed, and the file
    opened to get a new stream.

    This handler is not appropriate for use under Windows, because
    under Windows open files cannot be moved or renamed - logging
    opens the files with exclusive locks - and so there is no need
    for such a handler. Furthermore, ST_INO is not supported under
    Windows; stat always returns zero for this value.

    This handler is based on a suggestion and patch by Chad J.
    Schroeder.
    r*NFcCs,tj�|||||�d\|_|_|��dS)N)r.r.)rrr	�dev�ino�_statstreamrrrrr	�szWatchedFileHandler.__init__cCs0|jr,t�|j���}|t|t|_|_dS�N)r/r�fstat�filenorrryrz�rZsresrrrr{�szWatchedFileHandler._statstreamcCs�zt�|j�}Wntk
r(d}YnX|rJ|t|jksJ|t|jkr�|jdk	r�|j�	�|j�
�d|_|��|_|��dS)z�
        Reopen log file if needed.

        Checks if the underlying file has changed, and if it
        has, close the old stream and reopen the file to get the
        current stream.
        N)
rrXr2�FileNotFoundErrorrryrrzr/�flushr0r4r{rrrr�reopenIfNeeded�s
 



z!WatchedFileHandler.reopenIfNeededcCs|��tj�||�dS)z�
        Emit a record.

        If underlying file has changed, reopen the file before emitting the
        record to it.
        N)r�rrrrrrrr�szWatchedFileHandler.emit)r*NF)r%r&r'r(r	r{r�rrrrrrx�s

rxc@sReZdZdZdd�Zddd�Zdd�Zd	d
�Zdd�Zd
d�Z	dd�Z
dd�ZdS)�
SocketHandlera
    A handler class which writes logging records, in pickle format, to
    a streaming socket. The socket is kept open across logging calls.
    If the peer resets it, an attempt is made to reconnect on the next call.
    The pickle which is sent is that of the LogRecord's attribute dictionary
    (__dict__), so that the receiver does not need to have the logging module
    installed in order to process the logging event.

    To unpickle the record at the receiving end into a LogRecord, use the
    makeLogRecord function.
    cCsZtj�|�||_||_|dkr(||_n
||f|_d|_d|_d|_d|_	d|_
d|_dS)a
        Initializes the handler with a specific host address and port.

        When the attribute *closeOnError* is set to True - if a socket error
        occurs, the socket is silently closed and then reopened on the next
        logging call.
        NFg�?g>@g@)r�Handlerr	�host�port�address�sock�closeOnError�	retryTime�
retryStart�retryMax�retryFactor�rr�r�rrrr	�s
zSocketHandler.__init__r-cCsj|jdk	rtj|j|d�}nJt�tjtj�}|�|�z|�|j�Wntk
rd|�	��YnX|S)zr
        A factory method which allows subclasses to define the precise
        type of socket they want.
        N��timeout)
r��socketZcreate_connectionr��AF_UNIX�SOCK_STREAMZ
settimeout�connect�OSErrorr0)rr�rrrr�
makeSocket	s

zSocketHandler.makeSocketcCs�t��}|jdkrd}n
||jk}|r�z|��|_d|_WnVtk
r�|jdkr^|j|_n"|j|j|_|j|jkr�|j|_||j|_YnXdS)z�
        Try to create a socket, using an exponential backoff with
        a max retry time. Thanks to Robert Olson for the original patch
        (SF #815911) which has been slightly refactored.
        NT)	rYr�r�r�r�r�ZretryPeriodr�r�)rZnowZattemptrrr�createSockets





zSocketHandler.createSocketcCsR|jdkr|��|jrNz|j�|�Wn$tk
rL|j��d|_YnXdS)z�
        Send a pickled string to the socket.

        This function allows for partial sends which can happen when the
        network is busy.
        N)r�r��sendallr�r0�rrwrrr�send6s

zSocketHandler.sendcCsj|j}|r|�|�}t|j�}|��|d<d|d<d|d<|�dd�t�|d�}t�	dt
|��}||S)z�
        Pickles the record in binary format with a length prefix, and
        returns it ready for transmission across the socket.
        r=N�args�exc_info�messager-z>L)r�r8�dict�__dict__Z
getMessage�pop�pickle�dumps�structZpackr;)rrZeiZdummy�drwZslenrrr�
makePickleIs

zSocketHandler.makePicklecCs0|jr|jr|j��d|_ntj�||�dS)z�
        Handle an error during logging.

        An error has occurred during logging. Most likely cause -
        connection lost. Close the socket so that we can retry on the
        next event.
        N)r�r�r0rr�rrrrrr_s
zSocketHandler.handleErrorcCs<z|�|�}|�|�Wntk
r6|�|�YnXdS)a
        Emit a record.

        Pickles the record and writes it to the socket in binary format.
        If there is an error with the socket, silently drop the packet.
        If there was a problem with the socket, re-establishes the
        socket.
        N)r�r�rr)rrrwrrrrms
	
zSocketHandler.emitcCs@|��z(|j}|r"d|_|��tj�|�W5|��XdS�z$
        Closes the socket.
        N)�acquire�releaser�r0rr�)rr�rrrr0|szSocketHandler.closeN)r-)r%r&r'r(r	r�r�r�r�rrr0rrrrr��s
r�c@s(eZdZdZdd�Zdd�Zdd�ZdS)	�DatagramHandlera�
    A handler class which writes logging records, in pickle format, to
    a datagram socket.  The pickle which is sent is that of the LogRecord's
    attribute dictionary (__dict__), so that the receiver does not need to
    have the logging module installed in order to process the logging event.

    To unpickle the record at the receiving end into a LogRecord, use the
    makeLogRecord function.

    cCst�|||�d|_dS)zP
        Initializes the handler with a specific host address and port.
        FN)r�r	r�r�rrrr	�szDatagramHandler.__init__cCs*|jdkrtj}ntj}t�|tj�}|S)zu
        The factory method of SocketHandler is here overridden to create
        a UDP socket (SOCK_DGRAM).
        N)r�r�r�ZAF_INET�
SOCK_DGRAM)rZfamilyrwrrrr��s

zDatagramHandler.makeSocketcCs&|jdkr|��|j�||j�dS)z�
        Send a pickled string to a socket.

        This function no longer allows for partial sends which can happen
        when the network is busy - UDP does not guarantee delivery and
        can deliver packets out of sequence.
        N)r�r��sendtor�r�rrrr��s
zDatagramHandler.sendN)r%r&r'r(r	r�r�rrrrr��s
r�c@s"eZdZdZdZdZdZdZdZdZ	dZ
d	ZdZdZ
dZdZdZdZdZd	Zd
ZdZdZd
ZdZdZdZdZdZdZdZdZeeeeeeee
e	eeed�Z eeeeeeeeeeee
eeeeeeeeed�Z!dddddd�Z"de#fe
dfd d!�Z$d"d#�Z%d$d%�Z&d&d'�Z'd(d)�Z(d*Z)d+Z*d,d-�Z+dS).�
SysLogHandlera
    A handler class which sends formatted logging records to a syslog
    server. Based on Sam Rushing's syslog module:
    http://www.nightmare.com/squirl/python-ext/misc/syslog.py
    Contributed by Nicolas Untz (after which minor refactoring changes
    have been made).
    rr-r7r]r^r_r`ra��	�
���������)ZalertZcrit�critical�debugZemerg�err�error�infoZnoticeZpanic�warn�warning)ZauthZauthprivZcron�daemonZftpZkernZlprZmailZnewsZsecurityZsyslog�userZuucpZlocal0Zlocal1Zlocal2Zlocal3Zlocal4Zlocal5Zlocal6Zlocal7r�r�r�r�r�)�DEBUG�INFO�WARNING�ERROR�CRITICALZ	localhostNcCs4tj�|�||_||_||_t|t�rTd|_z|�	|�Wnt
k
rPYnXn�d|_|dkrhtj}|\}}t�
||d|�}|s�t
d��|D]�}|\}}}	}
}d}}
z.t�|||	�}
|tjkr�|
�|�W�qWq�t
k
�r}z|}|
dk	�r|
��W5d}~XYq�Xq�|dk	�r$|�|
|_||_dS)a
        Initialize a handler.

        If address is specified as a string, a UNIX socket is used. To log to a
        local syslogd, "SysLogHandler(address="/dev/log")" can be used.
        If facility is not specified, LOG_USER is used. If socktype is
        specified as socket.SOCK_DGRAM or socket.SOCK_STREAM, that specific
        socket type will be used. For Unix sockets, you can also specify a
        socktype of None, in which case socket.SOCK_DGRAM will be used, falling
        back to socket.SOCK_STREAM.
        TFNrz!getaddrinfo returns an empty list)rr�r	r��facility�socktype�
isinstance�str�
unixsocket�_connect_unixsocketr�r�r�Zgetaddrinfor�r�r0)rr�r�r�r�r�Zress�resZaf�proto�_Zsar�r��excrrrr	sB





zSysLogHandler.__init__cCs�|j}|dkrtj}t�tj|�|_z|j�|�||_Wnxtk
r�|j��|jdk	r`�tj}t�tj|�|_z|j�|�||_Wn tk
r�|j���YnXYnXdSr|)r�r�r�r�r�r�r0r�)rr�Zuse_socktyperrrr�Qs&




z!SysLogHandler._connect_unixsocketcCs4t|t�r|j|}t|t�r(|j|}|d>|BS)z�
        Encode the facility and priority. You can pass in strings or
        integers - if strings are passed, the facility_names and
        priority_names mapping dictionaries are used to convert them to
        integers.
        r])r�r��facility_names�priority_names)rr�Zpriorityrrr�encodePriorityis




zSysLogHandler.encodePrioritycCs2|��z|j��tj�|�W5|��XdSr�)r�r�r�r0rr��rrrrr0vs

zSysLogHandler.closecCs|j�|d�S)aK
        Map a logging level name to a key in the priority_names map.
        This is useful in two scenarios: when custom levels are being
        used, and in the case where you can't do a straightforward
        mapping by lowercasing the logging level name because of locale-
        specific issues (see SF #1524081).
        r�)�priority_map�get)rZ	levelNamerrr�mapPriority�szSysLogHandler.mapPriority�TcCsz�|�|�}|jr|j|}|jr*|d7}d|�|j|�|j��}|�d�}|�d�}||}|jr�z|j	�
|�Wq�tk
r�|j	��|�
|j�|j	�
|�Yq�Xn*|jt	jkr�|j	�||j�n|j	�|�Wntk
r�|�|�YnXdS)z�
        Emit a record.

        The record is formatted, and then sent to the syslog server. If
        exception information is present, it is NOT sent to the server.
        �z<%d>�utf-8N)r8�ident�
append_nulr�r�r�Z	levelname�encoder�r�r�r�r0r�r�r�r�r�r�rr)rrr=Zpriorrrr�s0



�


zSysLogHandler.emit),r%r&r'r(Z	LOG_EMERGZ	LOG_ALERTZLOG_CRITZLOG_ERRZLOG_WARNINGZ
LOG_NOTICEZLOG_INFOZ	LOG_DEBUGZLOG_KERNZLOG_USERZLOG_MAILZ
LOG_DAEMONZLOG_AUTHZ
LOG_SYSLOGZLOG_LPRZLOG_NEWSZLOG_UUCPZLOG_CRONZLOG_AUTHPRIVZLOG_FTPZ
LOG_LOCAL0Z
LOG_LOCAL1Z
LOG_LOCAL2Z
LOG_LOCAL3Z
LOG_LOCAL4Z
LOG_LOCAL5Z
LOG_LOCAL6Z
LOG_LOCAL7r�r�r��SYSLOG_UDP_PORTr	r�r�r0r�r�r�rrrrrr��s�����
6

r�c@s*eZdZdZd
dd�Zdd�Zdd	�ZdS)�SMTPHandlerzK
    A handler class which sends an SMTP email for each logging event.
    N�@cCs�tj�|�t|ttf�r(|\|_|_n|d|_|_t|ttf�rR|\|_|_	nd|_||_
t|t�rn|g}||_||_
||_||_dS)ax
        Initialize the handler.

        Initialize the instance with the from and to addresses and subject
        line of the email. To specify a non-standard SMTP port, use the
        (host, port) tuple format for the mailhost argument. To specify
        authentication credentials, supply a (username, password) tuple
        for the credentials argument. To specify the use of a secure
        protocol (TLS), pass in a tuple for the secure argument. This will
        only be used when authentication credentials are supplied. The tuple
        will be either an empty tuple, or a single-value tuple with the name
        of a keyfile, or a 2-value tuple with the names of the keyfile and
        certificate file. (This tuple is passed to the `starttls` method).
        A timeout in seconds can be specified for the SMTP connection (the
        default is one second).
        N)rr�r	r��list�tuple�mailhost�mailport�username�password�fromaddrr��toaddrs�subject�securer�)rr�r�r�r��credentialsr�r�rrrr	�s
zSMTPHandler.__init__cCs|jS)z�
        Determine the subject for the email.

        If you want to specify a subject line which is record-dependent,
        override this method.
        )r�rrrr�
getSubject�szSMTPHandler.getSubjectcCsz�ddl}ddlm}ddl}|j}|s.|j}|j|j||jd�}|�}|j	|d<d�
|j�|d<|�|�|d<|j
��|d	<|�|�|��|jr�|jdk	r�|��|j|j�|��|�|j|j�|�|�|��Wntk
r�|�|�YnXdS)
zd
        Emit a record.

        Format the record and send it to the specified addressees.
        rN)�EmailMessager�ZFrom�,ZToZSubjectZDate)�smtplibZ
email.messager�Zemail.utilsr�Z	SMTP_PORTZSMTPr�r�r�rrr�r�ZutilsrdZset_contentr8r�r�ZehloZstarttlsZloginr�Zsend_message�quitrr)rrr�r�Zemailr�Zsmtpr=rrrr�s0


zSMTPHandler.emit)NNr�)r%r&r'r(r	r�rrrrrr��s�
#	r�c@sBeZdZdZddd�Zdd�Zdd	�Zd
d�Zdd
�Zdd�Z	dS)�NTEventLogHandlera�
    A handler class which sends events to the NT Event Log. Adds a
    registry entry for the specified application name. If no dllname is
    provided, win32service.pyd (which contains some basic message
    placeholders) is used. Note that use of these placeholders will make
    your event logs big, as the entire message source is held in the log.
    If you want slimmer logs, you have to pass in the name of your own DLL
    which contains the message definitions you want to use in the event log.
    N�Applicationc
Cs�tj�|�z�ddl}ddl}||_||_|s`tj�	|jj
�}tj�	|d�}tj�|dd�}||_||_
|j�|||�|j|_tj|jtj|jtj|jtj|jtj|ji|_Wn"tk
r�td�d|_YnXdS)Nrzwin32service.pydzWThe Python Win32 extensions for NT (service, event logging) appear not to be available.)rr�r	�win32evtlogutil�win32evtlog�appname�_welurrrn�__file__rr�dllname�logtypeZAddSourceToRegistryZEVENTLOG_ERROR_TYPE�deftyper�ZEVENTLOG_INFORMATION_TYPEr�r�ZEVENTLOG_WARNING_TYPEr�r��typemap�ImportError�print)rr�r�r�r�r�rrrr	s6�
zNTEventLogHandler.__init__cCsdS)ay
        Return the message ID for the event record. If you are using your
        own messages, you could do this by having the msg passed to the
        logger being an ID rather than a formatting string. Then, in here,
        you could use a dictionary lookup to get the message ID. This
        version returns 1, which is the base message ID in win32service.pyd.
        r-rrrrr�getMessageID&szNTEventLogHandler.getMessageIDcCsdS)z�
        Return the event category for the record.

        Override this if you want to specify your own categories. This version
        returns 0.
        rrrrrr�getEventCategory0sz"NTEventLogHandler.getEventCategorycCs|j�|j|j�S)a�
        Return the event type for the record.

        Override this if you want to specify your own types. This version does
        a mapping using the handler's typemap attribute, which is set up in
        __init__() to a dictionary which contains mappings for DEBUG, INFO,
        WARNING, ERROR and CRITICAL. If you are using your own levels you will
        either need to override this method or place a suitable dictionary in
        the handler's typemap attribute.
        )r�r��levelnor�rrrr�getEventType9szNTEventLogHandler.getEventTypecCsn|jrjzD|�|�}|�|�}|�|�}|�|�}|j�|j||||g�Wntk
rh|�|�YnXdS)z�
        Emit a record.

        Determine the message ID, event category and event type. Then
        log the message in the NT event log.
        N)	r�r�r�rr8ZReportEventr�rr)rr�id�cat�typer=rrrrFs



zNTEventLogHandler.emitcCstj�|�dS)aS
        Clean up this handler.

        You can remove the application name from the registry as a
        source of event log entries. However, if you do this, you will
        not be able to see the events as you intended in the Event Log
        Viewer - it needs to be able to access the registry to get the
        DLL name.
        N)rr�r0r�rrrr0WszNTEventLogHandler.close)Nr�)
r%r&r'r(r	r�r�rrr0rrrrr�s	

	
r�c@s*eZdZdZddd�Zdd�Zd	d
�ZdS)�HTTPHandlerz^
    A class which sends records to a Web server, using either GET or
    POST semantics.
    �GETFNcCs`tj�|�|��}|dkr$td��|s8|dk	r8td��||_||_||_||_||_	||_
dS)zr
        Initialize the instance with the host, the request URL, and the method
        ("GET" or "POST")
        )r�POSTzmethod must be GET or POSTNz3context parameter only makes sense with secure=True)rr�r	rJrRr��url�methodr�r��context)rr�rr	r�r�r
rrrr	iszHTTPHandler.__init__cCs|jS)z�
        Default implementation of mapping the log record into a dict
        that is sent as the CGI data. Overwrite in your class.
        Contributed by Franz Glasner.
        )r�rrrr�mapLogRecord}szHTTPHandler.mapLogRecordcCsx�zPddl}ddl}|j}|jr4|jj||jd�}n|j�|�}|j}|j	�
|�|��}|jdkr�|�
d�dkrvd}nd}|d||f}|�|j|�|�
d�}	|	dkr�|d|	�}|jd	kr�|�d
d�|�dtt|���|j�r$ddl}
d
|j�d�}d|
�|����d�}|�d|�|��|jd	k�rH|�|�d��|��Wn tk
�rr|�|�YnXdS)zk
        Emit a record.

        Send the record to the Web server as a percent-encoded dictionary
        rN)r
r�?�&z%c%s�:rzContent-typez!application/x-www-form-urlencodedzContent-lengthz%s:%sr�zBasic �asciiZ
Authorization)Zhttp.clientZurllib.parser�r�ZclientZHTTPSConnectionr
ZHTTPConnectionr�parseZ	urlencoderr	�findZ
putrequestZ	putheaderr�r;r��base64r�Z	b64encode�strip�decodeZ
endheadersr�Zgetresponserr)rrZhttpZurllibr�r?r�data�sepr5rrwrrrr�sB


�zHTTPHandler.emit)rFNN)r%r&r'r(r	rrrrrrrds�
rc@s8eZdZdZdd�Zdd�Zdd�Zdd	�Zd
d�ZdS)
�BufferingHandlerz�
  A handler class which buffers logging records in memory. Whenever each
  record is added to the buffer, a check is made to see if the buffer should
  be flushed. If it should, then flush() is expected to do what's needed.
    cCstj�|�||_g|_dS)z>
        Initialize the handler with the buffer size.
        N)rr�r	�capacity�buffer)rrrrrr	�szBufferingHandler.__init__cCst|j�|jkS)z�
        Should the handler flush its buffer?

        Returns true if the buffer is up to capacity. This method can be
        overridden to implement custom flushing strategies.
        )r;rrrrrr�shouldFlush�szBufferingHandler.shouldFlushcCs"|j�|�|�|�r|��dS)z�
        Emit a record.

        Append the record. If shouldFlush() tells us to, call flush() to process
        the buffer.
        N)rrqrr�rrrrr�s
zBufferingHandler.emitcCs"|��z
g|_W5|��XdS)zw
        Override to implement custom flushing behaviour.

        This version just zaps the buffer to empty.
        N)r�r�rr�rrrr��s
zBufferingHandler.flushc	Cs z|��W5tj�|�XdS)zp
        Close the handler.

        This version just flushes and chains to the parent class' close().
        N)rr�r0r�r�rrrr0�szBufferingHandler.closeN)	r%r&r'r(r	rrr�r0rrrrr�s	rc@sBeZdZdZejddfdd�Zdd�Zdd	�Zd
d�Z	dd
�Z
dS)�
MemoryHandlerz�
    A handler class which buffers logging records in memory, periodically
    flushing them to a target handler. Flushing occurs whenever the buffer
    is full, or when an event of a certain severity or greater is seen.
    NTcCs"t�||�||_||_||_dS)a;
        Initialize the handler with the buffer size, the level at which
        flushing should occur and an optional target.

        Note that without a target being set either here or via setTarget(),
        a MemoryHandler is no use to anyone!

        The ``flushOnClose`` argument is ``True`` for backward compatibility
        reasons - the old behaviour is that when the handler is closed, the
        buffer is flushed, even if the flush level hasn't been exceeded nor the
        capacity exceeded. To prevent this, set ``flushOnClose`` to ``False``.
        N)rr	�
flushLevel�target�flushOnClose)rrrrrrrrr	�szMemoryHandler.__init__cCst|j�|jkp|j|jkS)zP
        Check for buffer full or a record at the flushLevel or higher.
        )r;rrrrrrrrrs
�zMemoryHandler.shouldFlushcCs"|��z
||_W5|��XdS)z:
        Set the target handler for this handler.
        N)r�r�r)rrrrr�	setTarget
s
zMemoryHandler.setTargetcCs@|��z(|jr.|jD]}|j�|�qg|_W5|��XdS)z�
        For a MemoryHandler, flushing means just sending the buffered
        records to the target, if there is one. Override if you want
        different behaviour.

        The record buffer is also cleared by this operation.
        N)r�r�rr�handlerrrrr�s

zMemoryHandler.flushcCsBz|jr|��W5|��zd|_t�|�W5|��XXdS)zi
        Flush, if appropriately configured, set the target to None and lose the
        buffer.
        N)r�r�rrr0rr�r�rrrr0(szMemoryHandler.close)r%r&r'r(rr�r	rrr�r0rrrrr�s�

rc@s0eZdZdZdd�Zdd�Zdd�Zdd	�Zd
S)�QueueHandlera�
    This handler sends events to a queue. Typically, it would be used together
    with a multiprocessing Queue to centralise logging to file in one process
    (in a multi-process application), so as to avoid file write contention
    between processes.

    This code is new in Python 3.2, but this class can be copy pasted into
    user code for use with earlier Python versions.
    cCstj�|�||_dS)zA
        Initialise an instance, using the passed queue.
        N)rr�r	�queue)rr"rrrr	DszQueueHandler.__init__cCs|j�|�dS)z�
        Enqueue a record.

        The base implementation uses put_nowait. You may want to override
        this method if you want to use blocking, timeouts or custom queue
        implementations.
        N)r"�
put_nowaitrrrr�enqueueKszQueueHandler.enqueuecCs6|�|�}t�|�}||_||_d|_d|_d|_|S)a�
        Prepares a record for queuing. The object returned by this method is
        enqueued.

        The base implementation formats the record to merge the message
        and arguments, and removes unpickleable items from the record
        in-place.

        You might want to override this method if you want to convert
        the record to a dict or JSON string, or send a modified copy
        of the record while leaving the original intact.
        N)r8�copyr�r=r�r�Zexc_textr<rrr�prepareUs

zQueueHandler.preparecCs8z|�|�|��Wntk
r2|�|�YnXdS)zm
        Emit a record.

        Writes the LogRecord to the queue, preparing it for pickling first.
        N)r$r&rrrrrrrrszQueueHandler.emitN)r%r&r'r(r	r$r&rrrrrr!9s


r!c@sZeZdZdZdZdd�dd�Zdd�Zd	d
�Zdd�Zd
d�Z	dd�Z
dd�Zdd�ZdS)�
QueueListenerz�
    This class implements an internal threaded listener which watches for
    LogRecords being added to a queue, removes them and passes them to a
    list of handlers for processing.
    NF)�respect_handler_levelcGs||_||_d|_||_dS)zW
        Initialise an instance with the specified queue and
        handlers.
        N)r"�handlers�_threadr()rr"r(r)rrrr	�szQueueListener.__init__cCs|j�|�S)z�
        Dequeue a record and return it, optionally blocking.

        The base implementation uses get. You may want to override this method
        if you want to use timeouts or work with custom queue implementations.
        )r"r�)r�blockrrr�dequeue�szQueueListener.dequeuecCs&tj|jd�|_}d|_|��dS)z�
        Start the listener.

        This starts up a background thread to monitor the queue for
        LogRecords to process.
        )rTN)�	threadingZThread�_monitorr*r��start)rr\rrrr/�szQueueListener.startcCs|S)a
        Prepare a record for handling.

        This method just returns the passed-in record. You may want to
        override this method if you need to do any custom marshalling or
        manipulation of the record before passing it to the handlers.
        rrrrrr&�szQueueListener.preparecCs@|�|�}|jD]*}|js d}n|j|jk}|r|�|�qdS)z|
        Handle a record.

        This just loops through the handlers offering them the record
        to handle.
        TN)r&r)r(r�levelr )rrZhandlerZprocessrrrr �s

zQueueListener.handlecCsp|j}t|d�}z>|�d�}||jkr6|r2|��Wql|�|�|rL|��Wqtjk
rhYqlYqXqdS)z�
        Monitor the queue for records, and ask the handler
        to deal with them.

        This method runs on a separate, internal thread.
        The thread will terminate if it sees a sentinel object in the queue.
        �	task_doneTN)r"�hasattrr,�	_sentinelr1r ZEmpty)r�qZ
has_task_donerrrrr.�s



zQueueListener._monitorcCs|j�|j�dS)z�
        This is used to enqueue the sentinel record.

        The base implementation uses put_nowait. You may want to override this
        method if you want to use timeouts or work with custom queue
        implementations.
        N)r"r#r3r�rrr�enqueue_sentinel�szQueueListener.enqueue_sentinelcCs|��|j��d|_dS)a

        Stop the listener.

        This asks the thread to terminate, and then waits for it to do so.
        Note that if you don't call this before your application exits, there
        may be some records still left on the queue, which won't be processed.
        N)r5r*rrr�rrr�stop�s
zQueueListener.stop)
r%r&r'r(r3r	r,r/r&r r.r5r6rrrrr'~s
	

r')'r(rr�rr�r�rYrUrXrrrr"r-r%ZDEFAULT_TCP_LOGGING_PORTZDEFAULT_UDP_LOGGING_PORTZDEFAULT_HTTP_LOGGING_PORTZDEFAULT_SOAP_LOGGING_PORTr�ZSYSLOG_TCP_PORTrerrr)r>rxr�r�r�r�r�r�rrrr!�objectr'rrrr�<module>s<	8FL`E(*PbO9ME__pycache__/config.cpython-38.pyc000064400000055272150327210150012660 0ustar00U

e5d��@sNdZddlZddlZddlZddlZddlZddlZddlZddlZddl	Z	ddl
mZmZdZ
ejZdad+dd�Zdd	�Zd
d�Zdd
�Zdd�Zdd�Zdd�Zdd�Ze�dej�Zdd�ZGdd�de�ZGdd�dee�Z Gdd�de!e�Z"Gdd �d e#e�Z$Gd!d"�d"e�Z%Gd#d$�d$e%�Z&e&Z'd%d&�Z(e
dfd'd(�Z)d)d*�Z*dS),a
Configuration functions for the logging package for Python. The core package
is based on PEP 282 and comments thereto in comp.lang.python, and influenced
by Apache's log4j system.

Copyright (C) 2001-2019 Vinay Sajip. All Rights Reserved.

To use, simply 'import logging' and log away!
�N)�ThreadingTCPServer�StreamRequestHandleriF#TcCs�ddl}t||j�r|}n*|�|�}t|d�r:|�|�n
|�|�t|�}t�	�z t�t||�}t
|||�W5t�
�XdS)aD
    Read the logging configuration from a ConfigParser-format file.

    This can be called several times from an application, allowing an end user
    the ability to select from various pre-canned configurations (if the
    developer provides a mechanism to present the choices and load the chosen
    configuration).
    rN�readline)�configparser�
isinstanceZRawConfigParserZConfigParser�hasattrZ	read_file�read�_create_formatters�logging�_acquireLock�_releaseLock�_clearExistingHandlers�_install_handlers�_install_loggers)Zfname�defaults�disable_existing_loggersr�cp�
formatters�handlers�r�&/usr/lib64/python3.8/logging/config.py�
fileConfig3s	



rc	Csl|�d�}|�d�}t|�}|D]F}|d|}zt||�}Wq tk
rdt|�t||�}Yq Xq |S)z)Resolve a dotted name to a global object.�.r)�split�pop�
__import__�getattr�AttributeError)�name�used�found�nrrr�_resolveUs

r"cCsttj|�S�N)�map�str�strip)Zalistrrr�
_strip_spacescsr'cCs�|dd}t|�siS|�d�}t|�}i}|D]v}d|}|j|dddd�}|j|d	ddd�}|j|d
ddd�}tj}||�d�}	|	r�t|	�}||||�}
|
||<q2|S)
zCreate and return formattersr�keys�,zformatter_%s�formatTN)�raw�fallback�datefmt�style�%�class)�lenrr'�getr
�	Formatterr")rZflistrZformZsectnameZfsZdfsZstl�c�
class_name�frrrr	fs$

r	c
Cs^|dd}t|�siS|�d�}t|�}i}g}|D�]}|d|}|d}|�dd�}zt|tt��}Wn ttfk
r�t	|�}YnX|�dd	�}	t|	tt��}	|�d
d�}
t|
tt��}
||	|
�}d|kr�|d}|�
|�t|�r�|�||�t|tj
j��r2|�d
d�}
t|
��r2|�||
f�|||<q6|D]\}}|�||��q@|S)zInstall and return handlersrr(r)z
handler_%sr0�	formatter��args�()�kwargsz{}�level�target)r1rr'r2�eval�varsr
r�	NameErrorr"�setLevel�setFormatter�
issubclassr�
MemoryHandler�appendZ	setTarget)rr�hlistrZfixups�hand�section�klass�fmtr9r;�hr<r=�trrrr|sB





rcCsTtj}|D]D}|jj|}||krHt|tj�sN|�tj�g|_d|_	q
||_
q
dS)a�
    When (re)configuring logging, handle loggers which were in the previous
    configuration but are not in the new configuration. There's no point
    deleting them as other threads may continue to hold references to them;
    and by disabling them, you stop them doing any logging.

    However, don't disable children of named loggers, as that's probably not
    what was intended by the user. Also, allow existing loggers to NOT be
    disabled if disable_existing is false.
    TN)r
�root�manager�
loggerDictrZPlaceHolderrAZNOTSETr�	propagate�disabled)�existing�
child_loggers�disable_existingrM�log�loggerrrr�_handle_existing_loggers�srWcCs|dd}|�d�}tt|��}|�d�|d}tj}|}d|krX|d}|�|�|jdd�D]}|�|�qf|d}	t	|	�r�|	�d�}	t|	�}	|	D]}
|�
||
�q�t|jj�
��}|��g}|D�](}|d	|}|d
}
|jddd
�}t�|
�}|
|k�rv|�|
�d}|
d}t	|�}t	|�}||k�rl||d|�|k�r`|�||�|d7}�q2|�|
�d|k�r�|d}|�|�|jdd�D]}|�|��q�||_d|_|d}	t	|	�r�|	�d�}	t|	�}	|	D]}
|�
||
��q�q�t|||�dS)zCreate and install loggers�loggersr(r)rMZlogger_rootr<Nrz	logger_%s�qualnamerP�)r,rr)r�listr'�remover
rMrAr�
removeHandlerr1�
addHandlerrNrOr(�sortZgetint�	getLogger�indexrErPrQrW)rrrTZllistrHrMrUr<rKrFrGrRrSZqnrPrV�i�prefixed�pflen�num_existingrrrr�sd











rcCs.tj��t�tjdd��tjdd�=dS)z!Clear and close existing handlersN)r
�	_handlers�clearZshutdownZ_handlerListrrrrr
s
r
z^[a-z_][a-z0-9_]*$cCst�|�}|std|��dS)Nz!Not a valid Python identifier: %rT)�
IDENTIFIER�match�
ValueError)�s�mrrr�valid_idents
rmc@s"eZdZdZddd�Zdd�ZdS)	�ConvertingMixinz?For ConvertingXXX's, this mixin class provides common functionsTcCsB|j�|�}||k	r>|r |||<t|�tttfkr>||_||_|Sr#)�configurator�convert�type�ConvertingDict�ConvertingList�ConvertingTuple�parent�key)�selfrv�value�replace�resultrrr�convert_with_key"s
�z ConvertingMixin.convert_with_keycCs0|j�|�}||k	r,t|�tttfkr,||_|Sr#)rorprqrrrsrtru)rwrxrzrrrrp.s
�zConvertingMixin.convertN)T)�__name__�
__module__�__qualname__�__doc__r{rprrrrrns
rnc@s,eZdZdZdd�Zd	dd�Zd
dd�ZdS)rrz A converting dictionary wrapper.cCst�||�}|�||�Sr#)�dict�__getitem__r{�rwrvrxrrrr�CszConvertingDict.__getitem__NcCst�|||�}|�||�Sr#)r�r2r{�rwrv�defaultrxrrrr2GszConvertingDict.getcCst�|||�}|j||dd�S�NF)ry)r�rr{r�rrrrKszConvertingDict.pop)N)N)r|r}r~rr�r2rrrrrrr@s
rrc@s"eZdZdZdd�Zddd�ZdS)	rszA converting list wrapper.cCst�||�}|�||�Sr#)r[r�r{r�rrrr�QszConvertingList.__getitem__���cCst�||�}|�|�Sr#)r[rrp)rw�idxrxrrrrUszConvertingList.popN)r�)r|r}r~rr�rrrrrrsOsrsc@seZdZdZdd�ZdS)rtzA converting tuple wrapper.cCst�||�}|j||dd�Sr�)�tupler�r{r�rrrr�[szConvertingTuple.__getitem__N)r|r}r~rr�rrrrrtYsrtc@s�eZdZdZe�d�Ze�d�Ze�d�Ze�d�Z	e�d�Z
ddd	�Zee
�Zd
d�Zdd
�Zdd�Zdd�Zdd�Zdd�Zdd�ZdS)�BaseConfiguratorzI
    The configurator base class which defines some useful defaults.
    z%^(?P<prefix>[a-z]+)://(?P<suffix>.*)$z^\s*(\w+)\s*z^\.\s*(\w+)\s*z^\[\s*(\w+)\s*\]\s*z^\d+$�ext_convert�cfg_convert)ZextZcfgcCst|�|_||j_dSr#)rr�configro)rwr�rrr�__init__ts
zBaseConfigurator.__init__c		Cs�|�d�}|�d�}z^|�|�}|D]H}|d|7}zt||�}Wq$tk
rj|�|�t||�}Yq$Xq$|WStk
r�t��dd�\}}td||f�}|||_	|_
|�YnXdS)z`
        Resolve strings to objects using standard import and attribute
        syntax.
        rrrZNzCannot resolve %r: %s)rr�importerrr�ImportError�sys�exc_inforj�	__cause__�
__traceback__)	rwrkrrr Zfrag�e�tb�vrrr�resolvexs"



zBaseConfigurator.resolvecCs
|�|�S)z*Default converter for the ext:// protocol.)r��rwrxrrrr��szBaseConfigurator.ext_convertcCs�|}|j�|�}|dkr&td|��n�||��d�}|j|��d}|r�|j�|�}|rn||��d}nd|j�|�}|r�|��d}|j�|�s�||}n2zt	|�}||}Wnt
k
r�||}YnX|r�||��d�}qHtd||f��qH|S)z*Default converter for the cfg:// protocol.NzUnable to convert %rrzUnable to convert %r at %r)�WORD_PATTERNrirj�endr��groups�DOT_PATTERN�
INDEX_PATTERN�
DIGIT_PATTERN�int�	TypeError)rwrx�restrl�dr�r!rrrr��s4
�zBaseConfigurator.cfg_convertcCs�t|t�s$t|t�r$t|�}||_n�t|t�sHt|t�rHt|�}||_n�t|t�svt|t�rvt|d�svt|�}||_nVt|t	�r�|j
�|�}|r�|��}|d}|j
�|d�}|r�|d}t||�}||�}|S)z�
        Convert values to an appropriate type. dicts, lists and tuples are
        replaced by their converting alternatives. Strings are checked to
        see if they have a conversion format and are converted if they do.
        �_fields�prefixN�suffix)rrrr�rorsr[rtr�rr%�CONVERT_PATTERNri�	groupdict�value_convertersr2r)rwrxrlr�r�Z	converterr�rrrrp�s0
��

zBaseConfigurator.convertcsj��d�}t|�s|�|�}��dd�}�fdd��D�}|f|�}|rf|��D]\}}t|||�qP|S)z1Configure an object with a user-supplied factory.r:rNcsi|]}t|�r|�|�qSr�rm��.0�k�r�rr�
<dictcomp>�sz5BaseConfigurator.configure_custom.<locals>.<dictcomp>)r�callabler��items�setattr)rwr�r4�propsr;rzrrxrr�r�configure_custom�s


z!BaseConfigurator.configure_customcCst|t�rt|�}|S)z0Utility function which converts lists to tuples.)rr[r�r�rrr�as_tuple�s
zBaseConfigurator.as_tupleN)r|r}r~r�re�compiler�r�r�r�r�r��staticmethodrr�r�r�r�r�rpr�r�rrrrr�`s"




�"r�c@s^eZdZdZdd�Zdd�Zdd�Zdd	�Zd
d�Zdd
�Z	ddd�Z
ddd�Zddd�ZdS)�DictConfiguratorz]
    Configure logging using a dictionary-like object to describe the
    configuration.
    cCs�|j}d|krtd��|ddkr2td|d��|�dd�}i}t���zn|�r�|�d|�}|D]�}|tjkr�td|��qdz6tj|}||}|�d	d
�}|r�|�t�	|��Wqdt
k
r�}	ztd|�|	�W5d
}	~	XYqdXqd|�d|�}
|
D]N}z|�||
|d
�Wq�t
k
�rF}	ztd|�|	�W5d
}	~	XYq�Xq�|�dd
�}|�r�z|�|d
�Wn.t
k
�r�}	ztd�|	�W5d
}	~	XYnX�n|�dd
�}t
�|�d|�}
|
D]P}z|�|
|�|
|<Wn2t
k
�r}	ztd|�|	�W5d
}	~	XYnX�q�|�d|�}|D]P}z|�||�||<Wn2t
k
�rp}	ztd|�|	�W5d
}	~	XYnX�q$|�d|�}g}t|�D]v}z |�||�}||_|||<WnNt
k
�r}	z.dt|	j�k�r�|�|�ntd|�|	�W5d
}	~	XYnX�q�|D]Z}z |�||�}||_|||<Wn2t
k
�r`}	ztd|�|	�W5d
}	~	XYnX�q
tj}t|jj���}|��g}|�d|�}
|
D]�}||k�r|�|�d}|d}t|�}t|�}||k�r||d
|�|k�r�|�||�|d7}�q�|�|�z|�||
|�Wn2t
k
�rV}	ztd|�|	�W5d
}	~	XYnX�q�t|||�|�dd
�}|�r�z|�|�Wn.t
k
�r�}	ztd�|	�W5d
}	~	XYnXW5t��Xd
S)zDo the configuration.�versionz$dictionary doesn't specify a versionrZzUnsupported version: %s�incrementalFrzNo handler found with name %rr<NzUnable to configure handler %rrXTzUnable to configure logger %rrMzUnable to configure root loggerrrz Unable to configure formatter %r�filterszUnable to configure filter %r�target not configured yetr) r�rjrr
rrr2rfrA�_checkLevel�	Exception�configure_logger�configure_rootr
�configure_formatter�configure_filter�sorted�configure_handlerrr%r�rErMr[rNrOr(r_rar1r\rW)rwr�r�Z
EMPTY_DICTrr�handlerZhandler_configr<r�rXrMrTrr�ZdeferredrRrSrbrcrdrerrr�	configure�s
�
��������������



����zDictConfigurator.configurec

Cs�d|krr|d}z|�|�}Wq�tk
rn}z2dt|�kr>�|�d�|d<||d<|�|�}W5d}~XYq�Xnl|�dd�}|�dd�}|�dd�}|�d	d�}|s�tj}	nt|�}	d
|kr�|	||||d
�}n|	|||�}|S)z(Configure a formatter from a dictionary.r:z'format'r*rJNr-r.r/r0Zvalidate)r�r�r%rr2r
r3r")
rwr��factoryrz�terJZdfmtr.�cnamer4rrrr��s*z$DictConfigurator.configure_formattercCs.d|kr|�|�}n|�dd�}t�|�}|S)z%Configure a filter from a dictionary.r:rr8)r�r2r
ZFilter)rwr�rzrrrrr��s

z!DictConfigurator.configure_filtercCsX|D]N}z|�|jd|�Wqtk
rP}ztd|�|�W5d}~XYqXqdS)z/Add filters to a filterer from a list of names.r�zUnable to add filter %rN)Z	addFilterr�r�rj)rwZfiltererr�r6r�rrr�add_filters�s
zDictConfigurator.add_filtersc
s�t��}��dd�}|r\z|jd|}Wn0tk
rZ}ztd|�|�W5d}~XYnX��dd�}��dd�}d�kr���d�}t|�s�|�|�}|}�n��d�}	|�|	�}
t|
tj	j
��rFd	�k�rFz>|jd
�d	}t|tj��s��
|�td��|�d	<Wn6tk
�rB}ztd�d	�|�W5d}~XYnXnZt|
tj	j��rtd
�k�rt|��d
��d
<n,t|
tj	j��r�d�k�r�|��d��d<|
}��dd�}�fdd��D�}
z|f|
�}WnLtk
�r}z,dt|�k�r�|
�d�|
d<|f|
�}W5d}~XYnX|�r.|�|�|dk	�rH|�t�|��|�rZ|�||�|�r�|��D]\}}t|||��qh|S)z&Configure a handler from a dictionary.r7NrzUnable to set formatter %rr<r�r:r0r=rr�zUnable to set target handler %rZmailhostZaddressrcsi|]}t|�r|�|�qSrr�r�r�rrr��sz6DictConfigurator.configure_handler.<locals>.<dictcomp>z'stream'�streamZstrm)r�rr�r�rjr�r�rCr
rrDrZHandler�updater�ZSMTPHandlerr�Z
SysLogHandlerr%rBrAr�r�r�r�)rwr�Zconfig_copyr7r�r<r�r4r�r�rIZthr�r;rzr�rrxrr�rr��s~��



�
����

z"DictConfigurator.configure_handlercCsX|D]N}z|�|jd|�Wqtk
rP}ztd|�|�W5d}~XYqXqdS)z.Add handlers to a logger from a list of names.rzUnable to add handler %rN)r^r�r�rj)rwrVrrKr�rrr�add_handlers�s
zDictConfigurator.add_handlersFcCs�|�dd�}|dk	r$|�t�|��|s~|jdd�D]}|�|�q6|�dd�}|rb|�||�|�dd�}|r~|�||�dS)zU
        Perform configuration which is common to root and non-root loggers.
        r<Nrr�)r2rAr
r�rr]r�r�)rwrVr�r�r<rKrr�rrr�common_logger_configsz%DictConfigurator.common_logger_configcCs6t�|�}|�|||�|�dd�}|dk	r2||_dS)z.Configure a non-root logger from a dictionary.rPN)r
r`r�r2rP)rwrr�r�rVrPrrrr�s

z!DictConfigurator.configure_loggercCst��}|�|||�dS)z*Configure a root logger from a dictionary.N)r
r`r�)rwr�r�rMrrrr�szDictConfigurator.configure_rootN)F)F)F)
r|r}r~rr�r�r�r�r�r�r�r�r�rrrrr��s$	?

r�cCst|���dS)z%Configure logging using a dictionary.N)�dictConfigClassr�r�rrr�
dictConfig&sr�csDGdd�dt�}Gdd�dt�}G�fdd�dtj���||||�S)au
    Start up a socket server on the specified port, and listen for new
    configurations.

    These will be sent as a file suitable for processing by fileConfig().
    Returns a Thread object on which you can call start() to start the server,
    and which you can join() when appropriate. To stop the server, call
    stopListening().

    Use the ``verify`` argument to verify any bytes received across the wire
    from a client. If specified, it should be a callable which receives a
    single argument - the bytes of configuration data received across the
    network - and it should return either ``None``, to indicate that the
    passed in bytes could not be verified and should be discarded, or a
    byte string which is then passed to the configuration machinery as
    normal. Note that you can return transformed bytes, e.g. by decrypting
    the bytes passed in.
    c@seZdZdZdd�ZdS)z#listen.<locals>.ConfigStreamHandlerz�
        Handler for a logging configuration request.

        It expects a completely new logging configuration and uses fileConfig
        to install it.
        cSsV�z|j}|�d�}t|�dk�rt�d|�d}|j�|�}t|�|krb||�|t|��}q>|jjdk	rz|j�|�}|dk	�r|�d�}z,ddl}|�	|�}t
|t�s�t�t
|�WnJtk
�rt�|�}zt|�Wntk
r�t��YnXYnX|jj�r|jj��Wn2tk
�rP}z|jtk�r@�W5d}~XYnXdS)z�
            Handle a request.

            Each request is expected to be a 4-byte length, packed using
            struct.pack(">L", n), followed by the config file.
            Uses fileConfig() to do the grunt work.
            �z>LrNzutf-8)Z
connectionZrecvr1�structZunpack�server�verify�decode�json�loadsrr��AssertionErrorr�r��io�StringIOr�	traceback�	print_exc�ready�set�OSError�errno�RESET_ERROR)rwZconn�chunkZslenr�r��filer�rrr�handleFs8





z*listen.<locals>.ConfigStreamHandler.handleN)r|r}r~rr�rrrr�ConfigStreamHandler?sr�c@s0eZdZdZdZdedddfdd�Zdd�ZdS)	z$listen.<locals>.ConfigSocketReceiverzD
        A simple TCP socket-based logging config receiver.
        rZZ	localhostNcSs>t�|||f|�t��d|_t��d|_||_||_dS)NrrZ)	rr�r
r�abortr�timeoutr�r�)rwZhost�portr�r�r�rrrr�tsz-listen.<locals>.ConfigSocketReceiver.__init__cSs`ddl}d}|sT|�|j��ggg|j�\}}}|r<|��t��|j}t��q|�	�dS)Nr)
�selectZsocket�filenor�Zhandle_requestr
rr�rZserver_close)rwr�r�ZrdZwrZexrrr�serve_until_stopped~s�

z8listen.<locals>.ConfigSocketReceiver.serve_until_stopped)r|r}r~rZallow_reuse_address�DEFAULT_LOGGING_CONFIG_PORTr�r�rrrr�ConfigSocketReceiverms�

r�cs&eZdZ��fdd�Zdd�Z�ZS)zlisten.<locals>.Servercs4t�|���||_||_||_||_t��|_dSr#)	�superr��rcvr�hdlrr�r��	threadingZEventr�)rwr�r�r�r�)�Server�	__class__rrr��szlisten.<locals>.Server.__init__cSsZ|j|j|j|j|jd�}|jdkr0|jd|_|j��t��|a	t�
�|��dS)N)r�r�r�r�rrZ)r�r�r�r�r�Zserver_addressr�r
r�	_listenerrr�)rwr�rrr�run�s�

zlisten.<locals>.Server.run)r|r}r~r�r��
__classcell__r�r�)r�rr��sr�)rrr�ZThread)r�r�r�r�rr�r�listen+s.r�cCs*t��ztrdt_daW5t��XdS)zN
    Stop the listening server which was created with a call to listen().
    rZN)r
rrr�r�rrrr�
stopListening�sr�)NT)+rr�r�r
Zlogging.handlersr�r�r�r�r�Zsocketserverrrr�Z
ECONNRESETr�r�rr"r'r	rrWrr
r��Irhrm�objectrnr�rrr[rsr�rtr�r�r�r�r�r�rrrr�<module>sH

"%W!
Az__pycache__/handlers.cpython-38.pyc000064400000124300150327210150013200 0ustar00U

e5dq��@szdZddlZddlZddlZddlZddlZddlZddlZddlm	Z	m
Z
mZddlZddl
Z
ddlZdZdZdZdZdZdZd	ZGd
d�dej�ZGdd
�d
e�ZGdd�de�ZGdd�dej�ZGdd�dej�ZGdd�de�ZGdd�dej�ZGdd�dej�ZGdd�dej�Z Gdd�dej�Z!Gdd�dej�Z"Gd d!�d!e"�Z#Gd"d#�d#ej�Z$Gd$d%�d%e%�Z&dS)&z�
Additional handlers for the logging package for Python. The core package is
based on PEP 282 and comments thereto in comp.lang.python.

Copyright (C) 2001-2016 Vinay Sajip. All Rights Reserved.

To use, simply 'import logging.handlers' and log away!
�N)�ST_DEV�ST_INO�ST_MTIMEi<#i=#i>#i?#i�Qc@s2eZdZdZddd�Zdd�Zdd	�Zd
d�ZdS)
�BaseRotatingHandlerz�
    Base class for handlers that rotate log files at a certain point.
    Not meant to be instantiated directly.  Instead, use RotatingFileHandler
    or TimedRotatingFileHandler.
    NFcCs0tj�|||||�||_||_d|_d|_dS)zA
        Use the specified filename for streamed logging
        N)�logging�FileHandler�__init__�mode�encoding�namer�rotator��self�filenamer
r�delay�r�(/usr/lib64/python3.8/logging/handlers.pyr	3s
zBaseRotatingHandler.__init__cCsHz$|�|�r|��tj�||�Wntk
rB|�|�YnXdS)z�
        Emit a record.

        Output the record to the file, catering for rollover as described
        in doRollover().
        N)�shouldRollover�
doRolloverrr�emit�	Exception�handleError�r�recordrrrr=s
zBaseRotatingHandler.emitcCst|j�s|}n
|�|�}|S)a�
        Modify the filename of a log file when rotating.

        This is provided so that a custom filename can be provided.

        The default implementation calls the 'namer' attribute of the
        handler, if it's callable, passing the default name to
        it. If the attribute isn't callable (the default is None), the name
        is returned unchanged.

        :param default_name: The default name for the log file.
        )�callabler)rZdefault_name�resultrrr�rotation_filenameKs

z%BaseRotatingHandler.rotation_filenamecCs4t|j�s$tj�|�r0t�||�n|�||�dS)aL
        When rotating, rotate the current log.

        The default implementation calls the 'rotator' attribute of the
        handler, if it's callable, passing the source and dest arguments to
        it. If the attribute isn't callable (the default is None), the source
        is simply renamed to the destination.

        :param source: The source filename. This is normally the base
                       filename, e.g. 'test.log'
        :param dest:   The destination filename. This is normally
                       what the source is rotated to, e.g. 'test.log.1'.
        N)rr
�os�path�exists�rename)r�source�destrrr�rotate^s
zBaseRotatingHandler.rotate)NF)�__name__�
__module__�__qualname__�__doc__r	rrr$rrrrr-s


rc@s*eZdZdZddd�Zdd	�Zd
d�ZdS)
�RotatingFileHandlerz�
    Handler for logging to a set of files, which switches from one file
    to the next when the current file reaches a certain size.
    �arNFcCs.|dkrd}t�|||||�||_||_dS)a�
        Open the specified file and use it as the stream for logging.

        By default, the file grows indefinitely. You can specify particular
        values of maxBytes and backupCount to allow the file to rollover at
        a predetermined size.

        Rollover occurs whenever the current log file is nearly maxBytes in
        length. If backupCount is >= 1, the system will successively create
        new files with the same pathname as the base file, but with extensions
        ".1", ".2" etc. appended to it. For example, with a backupCount of 5
        and a base file name of "app.log", you would get "app.log",
        "app.log.1", "app.log.2", ... through to "app.log.5". The file being
        written to is always "app.log" - when it gets filled up, it is closed
        and renamed to "app.log.1", and if files "app.log.1", "app.log.2" etc.
        exist, then they are renamed to "app.log.2", "app.log.3" etc.
        respectively.

        If maxBytes is zero, rollover never occurs.
        rr*N)rr	�maxBytes�backupCount)rrr
r+r,rrrrrr	xs
zRotatingFileHandler.__init__cCs�|jr|j��d|_|jdkr�t|jddd�D]^}|�d|j|f�}|�d|j|df�}tj�|�r2tj�|�r�t�	|�t�
||�q2|�|jd�}tj�|�r�t�	|�|�|j|�|js�|�
�|_dS)z<
        Do a rollover, as described in __init__().
        Nr����z%s.%dz.1)�stream�closer,�ranger�baseFilenamerrr �remover!r$r�_open)r�iZsfn�dfnrrrr�s&


�

zRotatingFileHandler.doRollovercCsZ|jdkr|��|_|jdkrVd|�|�}|j�dd�|j��t|�|jkrVdSdS)z�
        Determine if rollover should occur.

        Basically, see if the supplied record would cause the file to exceed
        the size limit we have.
        Nrz%s
�r-)r/r4r+�format�seek�tell�len�rr�msgrrrr�s


z"RotatingFileHandler.shouldRollover)r*rrNF)r%r&r'r(r	rrrrrrr)ss
 r)c@s:eZdZdZddd�Zd	d
�Zdd�Zd
d�Zdd�ZdS)�TimedRotatingFileHandlerz�
    Handler for logging to a file, rotating the log file at certain timed
    intervals.

    If backupCount is > 0, when rollover is done, no more than backupCount
    files are kept - the oldest ones are deleted.
    �hr-rNFc	
Cs�t�||d||�|��|_||_||_||_|jdkrLd|_d|_d|_	n�|jdkrjd|_d|_d	|_	n�|jd
kr�d|_d|_d
|_	n�|jdks�|jdkr�d|_d|_d|_	n�|j�
d��r*d|_t|j�dkr�td|j��|jddks�|jddk�rtd|j��t
|jd�|_d|_d|_	ntd|j��t�|j	tj�|_	|j||_|j}tj�|��rzt�|�t}	nt
t���}	|�|	�|_dS)Nr*�Sr-z%Y-%m-%d_%H-%M-%Sz-^\d{4}-\d{2}-\d{2}_\d{2}-\d{2}-\d{2}(\.\w+)?$�M�<z%Y-%m-%d_%H-%Mz'^\d{4}-\d{2}-\d{2}_\d{2}-\d{2}(\.\w+)?$�H�z%Y-%m-%d_%Hz!^\d{4}-\d{2}-\d{2}_\d{2}(\.\w+)?$�D�MIDNIGHTrz%Y-%m-%dz^\d{4}-\d{2}-\d{2}(\.\w+)?$�Wi�:	r7zHYou must specify a day for weekly rollover from 0 to 6 (0 is Monday): %s�0�6z-Invalid day specified for weekly rollover: %sz'Invalid rollover interval specified: %s)rr	�upper�whenr,�utc�atTime�interval�suffix�extMatch�
startswithr;�
ValueError�int�	dayOfWeek�re�compile�ASCIIr2rrr �statr�time�computeRollover�
rolloverAt)
rrrKrNr,rrrLrM�trrrr	�sL



z!TimedRotatingFileHandler.__init__cCsd||j}|jdks"|j�d��r`|jr4t�|�}n
t�|�}|d}|d}|d}|d}|jdkrnt}n |jj	d|jj
d|jj}||d|d|}	|	d	kr�|	t7}	|d
d}||	}|j�d��r`|}
|
|jk�r`|
|jkr�|j|
}nd|
|jd
}||d}|j�s\|d
}
t�|�d
}|
|k�r\|
�sPd}nd}||7}|}|S)zI
        Work out the rollover time based on the specified time.
        rFrG����NrBrr-�rr.���rD)
rNrKrQrLrY�gmtime�	localtimerM�	_MIDNIGHTZhourZminute�secondrT)r�currentTimerr\ZcurrentHourZ
currentMinuteZ
currentSecondZ
currentDayZ	rotate_ts�rZdayZ
daysToWait�
newRolloverAt�dstNow�
dstAtRollover�addendrrrrZsL


��

z(TimedRotatingFileHandler.computeRollovercCstt���}||jkrdSdS)z�
        Determine if rollover should occur.

        record is not used, as we are just comparing times, but it is needed so
        the method signatures are the same
        r-r)rSrYr[)rrr\rrrrIs
z'TimedRotatingFileHandler.shouldRolloverc	Cs�tj�|j�\}}t�|�}g}|d}t|�}|D]@}|d|�|kr4||d�}|j�|�r4|�tj�	||��q4t|�|j
kr�g}n|��|dt|�|j
�}|S)z�
        Determine the files to delete when rolling over.

        More specific than the earlier method, which just used glob.glob().
        �.N)rr�splitr2�listdirr;rP�match�append�joinr,�sort)	rZdirNameZbaseNameZ	fileNamesr�prefixZplenZfileNamerOrrr�getFilesToDeleteUs
z)TimedRotatingFileHandler.getFilesToDeletecCsv|jr|j��d|_tt���}t�|�d}|j|j}|jrNt�|�}n6t�|�}|d}||kr�|rrd}nd}t�||�}|�	|j
dt�|j|��}t
j�|�r�t
�|�|�|j
|�|jdkr�|��D]}t
�|�q�|js�|��|_|�|�}	|	|k�r|	|j}	�q|jdk�s4|j�d��rl|j�slt�|	�d}
||
k�rl|�s`d}nd}|	|7}	|	|_dS)	ax
        do a rollover; in this case, a date/time stamp is appended to the filename
        when the rollover happens.  However, you want the file to be named for the
        start of the interval, not the current time.  If there is a backup count,
        then we have to get a list of matching filenames, sort them and remove
        the one with the oldest suffix.
        Nr.rDrbrmrrFrG)r/r0rSrYrdr[rNrLrcrr2�strftimerOrrr r3r$r,rurr4rZrKrQ)rrgrjr\Z	timeTupleZdstThenrlr6�srirkrrrrlsJ

�




"
z#TimedRotatingFileHandler.doRollover)r?r-rNFFN)	r%r&r'r(r	rZrrurrrrrr>�s
9Ir>c@s2eZdZdZd
dd�Zdd�Zd	d
�Zdd�ZdS)�WatchedFileHandlera�
    A handler for logging to a file, which watches the file
    to see if it has changed while in use. This can happen because of
    usage of programs such as newsyslog and logrotate which perform
    log file rotation. This handler, intended for use under Unix,
    watches the file to see if it has changed since the last emit.
    (A file has changed if its device or inode have changed.)
    If it has changed, the old file stream is closed, and the file
    opened to get a new stream.

    This handler is not appropriate for use under Windows, because
    under Windows open files cannot be moved or renamed - logging
    opens the files with exclusive locks - and so there is no need
    for such a handler. Furthermore, ST_INO is not supported under
    Windows; stat always returns zero for this value.

    This handler is based on a suggestion and patch by Chad J.
    Schroeder.
    r*NFcCs,tj�|||||�d\|_|_|��dS)N)r.r.)rrr	�dev�ino�_statstreamrrrrr	�szWatchedFileHandler.__init__cCs0|jr,t�|j���}|t|t|_|_dS�N)r/r�fstat�filenorrryrz�rZsresrrrr{�szWatchedFileHandler._statstreamcCs�zt�|j�}Wntk
r(d}YnX|rJ|t|jksJ|t|jkr�|jdk	r�|j�	�|j�
�d|_|��|_|��dS)z�
        Reopen log file if needed.

        Checks if the underlying file has changed, and if it
        has, close the old stream and reopen the file to get the
        current stream.
        N)
rrXr2�FileNotFoundErrorrryrrzr/�flushr0r4r{rrrr�reopenIfNeeded�s
 



z!WatchedFileHandler.reopenIfNeededcCs|��tj�||�dS)z�
        Emit a record.

        If underlying file has changed, reopen the file before emitting the
        record to it.
        N)r�rrrrrrrr�szWatchedFileHandler.emit)r*NF)r%r&r'r(r	r{r�rrrrrrx�s

rxc@sReZdZdZdd�Zddd�Zdd�Zd	d
�Zdd�Zd
d�Z	dd�Z
dd�ZdS)�
SocketHandlera
    A handler class which writes logging records, in pickle format, to
    a streaming socket. The socket is kept open across logging calls.
    If the peer resets it, an attempt is made to reconnect on the next call.
    The pickle which is sent is that of the LogRecord's attribute dictionary
    (__dict__), so that the receiver does not need to have the logging module
    installed in order to process the logging event.

    To unpickle the record at the receiving end into a LogRecord, use the
    makeLogRecord function.
    cCsZtj�|�||_||_|dkr(||_n
||f|_d|_d|_d|_d|_	d|_
d|_dS)a
        Initializes the handler with a specific host address and port.

        When the attribute *closeOnError* is set to True - if a socket error
        occurs, the socket is silently closed and then reopened on the next
        logging call.
        NFg�?g>@g@)r�Handlerr	�host�port�address�sock�closeOnError�	retryTime�
retryStart�retryMax�retryFactor�rr�r�rrrr	�s
zSocketHandler.__init__r-cCsj|jdk	rtj|j|d�}nJt�tjtj�}|�|�z|�|j�Wntk
rd|�	��YnX|S)zr
        A factory method which allows subclasses to define the precise
        type of socket they want.
        N��timeout)
r��socketZcreate_connectionr��AF_UNIX�SOCK_STREAMZ
settimeout�connect�OSErrorr0)rr�rrrr�
makeSocket	s

zSocketHandler.makeSocketcCs�t��}|jdkrd}n
||jk}|r�z|��|_d|_WnVtk
r�|jdkr^|j|_n"|j|j|_|j|jkr�|j|_||j|_YnXdS)z�
        Try to create a socket, using an exponential backoff with
        a max retry time. Thanks to Robert Olson for the original patch
        (SF #815911) which has been slightly refactored.
        NT)	rYr�r�r�r�r�ZretryPeriodr�r�)rZnowZattemptrrr�createSockets





zSocketHandler.createSocketcCsR|jdkr|��|jrNz|j�|�Wn$tk
rL|j��d|_YnXdS)z�
        Send a pickled string to the socket.

        This function allows for partial sends which can happen when the
        network is busy.
        N)r�r��sendallr�r0�rrwrrr�send6s

zSocketHandler.sendcCsj|j}|r|�|�}t|j�}|��|d<d|d<d|d<|�dd�t�|d�}t�	dt
|��}||S)z�
        Pickles the record in binary format with a length prefix, and
        returns it ready for transmission across the socket.
        r=N�args�exc_info�messager-z>L)r�r8�dict�__dict__Z
getMessage�pop�pickle�dumps�structZpackr;)rrZeiZdummy�drwZslenrrr�
makePickleIs

zSocketHandler.makePicklecCs0|jr|jr|j��d|_ntj�||�dS)z�
        Handle an error during logging.

        An error has occurred during logging. Most likely cause -
        connection lost. Close the socket so that we can retry on the
        next event.
        N)r�r�r0rr�rrrrrr_s
zSocketHandler.handleErrorcCs<z|�|�}|�|�Wntk
r6|�|�YnXdS)a
        Emit a record.

        Pickles the record and writes it to the socket in binary format.
        If there is an error with the socket, silently drop the packet.
        If there was a problem with the socket, re-establishes the
        socket.
        N)r�r�rr)rrrwrrrrms
	
zSocketHandler.emitcCs@|��z(|j}|r"d|_|��tj�|�W5|��XdS�z$
        Closes the socket.
        N)�acquire�releaser�r0rr�)rr�rrrr0|szSocketHandler.closeN)r-)r%r&r'r(r	r�r�r�r�rrr0rrrrr��s
r�c@s(eZdZdZdd�Zdd�Zdd�ZdS)	�DatagramHandlera�
    A handler class which writes logging records, in pickle format, to
    a datagram socket.  The pickle which is sent is that of the LogRecord's
    attribute dictionary (__dict__), so that the receiver does not need to
    have the logging module installed in order to process the logging event.

    To unpickle the record at the receiving end into a LogRecord, use the
    makeLogRecord function.

    cCst�|||�d|_dS)zP
        Initializes the handler with a specific host address and port.
        FN)r�r	r�r�rrrr	�szDatagramHandler.__init__cCs*|jdkrtj}ntj}t�|tj�}|S)zu
        The factory method of SocketHandler is here overridden to create
        a UDP socket (SOCK_DGRAM).
        N)r�r�r�ZAF_INET�
SOCK_DGRAM)rZfamilyrwrrrr��s

zDatagramHandler.makeSocketcCs&|jdkr|��|j�||j�dS)z�
        Send a pickled string to a socket.

        This function no longer allows for partial sends which can happen
        when the network is busy - UDP does not guarantee delivery and
        can deliver packets out of sequence.
        N)r�r��sendtor�r�rrrr��s
zDatagramHandler.sendN)r%r&r'r(r	r�r�rrrrr��s
r�c@s"eZdZdZdZdZdZdZdZdZ	dZ
d	ZdZdZ
dZdZdZdZdZd	Zd
ZdZdZd
ZdZdZdZdZdZdZdZdZeeeeeeee
e	eeed�Z eeeeeeeeeeee
eeeeeeeeed�Z!dddddd�Z"de#fe
dfd d!�Z$d"d#�Z%d$d%�Z&d&d'�Z'd(d)�Z(d*Z)d+Z*d,d-�Z+dS).�
SysLogHandlera
    A handler class which sends formatted logging records to a syslog
    server. Based on Sam Rushing's syslog module:
    http://www.nightmare.com/squirl/python-ext/misc/syslog.py
    Contributed by Nicolas Untz (after which minor refactoring changes
    have been made).
    rr-r7r]r^r_r`ra��	�
���������)ZalertZcrit�critical�debugZemerg�err�error�infoZnoticeZpanic�warn�warning)ZauthZauthprivZcron�daemonZftpZkernZlprZmailZnewsZsecurityZsyslog�userZuucpZlocal0Zlocal1Zlocal2Zlocal3Zlocal4Zlocal5Zlocal6Zlocal7r�r�r�r�r�)�DEBUG�INFO�WARNING�ERROR�CRITICALZ	localhostNcCs4tj�|�||_||_||_t|t�rTd|_z|�	|�Wnt
k
rPYnXn�d|_|dkrhtj}|\}}t�
||d|�}|s�t
d��|D]�}|\}}}	}
}d}}
z.t�|||	�}
|tjkr�|
�|�W�qWq�t
k
�r}z|}|
dk	�r|
��W5d}~XYq�Xq�|dk	�r$|�|
|_||_dS)a
        Initialize a handler.

        If address is specified as a string, a UNIX socket is used. To log to a
        local syslogd, "SysLogHandler(address="/dev/log")" can be used.
        If facility is not specified, LOG_USER is used. If socktype is
        specified as socket.SOCK_DGRAM or socket.SOCK_STREAM, that specific
        socket type will be used. For Unix sockets, you can also specify a
        socktype of None, in which case socket.SOCK_DGRAM will be used, falling
        back to socket.SOCK_STREAM.
        TFNrz!getaddrinfo returns an empty list)rr�r	r��facility�socktype�
isinstance�str�
unixsocket�_connect_unixsocketr�r�r�Zgetaddrinfor�r�r0)rr�r�r�r�r�Zress�resZaf�proto�_Zsar�r��excrrrr	sB





zSysLogHandler.__init__cCs�|j}|dkrtj}t�tj|�|_z|j�|�||_Wnxtk
r�|j��|jdk	r`�tj}t�tj|�|_z|j�|�||_Wn tk
r�|j���YnXYnXdSr|)r�r�r�r�r�r�r0r�)rr�Zuse_socktyperrrr�Qs&




z!SysLogHandler._connect_unixsocketcCs4t|t�r|j|}t|t�r(|j|}|d>|BS)z�
        Encode the facility and priority. You can pass in strings or
        integers - if strings are passed, the facility_names and
        priority_names mapping dictionaries are used to convert them to
        integers.
        r])r�r��facility_names�priority_names)rr�Zpriorityrrr�encodePriorityis




zSysLogHandler.encodePrioritycCs2|��z|j��tj�|�W5|��XdSr�)r�r�r�r0rr��rrrrr0vs

zSysLogHandler.closecCs|j�|d�S)aK
        Map a logging level name to a key in the priority_names map.
        This is useful in two scenarios: when custom levels are being
        used, and in the case where you can't do a straightforward
        mapping by lowercasing the logging level name because of locale-
        specific issues (see SF #1524081).
        r�)�priority_map�get)rZ	levelNamerrr�mapPriority�szSysLogHandler.mapPriority�TcCsz�|�|�}|jr|j|}|jr*|d7}d|�|j|�|j��}|�d�}|�d�}||}|jr�z|j	�
|�Wq�tk
r�|j	��|�
|j�|j	�
|�Yq�Xn*|jt	jkr�|j	�||j�n|j	�|�Wntk
r�|�|�YnXdS)z�
        Emit a record.

        The record is formatted, and then sent to the syslog server. If
        exception information is present, it is NOT sent to the server.
        �z<%d>�utf-8N)r8�ident�
append_nulr�r�r�Z	levelname�encoder�r�r�r�r0r�r�r�r�r�r�rr)rrr=Zpriorrrr�s0



�


zSysLogHandler.emit),r%r&r'r(Z	LOG_EMERGZ	LOG_ALERTZLOG_CRITZLOG_ERRZLOG_WARNINGZ
LOG_NOTICEZLOG_INFOZ	LOG_DEBUGZLOG_KERNZLOG_USERZLOG_MAILZ
LOG_DAEMONZLOG_AUTHZ
LOG_SYSLOGZLOG_LPRZLOG_NEWSZLOG_UUCPZLOG_CRONZLOG_AUTHPRIVZLOG_FTPZ
LOG_LOCAL0Z
LOG_LOCAL1Z
LOG_LOCAL2Z
LOG_LOCAL3Z
LOG_LOCAL4Z
LOG_LOCAL5Z
LOG_LOCAL6Z
LOG_LOCAL7r�r�r��SYSLOG_UDP_PORTr	r�r�r0r�r�r�rrrrrr��s�����
6

r�c@s*eZdZdZd
dd�Zdd�Zdd	�ZdS)�SMTPHandlerzK
    A handler class which sends an SMTP email for each logging event.
    N�@cCs�tj�|�t|ttf�r(|\|_|_n|d|_|_t|ttf�rR|\|_|_	nd|_||_
t|t�rn|g}||_||_
||_||_dS)ax
        Initialize the handler.

        Initialize the instance with the from and to addresses and subject
        line of the email. To specify a non-standard SMTP port, use the
        (host, port) tuple format for the mailhost argument. To specify
        authentication credentials, supply a (username, password) tuple
        for the credentials argument. To specify the use of a secure
        protocol (TLS), pass in a tuple for the secure argument. This will
        only be used when authentication credentials are supplied. The tuple
        will be either an empty tuple, or a single-value tuple with the name
        of a keyfile, or a 2-value tuple with the names of the keyfile and
        certificate file. (This tuple is passed to the `starttls` method).
        A timeout in seconds can be specified for the SMTP connection (the
        default is one second).
        N)rr�r	r��list�tuple�mailhost�mailport�username�password�fromaddrr��toaddrs�subject�securer�)rr�r�r�r��credentialsr�r�rrrr	�s
zSMTPHandler.__init__cCs|jS)z�
        Determine the subject for the email.

        If you want to specify a subject line which is record-dependent,
        override this method.
        )r�rrrr�
getSubject�szSMTPHandler.getSubjectcCsz�ddl}ddlm}ddl}|j}|s.|j}|j|j||jd�}|�}|j	|d<d�
|j�|d<|�|�|d<|j
��|d	<|�|�|��|jr�|jdk	r�|��|j|j�|��|�|j|j�|�|�|��Wntk
r�|�|�YnXdS)
zd
        Emit a record.

        Format the record and send it to the specified addressees.
        rN)�EmailMessager�ZFrom�,ZToZSubjectZDate)�smtplibZ
email.messager�Zemail.utilsr�Z	SMTP_PORTZSMTPr�r�r�rrr�r�ZutilsrdZset_contentr8r�r�ZehloZstarttlsZloginr�Zsend_message�quitrr)rrr�r�Zemailr�Zsmtpr=rrrr�s0


zSMTPHandler.emit)NNr�)r%r&r'r(r	r�rrrrrr��s�
#	r�c@sBeZdZdZddd�Zdd�Zdd	�Zd
d�Zdd
�Zdd�Z	dS)�NTEventLogHandlera�
    A handler class which sends events to the NT Event Log. Adds a
    registry entry for the specified application name. If no dllname is
    provided, win32service.pyd (which contains some basic message
    placeholders) is used. Note that use of these placeholders will make
    your event logs big, as the entire message source is held in the log.
    If you want slimmer logs, you have to pass in the name of your own DLL
    which contains the message definitions you want to use in the event log.
    N�Applicationc
Cs�tj�|�z�ddl}ddl}||_||_|s`tj�	|jj
�}tj�	|d�}tj�|dd�}||_||_
|j�|||�|j|_tj|jtj|jtj|jtj|jtj|ji|_Wn"tk
r�td�d|_YnXdS)Nrzwin32service.pydzWThe Python Win32 extensions for NT (service, event logging) appear not to be available.)rr�r	�win32evtlogutil�win32evtlog�appname�_welurrrn�__file__rr�dllname�logtypeZAddSourceToRegistryZEVENTLOG_ERROR_TYPE�deftyper�ZEVENTLOG_INFORMATION_TYPEr�r�ZEVENTLOG_WARNING_TYPEr�r��typemap�ImportError�print)rr�r�r�r�r�rrrr	s6�
zNTEventLogHandler.__init__cCsdS)ay
        Return the message ID for the event record. If you are using your
        own messages, you could do this by having the msg passed to the
        logger being an ID rather than a formatting string. Then, in here,
        you could use a dictionary lookup to get the message ID. This
        version returns 1, which is the base message ID in win32service.pyd.
        r-rrrrr�getMessageID&szNTEventLogHandler.getMessageIDcCsdS)z�
        Return the event category for the record.

        Override this if you want to specify your own categories. This version
        returns 0.
        rrrrrr�getEventCategory0sz"NTEventLogHandler.getEventCategorycCs|j�|j|j�S)a�
        Return the event type for the record.

        Override this if you want to specify your own types. This version does
        a mapping using the handler's typemap attribute, which is set up in
        __init__() to a dictionary which contains mappings for DEBUG, INFO,
        WARNING, ERROR and CRITICAL. If you are using your own levels you will
        either need to override this method or place a suitable dictionary in
        the handler's typemap attribute.
        )r�r��levelnor�rrrr�getEventType9szNTEventLogHandler.getEventTypecCsn|jrjzD|�|�}|�|�}|�|�}|�|�}|j�|j||||g�Wntk
rh|�|�YnXdS)z�
        Emit a record.

        Determine the message ID, event category and event type. Then
        log the message in the NT event log.
        N)	r�r�r�rr8ZReportEventr�rr)rr�id�cat�typer=rrrrFs



zNTEventLogHandler.emitcCstj�|�dS)aS
        Clean up this handler.

        You can remove the application name from the registry as a
        source of event log entries. However, if you do this, you will
        not be able to see the events as you intended in the Event Log
        Viewer - it needs to be able to access the registry to get the
        DLL name.
        N)rr�r0r�rrrr0WszNTEventLogHandler.close)Nr�)
r%r&r'r(r	r�r�rrr0rrrrr�s	

	
r�c@s*eZdZdZddd�Zdd�Zd	d
�ZdS)�HTTPHandlerz^
    A class which sends records to a Web server, using either GET or
    POST semantics.
    �GETFNcCs`tj�|�|��}|dkr$td��|s8|dk	r8td��||_||_||_||_||_	||_
dS)zr
        Initialize the instance with the host, the request URL, and the method
        ("GET" or "POST")
        )r�POSTzmethod must be GET or POSTNz3context parameter only makes sense with secure=True)rr�r	rJrRr��url�methodr�r��context)rr�rr	r�r�r
rrrr	iszHTTPHandler.__init__cCs|jS)z�
        Default implementation of mapping the log record into a dict
        that is sent as the CGI data. Overwrite in your class.
        Contributed by Franz Glasner.
        )r�rrrr�mapLogRecord}szHTTPHandler.mapLogRecordcCsx�zPddl}ddl}|j}|jr4|jj||jd�}n|j�|�}|j}|j	�
|�|��}|jdkr�|�
d�dkrvd}nd}|d||f}|�|j|�|�
d�}	|	dkr�|d|	�}|jd	kr�|�d
d�|�dtt|���|j�r$ddl}
d
|j�d�}d|
�|����d�}|�d|�|��|jd	k�rH|�|�d��|��Wn tk
�rr|�|�YnXdS)zk
        Emit a record.

        Send the record to the Web server as a percent-encoded dictionary
        rN)r
r�?�&z%c%s�:rzContent-typez!application/x-www-form-urlencodedzContent-lengthz%s:%sr�zBasic �asciiZ
Authorization)Zhttp.clientZurllib.parser�r�ZclientZHTTPSConnectionr
ZHTTPConnectionr�parseZ	urlencoderr	�findZ
putrequestZ	putheaderr�r;r��base64r�Z	b64encode�strip�decodeZ
endheadersr�Zgetresponserr)rrZhttpZurllibr�r?r�data�sepr5rrwrrrr�sB


�zHTTPHandler.emit)rFNN)r%r&r'r(r	rrrrrrrds�
rc@s8eZdZdZdd�Zdd�Zdd�Zdd	�Zd
d�ZdS)
�BufferingHandlerz�
  A handler class which buffers logging records in memory. Whenever each
  record is added to the buffer, a check is made to see if the buffer should
  be flushed. If it should, then flush() is expected to do what's needed.
    cCstj�|�||_g|_dS)z>
        Initialize the handler with the buffer size.
        N)rr�r	�capacity�buffer)rrrrrr	�szBufferingHandler.__init__cCst|j�|jkS)z�
        Should the handler flush its buffer?

        Returns true if the buffer is up to capacity. This method can be
        overridden to implement custom flushing strategies.
        )r;rrrrrr�shouldFlush�szBufferingHandler.shouldFlushcCs"|j�|�|�|�r|��dS)z�
        Emit a record.

        Append the record. If shouldFlush() tells us to, call flush() to process
        the buffer.
        N)rrqrr�rrrrr�s
zBufferingHandler.emitcCs"|��z
g|_W5|��XdS)zw
        Override to implement custom flushing behaviour.

        This version just zaps the buffer to empty.
        N)r�r�rr�rrrr��s
zBufferingHandler.flushc	Cs z|��W5tj�|�XdS)zp
        Close the handler.

        This version just flushes and chains to the parent class' close().
        N)rr�r0r�r�rrrr0�szBufferingHandler.closeN)	r%r&r'r(r	rrr�r0rrrrr�s	rc@sBeZdZdZejddfdd�Zdd�Zdd	�Zd
d�Z	dd
�Z
dS)�
MemoryHandlerz�
    A handler class which buffers logging records in memory, periodically
    flushing them to a target handler. Flushing occurs whenever the buffer
    is full, or when an event of a certain severity or greater is seen.
    NTcCs"t�||�||_||_||_dS)a;
        Initialize the handler with the buffer size, the level at which
        flushing should occur and an optional target.

        Note that without a target being set either here or via setTarget(),
        a MemoryHandler is no use to anyone!

        The ``flushOnClose`` argument is ``True`` for backward compatibility
        reasons - the old behaviour is that when the handler is closed, the
        buffer is flushed, even if the flush level hasn't been exceeded nor the
        capacity exceeded. To prevent this, set ``flushOnClose`` to ``False``.
        N)rr	�
flushLevel�target�flushOnClose)rrrrrrrrr	�szMemoryHandler.__init__cCst|j�|jkp|j|jkS)zP
        Check for buffer full or a record at the flushLevel or higher.
        )r;rrrrrrrrrs
�zMemoryHandler.shouldFlushcCs"|��z
||_W5|��XdS)z:
        Set the target handler for this handler.
        N)r�r�r)rrrrr�	setTarget
s
zMemoryHandler.setTargetcCs@|��z(|jr.|jD]}|j�|�qg|_W5|��XdS)z�
        For a MemoryHandler, flushing means just sending the buffered
        records to the target, if there is one. Override if you want
        different behaviour.

        The record buffer is also cleared by this operation.
        N)r�r�rr�handlerrrrr�s

zMemoryHandler.flushcCsBz|jr|��W5|��zd|_t�|�W5|��XXdS)zi
        Flush, if appropriately configured, set the target to None and lose the
        buffer.
        N)r�r�rrr0rr�r�rrrr0(szMemoryHandler.close)r%r&r'r(rr�r	rrr�r0rrrrr�s�

rc@s0eZdZdZdd�Zdd�Zdd�Zdd	�Zd
S)�QueueHandlera�
    This handler sends events to a queue. Typically, it would be used together
    with a multiprocessing Queue to centralise logging to file in one process
    (in a multi-process application), so as to avoid file write contention
    between processes.

    This code is new in Python 3.2, but this class can be copy pasted into
    user code for use with earlier Python versions.
    cCstj�|�||_dS)zA
        Initialise an instance, using the passed queue.
        N)rr�r	�queue)rr"rrrr	DszQueueHandler.__init__cCs|j�|�dS)z�
        Enqueue a record.

        The base implementation uses put_nowait. You may want to override
        this method if you want to use blocking, timeouts or custom queue
        implementations.
        N)r"�
put_nowaitrrrr�enqueueKszQueueHandler.enqueuecCs6|�|�}t�|�}||_||_d|_d|_d|_|S)a�
        Prepares a record for queuing. The object returned by this method is
        enqueued.

        The base implementation formats the record to merge the message
        and arguments, and removes unpickleable items from the record
        in-place.

        You might want to override this method if you want to convert
        the record to a dict or JSON string, or send a modified copy
        of the record while leaving the original intact.
        N)r8�copyr�r=r�r�Zexc_textr<rrr�prepareUs

zQueueHandler.preparecCs8z|�|�|��Wntk
r2|�|�YnXdS)zm
        Emit a record.

        Writes the LogRecord to the queue, preparing it for pickling first.
        N)r$r&rrrrrrrrszQueueHandler.emitN)r%r&r'r(r	r$r&rrrrrr!9s


r!c@sZeZdZdZdZdd�dd�Zdd�Zd	d
�Zdd�Zd
d�Z	dd�Z
dd�Zdd�ZdS)�
QueueListenerz�
    This class implements an internal threaded listener which watches for
    LogRecords being added to a queue, removes them and passes them to a
    list of handlers for processing.
    NF)�respect_handler_levelcGs||_||_d|_||_dS)zW
        Initialise an instance with the specified queue and
        handlers.
        N)r"�handlers�_threadr()rr"r(r)rrrr	�szQueueListener.__init__cCs|j�|�S)z�
        Dequeue a record and return it, optionally blocking.

        The base implementation uses get. You may want to override this method
        if you want to use timeouts or work with custom queue implementations.
        )r"r�)r�blockrrr�dequeue�szQueueListener.dequeuecCs&tj|jd�|_}d|_|��dS)z�
        Start the listener.

        This starts up a background thread to monitor the queue for
        LogRecords to process.
        )rTN)�	threadingZThread�_monitorr*r��start)rr\rrrr/�szQueueListener.startcCs|S)a
        Prepare a record for handling.

        This method just returns the passed-in record. You may want to
        override this method if you need to do any custom marshalling or
        manipulation of the record before passing it to the handlers.
        rrrrrr&�szQueueListener.preparecCs@|�|�}|jD]*}|js d}n|j|jk}|r|�|�qdS)z|
        Handle a record.

        This just loops through the handlers offering them the record
        to handle.
        TN)r&r)r(r�levelr )rrZhandlerZprocessrrrr �s

zQueueListener.handlecCsp|j}t|d�}z>|�d�}||jkr6|r2|��Wql|�|�|rL|��Wqtjk
rhYqlYqXqdS)z�
        Monitor the queue for records, and ask the handler
        to deal with them.

        This method runs on a separate, internal thread.
        The thread will terminate if it sees a sentinel object in the queue.
        �	task_doneTN)r"�hasattrr,�	_sentinelr1r ZEmpty)r�qZ
has_task_donerrrrr.�s



zQueueListener._monitorcCs|j�|j�dS)z�
        This is used to enqueue the sentinel record.

        The base implementation uses put_nowait. You may want to override this
        method if you want to use timeouts or work with custom queue
        implementations.
        N)r"r#r3r�rrr�enqueue_sentinel�szQueueListener.enqueue_sentinelcCs|��|j��d|_dS)a

        Stop the listener.

        This asks the thread to terminate, and then waits for it to do so.
        Note that if you don't call this before your application exits, there
        may be some records still left on the queue, which won't be processed.
        N)r5r*rrr�rrr�stop�s
zQueueListener.stop)
r%r&r'r(r3r	r,r/r&r r.r5r6rrrrr'~s
	

r')'r(rr�rr�r�rYrUrXrrrr"r-r%ZDEFAULT_TCP_LOGGING_PORTZDEFAULT_UDP_LOGGING_PORTZDEFAULT_HTTP_LOGGING_PORTZDEFAULT_SOAP_LOGGING_PORTr�ZSYSLOG_TCP_PORTrerrr)r>rxr�r�r�r�r�r�rrrr!�objectr'rrrr�<module>s<	8FL`E(*PbO9ME__pycache__/__init__.cpython-38.pyc000064400000177400150327210150013150 0ustar00U

e5d�0�*@s6dZddlZddlZddlZddlZddlZddlZddlZddlZddl	Z
ddlmZddlm
Zddddd	d
ddd
ddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.g*ZddlZd/Zd0Zd1Zd2Ze��Zd3Zd3Zd3Zd3Zd4ZeZd5Zd6ZeZd7Zd8Z dZ!eded	edede de!diZ"eeeeeee e!d9�Z#d:d!�Z$d;d�Z%e&ed<��rdd=d>�Z'nd?d@�Z'ej(�)e%j*j+�Z,dAdB�Z-e�.�Z/dCdD�Z0dEdF�Z1e&edG��s�dHdI�Z2n(e�3�Z4dJdI�Z2dKdL�Z5ej6e0e5e1dM�GdNd�de7�Z8e8a9dOd,�Z:dPd+�Z;dQd&�Z<e�Z=[GdRdS�dSe7�Z>GdTdU�dUe>�Z?GdVdW�dWe>�Z@dXZAe>eAfe?dYfe@dZfd[�ZBGd\d
�d
e7�Z
e
�ZCGd]d�de7�ZDGd^d�de7�ZEGd_d`�d`e7�ZFe�G�ZHgZIdadb�ZJdcdd�ZKGded�deF�ZLGdfd�deL�ZMGdgd�deM�ZNGdhdi�dieM�ZOeOe�ZPePZQGdjdk�dke7�ZRdld'�ZSdmd#�ZTGdndo�doe7�ZUGdpd�deF�ZVGdqdr�dreV�ZWeVaXGdsd�de7�ZYeWe�ZZeZeV_ZeUeVjZ�eV_[dtd�Z\d�dud"�Z]dvd�Z^e^Z_dwd�Z`d3dx�dyd�Zadzd*�Zbd{d)�Zcd|d$�Zdd}d�Zed~d%�Zfefdd�ZgeIfd�d(�ZhddliZiei�jeh�Gd�d�deL�Zkdald�d�d��Zmd�d�ZndS)�z�
Logging package for Python. Based on PEP 282 and comments thereto in
comp.lang.python.

Copyright (C) 2001-2017 Vinay Sajip. All Rights Reserved.

To use, simply 'import logging' and log away!
�N)�Template)�	Formatter�BASIC_FORMAT�BufferingFormatter�CRITICAL�DEBUG�ERROR�FATAL�FileHandler�Filterr�Handler�INFO�	LogRecord�Logger�
LoggerAdapter�NOTSET�NullHandler�
StreamHandler�WARN�WARNING�addLevelName�basicConfig�captureWarnings�critical�debug�disable�error�	exception�fatal�getLevelName�	getLogger�getLoggerClass�info�log�
makeLogRecord�setLoggerClass�shutdown�warn�warning�getLogRecordFactory�setLogRecordFactory�
lastResort�raiseExceptionsz&Vinay Sajip <vinay_sajip@red-dove.com>Z
productionz0.5.1.2z07 February 2010T�2�(���
)rr	rrrr
rrcCs4t�|�}|dk	r|St�|�}|dk	r,|Sd|S)a�
    Return the textual or numeric representation of logging level 'level'.

    If the level is one of the predefined levels (CRITICAL, ERROR, WARNING,
    INFO, DEBUG) then you get the corresponding string. If you have
    associated levels with names using addLevelName then the name you have
    associated with 'level' is returned.

    If a numeric value corresponding to one of the defined levels is passed
    in, the corresponding string representation is returned.

    If a string representation of the level is passed in, the corresponding
    numeric value is returned.

    If no matching numeric or string value is passed in, the string
    'Level %s' % level is returned.
    NzLevel %s)�_levelToName�get�_nameToLevel)�level�result�r7�(/usr/lib64/python3.8/logging/__init__.pyrws

cCs(t�z|t|<|t|<W5t�XdS)zy
    Associate 'levelName' with 'level'.

    This is used when converting levels to text during message formatting.
    N)�_acquireLock�_releaseLockr2r4)r5Z	levelNamer7r7r8r�s
�	_getframecCs
t�d�S)N�)�sysr;r7r7r7r8�<lambda>��r>cCs2zt�Wn$tk
r,t��djjYSXdS)z5Return the frame object for the caller's stack frame.�N)�	Exceptionr=�exc_info�tb_frame�f_backr7r7r7r8�currentframe�srEcCsJt|t�r|}n6t|�|kr:|tkr0td|��t|}ntd|��|S)NzUnknown level: %rz*Level not an integer or a valid string: %r)�
isinstance�int�strr4�
ValueError�	TypeError)r5�rvr7r7r8�_checkLevel�s

rLcCstrt��dS)z�
    Acquire the module-level lock for serializing access to shared data.

    This should be released with _releaseLock().
    N)�_lock�acquirer7r7r7r8r9�sr9cCstrt��dS)zK
    Release the module-level lock acquired by calling _acquireLock().
    N)rM�releaser7r7r7r8r:�sr:�register_at_forkcCsdS�Nr7��instancer7r7r8�_register_at_fork_reinit_lock�srTcCs"t�zt�|�W5t�XdSrQ)r9r:�_at_fork_reinit_lock_weakset�addrRr7r7r8rT�scCsXtD]H}z|��Wqtk
rJ}ztdtd|tjd�W5d}~XYqXqt�dS)Nz&Ignoring exception from logging atforkz._reinit_lock() method:��file)rU�
createLockrA�printrSr=�stderrr:)�handler�errr7r7r8�!_after_at_fork_child_reinit_locks�s�r^)ZbeforeZafter_in_childZafter_in_parentc@s*eZdZdZd	dd�Zdd�Zdd�ZdS)
ra
    A LogRecord instance represents an event being logged.

    LogRecord instances are created every time something is logged. They
    contain all the information pertinent to the event being logged. The
    main information passed in is in msg and args, which are combined
    using str(msg) % args to create the message field of the record. The
    record also includes information such as when the record was created,
    the source line where the logging call was made, and any exception
    information to be logged.
    Nc


Ks�t��}||_||_|rFt|�dkrFt|dtjj�rF|drF|d}||_t	|�|_
||_||_z&t
j�|�|_t
j�|j�d|_Wn&tttfk
r�||_d|_YnX||_d|_|	|_||_||_||_|t|�d|_|jtd|_t �rt!�"�|_#t!�$�j|_%nd|_#d|_%t&�s.d|_'nDd|_'t(j)�*d�}|dk	�rrz|�+�j|_'Wnt,k
�rpYnXt-�r�t.t
d��r�t
�/�|_0nd|_0dS)	zK
        Initialize a logging record with interesting information.
        �rzUnknown moduleNi�ZMainProcessZmultiprocessing�getpid)1�time�name�msg�lenrF�collections�abc�Mapping�argsrZ	levelname�levelno�pathname�os�path�basename�filename�splitext�modulerJrI�AttributeErrorrB�exc_text�
stack_info�linenoZfuncName�createdrG�msecs�
_startTimeZrelativeCreated�
logThreads�	threading�	get_ident�threadZcurrent_threadZ
threadName�logMultiprocessingZprocessNamer=�modulesr3Zcurrent_processrA�logProcesses�hasattrr`�process)
�selfrbr5rjrtrcrhrB�func�sinfo�kwargs�ctZmpr7r7r8�__init__ sT"�


zLogRecord.__init__cCsd|j|j|j|j|jfS)Nz!<LogRecord: %s, %s, %s, %s, "%s">)rbrirjrtrc�r�r7r7r8�__repr__hs

�zLogRecord.__repr__cCst|j�}|jr||j}|S)z�
        Return the message for this LogRecord.

        Return the message for this LogRecord after merging any user-supplied
        arguments with the message.
        )rHrcrh)r�rcr7r7r8�
getMessagels

zLogRecord.getMessage)NN)�__name__�
__module__�__qualname__�__doc__r�r�r�r7r7r7r8rs�
HcCs|adS)z�
    Set the factory to be used when instantiating a log record.

    :param factory: A callable which will be called to instantiate
    a log record.
    N��_logRecordFactory)�factoryr7r7r8r*}scCstS)zH
    Return the factory to be used when instantiating a log record.
    r�r7r7r7r8r)�sc	Cs&tdddddddd�}|j�|�|S)z�
    Make a LogRecord whose attributes are defined by the specified dictionary,
    This function is useful for converting a logging event received over
    a socket connection (which is sent as a dictionary) into a LogRecord
    instance.
    N�rr7)r��__dict__�update)�dictrKr7r7r8r$�sc@sNeZdZdZdZdZe�dej�Z	dd�Z
dd�Zd	d
�Zdd�Z
d
d�ZdS)�PercentStylez%(message)sz%(asctime)sz
%(asctime)z5%\(\w+\)[#0+ -]*(\*|\d+)?(\.(\*|\d+))?[diouxefgcrsa%]cCs|p|j|_dSrQ)�default_format�_fmt�r��fmtr7r7r8r��szPercentStyle.__init__cCs|j�|j�dkS)Nr)r��find�asctime_searchr�r7r7r8�usesTime�szPercentStyle.usesTimecCs*|j�|j�s&td|j|jdf��dS)z>Validate the input format, ensure it matches the correct stylez"Invalid format '%s' for '%s' stylerN)�validation_pattern�searchr�rIr�r�r7r7r8�validate�szPercentStyle.validatecCs|j|jSrQ)r�r��r��recordr7r7r8�_format�szPercentStyle._formatc
Cs@z|�|�WStk
r:}ztd|��W5d}~XYnXdS)Nz(Formatting field not found in record: %s)r��KeyErrorrI)r�r��er7r7r8�format�szPercentStyle.formatN)r�r�r�r��asctime_formatr��re�compile�Ir�r�r�r�r�r�r7r7r7r8r��sr�c@s@eZdZdZdZdZe�dej�Z	e�d�Z
dd�Zdd	�Zd
S)�StrFormatStylez	{message}z	{asctime}z{asctimezF^(.?[<>=^])?[+ -]?#?0?(\d+|{\w+})?[,_]?(\.(\d+|{\w+}))?[bcdefgnosx%]?$z^(\d+|\w+)(\.\w+|\[[^]]+\])*$cCs|jjf|j�SrQ)r�r�r�r�r7r7r8r��szStrFormatStyle._formatc
Cs�t�}zxt�|j�D]f\}}}}|rF|j�|�s<td|��|�|�|r^|dkr^td|��|r|j�|�std|��qWn.tk
r�}ztd|��W5d}~XYnX|s�td��dS)zKValidate the input format, ensure it is the correct string formatting stylez!invalid field name/expression: %rZrsazinvalid conversion: %rzbad specifier: %rzinvalid format: %sN�invalid format: no fields)	�set�_str_formatter�parser��
field_spec�matchrIrV�fmt_spec)r��fields�_Z	fieldname�specZ
conversionr�r7r7r8r��s
zStrFormatStyle.validateN)
r�r�r�r�r�r�r�r�r�r�r�r�r�r7r7r7r8r��s
r�c@s8eZdZdZdZdZdd�Zdd�Zdd�Zd	d
�Z	dS)�StringTemplateStylez
${message}z
${asctime}cCs|p|j|_t|j�|_dSrQ)r�r�r�_tplr�r7r7r8r��szStringTemplateStyle.__init__cCs$|j}|�d�dkp"|�|j�dkS)Nz$asctimer)r�r�r�r�r7r7r8r��szStringTemplateStyle.usesTimecCs|tj}t�}|�|j�D]R}|��}|dr<|�|d�q|drT|�|d�q|�d�dkrtd��q|sxtd��dS)NZnamedZbracedr�$z$invalid format: bare '$' not allowedr�)	r�patternr��finditerr��	groupdictrV�grouprI)r�r�r��m�dr7r7r8r��s
zStringTemplateStyle.validatecCs|jjf|j�SrQ)r�Z
substituter�r�r7r7r8r��szStringTemplateStyle._formatN)
r�r�r�r�r�r�r�r�r�r�r7r7r7r8r��sr�z"%(levelname)s:%(name)s:%(message)sz{levelname}:{name}:{message}z${levelname}:${name}:${message})�%�{r�c@sZeZdZdZejZddd�ZdZdZ	dd	d
�Z
dd�Zd
d�Zdd�Z
dd�Zdd�ZdS)ra�
    Formatter instances are used to convert a LogRecord to text.

    Formatters need to know how a LogRecord is constructed. They are
    responsible for converting a LogRecord to (usually) a string which can
    be interpreted by either a human or an external system. The base Formatter
    allows a formatting string to be specified. If none is supplied, the
    style-dependent default value, "%(message)s", "{message}", or
    "${message}", is used.

    The Formatter can be initialized with a format string which makes use of
    knowledge of the LogRecord attributes - e.g. the default value mentioned
    above makes use of the fact that the user's message and arguments are pre-
    formatted into a LogRecord's message attribute. Currently, the useful
    attributes in a LogRecord are described by:

    %(name)s            Name of the logger (logging channel)
    %(levelno)s         Numeric logging level for the message (DEBUG, INFO,
                        WARNING, ERROR, CRITICAL)
    %(levelname)s       Text logging level for the message ("DEBUG", "INFO",
                        "WARNING", "ERROR", "CRITICAL")
    %(pathname)s        Full pathname of the source file where the logging
                        call was issued (if available)
    %(filename)s        Filename portion of pathname
    %(module)s          Module (name portion of filename)
    %(lineno)d          Source line number where the logging call was issued
                        (if available)
    %(funcName)s        Function name
    %(created)f         Time when the LogRecord was created (time.time()
                        return value)
    %(asctime)s         Textual time when the LogRecord was created
    %(msecs)d           Millisecond portion of the creation time
    %(relativeCreated)d Time in milliseconds when the LogRecord was created,
                        relative to the time the logging module was loaded
                        (typically at application startup time)
    %(thread)d          Thread ID (if available)
    %(threadName)s      Thread name (if available)
    %(process)d         Process ID (if available)
    %(message)s         The result of record.getMessage(), computed just as
                        the record is emitted
    Nr�TcCsR|tkrtdd�t�����t|d|�|_|r>|j��|jj|_||_dS)a�
        Initialize the formatter with specified format strings.

        Initialize the formatter either with the specified format string, or a
        default as described above. Allow for specialized date formatting with
        the optional datefmt argument. If datefmt is omitted, you get an
        ISO8601-like (or RFC 3339-like) format.

        Use a style parameter of '%', '{' or '$' to specify that you want to
        use one of %-formatting, :meth:`str.format` (``{}``) formatting or
        :class:`string.Template` formatting in your format string.

        .. versionchanged:: 3.2
           Added the ``style`` parameter.
        �Style must be one of: %s�,rN)�_STYLESrI�join�keys�_styler�r��datefmt)r�r�r��styler�r7r7r8r�/s�

zFormatter.__init__z%Y-%m-%d %H:%M:%Sz%s,%03dcCs@|�|j�}|rt�||�}nt�|j|�}|j||jf}|S)a%
        Return the creation time of the specified LogRecord as formatted text.

        This method should be called from format() by a formatter which
        wants to make use of a formatted time. This method can be overridden
        in formatters to provide for any specific requirement, but the
        basic behaviour is as follows: if datefmt (a string) is specified,
        it is used with time.strftime() to format the creation time of the
        record. Otherwise, an ISO8601-like (or RFC 3339-like) format is used.
        The resulting string is returned. This function uses a user-configurable
        function to convert the creation time to a tuple. By default,
        time.localtime() is used; to change this for a particular formatter
        instance, set the 'converter' attribute to a function with the same
        signature as time.localtime() or time.gmtime(). To change it for all
        formatters, for example if you want all logging times to be shown in GMT,
        set the 'converter' attribute in the Formatter class.
        )�	converterrura�strftime�default_time_format�default_msec_formatrv)r�r�r�r��s�tr7r7r8�
formatTimeLszFormatter.formatTimecCsZt��}|d}t�|d|d|d|�|��}|��|dd�dkrV|dd�}|S)z�
        Format and return the specified exception information as a string.

        This default implementation just uses
        traceback.print_exception()
        r@rr_N����
)�io�StringIO�	traceback�print_exception�getvalue�close)r�Zei�sio�tbr�r7r7r8�formatExceptionfszFormatter.formatExceptioncCs
|j��S)zK
        Check if the format uses the creation time of the record.
        )r�r�r�r7r7r8r�yszFormatter.usesTimecCs|j�|�SrQ)r�r�r�r7r7r8�
formatMessageszFormatter.formatMessagecCs|S)aU
        This method is provided as an extension point for specialized
        formatting of stack information.

        The input data is a string as returned from a call to
        :func:`traceback.print_stack`, but with the last trailing newline
        removed.

        The base implementation just returns the value passed in.
        r7)r�rsr7r7r8�formatStack�szFormatter.formatStackcCs�|��|_|��r"|�||j�|_|�|�}|jrF|jsF|�	|j�|_|jrn|dd�dkrd|d}||j}|j
r�|dd�dkr�|d}||�|j
�}|S)az
        Format the specified record as text.

        The record's attribute dictionary is used as the operand to a
        string formatting operation which yields the returned string.
        Before formatting the dictionary, a couple of preparatory steps
        are carried out. The message attribute of the record is computed
        using LogRecord.getMessage(). If the formatting string uses the
        time (as determined by a call to usesTime(), formatTime() is
        called to format the event time. If there is exception information,
        it is formatted using formatException() and appended to the message.
        r�Nr�)r��messager�r�r��asctimer�rBrrr�rsr�)r�r�r�r7r7r8r��s 


zFormatter.format)NNr�T)N)r�r�r�r�ra�	localtimer�r�r�r�r�r�r�r�r�r�r7r7r7r8rs*


c@s2eZdZdZddd�Zdd�Zdd�Zd	d
�ZdS)rzB
    A formatter suitable for formatting a number of records.
    NcCs|r||_nt|_dS)zm
        Optionally specify a formatter which will be used to format each
        individual record.
        N)�linefmt�_defaultFormatter)r�r�r7r7r8r��szBufferingFormatter.__init__cCsdS)zE
        Return the header string for the specified records.
        r�r7�r��recordsr7r7r8�formatHeader�szBufferingFormatter.formatHeadercCsdS)zE
        Return the footer string for the specified records.
        r�r7r�r7r7r8�formatFooter�szBufferingFormatter.formatFootercCsJd}t|�dkrF||�|�}|D]}||j�|�}q"||�|�}|S)zQ
        Format the specified records and return the result as a string.
        r�r)rdr�r�r�r�)r�r�rKr�r7r7r8r��szBufferingFormatter.format)N)r�r�r�r�r�r�r�r�r7r7r7r8r�s


c@s"eZdZdZddd�Zdd�ZdS)	ra�
    Filter instances are used to perform arbitrary filtering of LogRecords.

    Loggers and Handlers can optionally use Filter instances to filter
    records as desired. The base filter class only allows events which are
    below a certain point in the logger hierarchy. For example, a filter
    initialized with "A.B" will allow events logged by loggers "A.B",
    "A.B.C", "A.B.C.D", "A.B.D" etc. but not "A.BB", "B.A.B" etc. If
    initialized with the empty string, all events are passed.
    r�cCs||_t|�|_dS)z�
        Initialize a filter.

        Initialize with the name of the logger which, together with its
        children, will have its events allowed through the filter. If no
        name is specified, allow every event.
        N)rbrd�nlen�r�rbr7r7r8r��szFilter.__init__cCsJ|jdkrdS|j|jkrdS|j�|jd|j�dkr:dS|j|jdkS)z�
        Determine if the specified record is to be logged.

        Returns True if the record should be logged, or False otherwise.
        If deemed appropriate, the record may be modified in-place.
        rTF�.)r�rbr�r�r7r7r8�filter�s
z
Filter.filterN)r�)r�r�r�r�r�r�r7r7r7r8r�s

c@s0eZdZdZdd�Zdd�Zdd�Zdd	�Zd
S)�Filtererz[
    A base class for loggers and handlers which allows them to share
    common code.
    cCs
g|_dS)zE
        Initialize the list of filters to be an empty list.
        N)�filtersr�r7r7r8r�szFilterer.__init__cCs||jkr|j�|�dS)z;
        Add the specified filter to this handler.
        N)r��append�r�r�r7r7r8�	addFilters
zFilterer.addFiltercCs||jkr|j�|�dS)z@
        Remove the specified filter from this handler.
        N)r��remover�r7r7r8�removeFilters
zFilterer.removeFiltercCs>d}|jD].}t|d�r$|�|�}n||�}|s
d}q:q
|S)ah
        Determine if a record is loggable by consulting all the filters.

        The default is to allow the record to be logged; any filter can veto
        this and the record is then dropped. Returns a zero value if a record
        is to be dropped, else non-zero.

        .. versionchanged:: 3.2

           Allow filters to be just callables.
        Tr�F)r�rr�)r�r�rK�fr6r7r7r8r�s

zFilterer.filterN)r�r�r�r�r�r�r�r�r7r7r7r8r�s
r�cCsFttt}}}|rB|rB|rB|�z||kr6|�|�W5|�XdS)zD
    Remove a handler reference from the internal cleanup list.
    N)r9r:�_handlerListr�)�wrrNrO�handlersr7r7r8�_removeHandlerRef:sr�cCs*t�zt�t�|t��W5t�XdS)zL
    Add a handler to the internal cleanup list using a weak reference.
    N)r9r:r�r��weakref�refr�)r\r7r7r8�_addHandlerRefKsr�c@s�eZdZdZefdd�Zdd�Zdd�Zeee�Z	dd	�Z
d
d�Zdd
�Zdd�Z
dd�Zdd�Zdd�Zdd�Zdd�Zdd�Zdd�Zdd�Zd S)!raq
    Handler instances dispatch logging events to specific destinations.

    The base handler class. Acts as a placeholder which defines the Handler
    interface. Handlers can optionally use Formatter instances to format
    records as desired. By default, no formatter is specified; in this case,
    the 'raw' message as determined by record.message is logged.
    cCs4t�|�d|_t|�|_d|_t|�|��dS)zz
        Initializes the instance - basically setting the formatter to None
        and the filter list to empty.
        N)r�r��_namerLr5�	formatterr�rY�r�r5r7r7r8r�^s

zHandler.__init__cCs|jSrQ)r�r�r7r7r8�get_namekszHandler.get_namecCs<t�z(|jtkrt|j=||_|r,|t|<W5t�XdSrQ�r9r:r��	_handlersr�r7r7r8�set_namens
zHandler.set_namecCst��|_t|�dS)zU
        Acquire a thread lock for serializing access to the underlying I/O.
        N)ry�RLock�lockrTr�r7r7r8rY{s
zHandler.createLockcCs|jr|j��dS)z.
        Acquire the I/O thread lock.
        N)rrNr�r7r7r8rN�szHandler.acquirecCs|jr|j��dS)z.
        Release the I/O thread lock.
        N)rrOr�r7r7r8rO�szHandler.releasecCst|�|_dS)zX
        Set the logging level of this handler.  level must be an int or a str.
        N)rLr5r�r7r7r8�setLevel�szHandler.setLevelcCs|jr|j}nt}|�|�S)z�
        Format the specified record.

        If a formatter is set, use it. Otherwise, use the default formatter
        for the module.
        )r�r�r�)r�r�r�r7r7r8r��szHandler.formatcCstd��dS)z�
        Do whatever it takes to actually log the specified logging record.

        This version is intended to be implemented by subclasses and so
        raises a NotImplementedError.
        z.emit must be implemented by Handler subclassesN)�NotImplementedErrorr�r7r7r8�emit�szHandler.emitcCs4|�|�}|r0|��z|�|�W5|��X|S)a<
        Conditionally emit the specified logging record.

        Emission depends on filters which may have been added to the handler.
        Wrap the actual emission of the record with acquisition/release of
        the I/O thread lock. Returns whether the filter passed the record for
        emission.
        )r�rNrOr)r�r�rKr7r7r8�handle�s	

zHandler.handlecCs
||_dS)z5
        Set the formatter for this handler.
        N)r�r�r7r7r8�setFormatter�szHandler.setFormattercCsdS)z�
        Ensure all logging output has been flushed.

        This version does nothing and is intended to be implemented by
        subclasses.
        Nr7r�r7r7r8�flush�sz
Handler.flushcCs0t�z|jr |jtkr t|j=W5t�XdS)a%
        Tidy up any resources used by the handler.

        This version removes the handler from an internal map of handlers,
        _handlers, which is used for handler lookup by name. Subclasses
        should ensure that this gets called from overridden close()
        methods.
        Nr�r�r7r7r8r��s

z
Handler.closecCs t�rtj�rt��\}}}z�z�tj�d�t�|||dtj�tj�d�|j}|rvtj	�
|jj�t
dkrv|j}qR|r�tj|tjd�ntj�d|j|jf�ztj�d|j|jf�Wn4tk
r��Yn tk
r�tj�d�YnXWntk
�rYnXW5~~~XdS)	aD
        Handle errors which occur during an emit() call.

        This method should be called from handlers when an exception is
        encountered during an emit() call. If raiseExceptions is false,
        exceptions get silently ignored. This is what is mostly wanted
        for a logging system - most users will not care about errors in
        the logging system, they are more interested in application errors.
        You could, however, replace this with a custom handler if you wish.
        The record which was being processed is passed in to this method.
        z--- Logging error ---
NzCall stack:
rrWzLogged from file %s, line %s
zMessage: %r
Arguments: %s
zwUnable to print the message and arguments - possible formatting error.
Use the traceback above to help find the error.
)r,r=r[rB�writer�r�rCrkrl�dirname�f_code�co_filename�__path__rD�print_stackrnrtrcrh�RecursionErrorrA�OSError)r�r�r��vr��framer7r7r8�handleError�s<����

zHandler.handleErrorcCst|j�}d|jj|fS)Nz	<%s (%s)>)rr5�	__class__r�r�r7r7r8r�s
zHandler.__repr__N)r�r�r�r�rr�r�r��propertyrbrYrNrOrr�rrrrr�rr�r7r7r7r8rUs"



	/c@s>eZdZdZdZddd�Zdd�Zdd	�Zd
d�Zdd
�Z	dS)rz�
    A handler class which writes logging records, appropriately formatted,
    to a stream. Note that this class does not close the stream, as
    sys.stdout or sys.stderr may be used.
    r�NcCs"t�|�|dkrtj}||_dS)zb
        Initialize the handler.

        If stream is not specified, sys.stderr is used.
        N)rr�r=r[�stream�r�rr7r7r8r�s
zStreamHandler.__init__cCs8|��z |jr&t|jd�r&|j��W5|��XdS)z%
        Flushes the stream.
        rN)rNrOrrrr�r7r7r8r&s
zStreamHandler.flushcCsdz,|�|�}|j}|�||j�|��Wn2tk
rB�Yntk
r^|�|�YnXdS)a�
        Emit a record.

        If a formatter is specified, it is used to format the record.
        The record is then written to the stream with a trailing newline.  If
        exception information is present, it is formatted using
        traceback.print_exception and appended to the stream.  If the stream
        has an 'encoding' attribute, it is used to determine how to do the
        output to the stream.
        N)r�rr�
terminatorrr
rAr)r�r�rcrr7r7r8r1s
zStreamHandler.emitcCs@||jkrd}n,|j}|��z|��||_W5|��X|S)z�
        Sets the StreamHandler's stream to the specified value,
        if it is different.

        Returns the old stream, if the stream was changed, or None
        if it wasn't.
        N)rrNrOr)r�rr6r7r7r8�	setStreamGs


zStreamHandler.setStreamcCs>t|j�}t|jdd�}t|�}|r,|d7}d|jj||fS)Nrbr�� z<%s %s(%s)>)rr5�getattrrrHrr�)r�r5rbr7r7r8r�[s
zStreamHandler.__repr__)N)
r�r�r�r�rr�rrrr�r7r7r7r8rs
c@s:eZdZdZddd�Zdd�Zd	d
�Zdd�Zd
d�ZdS)r
zO
    A handler class which writes formatted logging records to disk files.
    �aNFcCsTt�|�}tj�|�|_||_||_||_|r@t�	|�d|_
nt�	||���dS)zO
        Open the specified file and use it as the stream for logging.
        N)
rk�fspathrl�abspath�baseFilename�mode�encoding�delayrr�rr�_open)r�rnrrr r7r7r8r�is

zFileHandler.__init__c	Csb|��zJz8|jr@z|��W5|j}d|_t|d�r>|��XW5t�|�XW5|��XdS)z$
        Closes the stream.
        Nr�)rNrOrr�rrrrr7r7r8r�}s
zFileHandler.closecCst|j|j|jd�S)zx
        Open the current base file with the (original) mode and encoding.
        Return the resulting stream.
        )r)�openrrrr�r7r7r8r!�szFileHandler._opencCs$|jdkr|��|_t�||�dS)z�
        Emit a record.

        If the stream was not opened because 'delay' was specified in the
        constructor, open it before calling the superclass's emit.
        N)rr!rrr�r7r7r8r�s

zFileHandler.emitcCst|j�}d|jj|j|fS�Nz<%s %s (%s)>)rr5rr�rr�r7r7r8r��s
zFileHandler.__repr__)rNF)	r�r�r�r�r�r�r!rr�r7r7r7r8r
es
c@s(eZdZdZefdd�Zedd��ZdS)�_StderrHandlerz�
    This class is like a StreamHandler using sys.stderr, but always uses
    whatever sys.stderr is currently set to rather than the value of
    sys.stderr at handler construction time.
    cCst�||�dS)z)
        Initialize the handler.
        N)rr�r�r7r7r8r��sz_StderrHandler.__init__cCstjSrQ)r=r[r�r7r7r8r�sz_StderrHandler.streamN)r�r�r�r�rr�rrr7r7r7r8r$�sr$c@s eZdZdZdd�Zdd�ZdS)�PlaceHolderz�
    PlaceHolder instances are used in the Manager logger hierarchy to take
    the place of nodes for which no loggers have been defined. This class is
    intended for internal use only and not as part of the public API.
    cCs|di|_dS)zY
        Initialize with the specified logger being a child of this placeholder.
        N��	loggerMap�r��aloggerr7r7r8r��szPlaceHolder.__init__cCs||jkrd|j|<dS)zJ
        Add the specified logger as a child of this placeholder.
        Nr&r(r7r7r8r��s
zPlaceHolder.appendN)r�r�r�r�r�r�r7r7r7r8r%�sr%cCs(|tkr t|t�s td|j��|adS)z�
    Set the class to be used when instantiating a logger. The class should
    define __init__() such that only a name argument is required, and the
    __init__() should call Logger.__init__()
    �(logger not derived from logging.Logger: N)r�
issubclassrJr��_loggerClass)�klassr7r7r8r%�s
�cCstS)zB
    Return the class to be used when instantiating a logger.
    )r,r7r7r7r8r!�sc@sbeZdZdZdd�Zedd��Zejdd��Zdd�Zd	d
�Z	dd�Z
d
d�Zdd�Zdd�Z
dS)�Managerzt
    There is [under normal circumstances] just one Manager instance, which
    holds the hierarchy of loggers.
    cCs(||_d|_d|_i|_d|_d|_dS)zT
        Initialize the manager with the root node of the logger hierarchy.
        rFN)�rootr�emittedNoHandlerWarning�
loggerDict�loggerClass�logRecordFactory)r�Zrootnoder7r7r8r��szManager.__init__cCs|jSrQ)�_disabler�r7r7r8r�szManager.disablecCst|�|_dSrQ)rLr4�r��valuer7r7r8rscCs�d}t|t�std��t�z�||jkrv|j|}t|t�r�|}|jpHt|�}||_	||j|<|�
||�|�|�n(|jp~t|�}||_	||j|<|�|�W5t�X|S)a�
        Get a logger with the specified name (channel name), creating it
        if it doesn't yet exist. This name is a dot-separated hierarchical
        name, such as "a", "a.b", "a.b.c" or similar.

        If a PlaceHolder existed for the specified name [i.e. the logger
        didn't exist but a child of it did], replace it with the created
        logger and fix up the parent/child references which pointed to the
        placeholder to now point to the logger.
        NzA logger name must be a string)rFrHrJr9r:r1r%r2r,�manager�_fixupChildren�
_fixupParents)r�rbrK�phr7r7r8r s(





zManager.getLoggercCs*|tkr t|t�s td|j��||_dS)zY
        Set the class to be used when instantiating a logger with this Manager.
        r*N)rr+rJr�r2)r�r-r7r7r8r%&s
�zManager.setLoggerClasscCs
||_dS)zg
        Set the factory to be used when instantiating a log record with this
        Manager.
        N)r3)r�r�r7r7r8r*0szManager.setLogRecordFactorycCs�|j}|�d�}d}|dkr�|s�|d|�}||jkrFt|�|j|<n2|j|}t|t�r`|}nt|t�snt�|�|�|�dd|d�}q|s�|j}||_	dS)z�
        Ensure that there are either loggers or placeholders all the way
        from the specified logger to the root of the logger hierarchy.
        r�Nrr_)
rb�rfindr1r%rFr�AssertionErrorr�r/�parent)r�r)rb�irKZsubstr�objr7r7r8r97s 




zManager._fixupParentscCsD|j}t|�}|j��D]&}|jjd|�|kr|j|_||_qdS)zk
        Ensure that children of the placeholder ph are connected to the
        specified logger.
        N)rbrdr'r�r=)r�r:r)rbZnamelen�cr7r7r8r8OszManager._fixupChildrencCs@t�|j��D]}t|t�r|j��q|jj��t�dS)zj
        Clear the cache for all loggers in loggerDict
        Called when level changes are made
        N)	r9r1�valuesrFr�_cache�clearr/r:�r��loggerr7r7r8�_clear_cache\s
zManager._clear_cacheN)r�r�r�r�r�rr�setterr r%r*r9r8rFr7r7r7r8r.�s

"

r.c@s�eZdZdZefdd�Zdd�Zdd�Zdd	�Zd
d�Z	dd
�Z
dd�Zdd�dd�Zdd�Z
e
Zdd�Zd5dd�Zd6dd�Zd7dd �Zd!d"�Zd#d$�Zd%d&�Zd'd(�Zd)d*�Zd+d,�Zd-d.�Zd/d0�Zd1d2�Zd3d4�ZdS)8rar
    Instances of the Logger class represent a single logging channel. A
    "logging channel" indicates an area of an application. Exactly how an
    "area" is defined is up to the application developer. Since an
    application can have any number of areas, logging channels are identified
    by a unique string. Application areas can be nested (e.g. an area
    of "input processing" might include sub-areas "read CSV files", "read
    XLS files" and "read Gnumeric files"). To cater for this natural nesting,
    channel names are organized into a namespace hierarchy where levels are
    separated by periods, much like the Java or Python package namespace. So
    in the instance given above, channel names might be "input" for the upper
    level, and "input.csv", "input.xls" and "input.gnu" for the sub-levels.
    There is no arbitrary limit to the depth of nesting.
    cCs<t�|�||_t|�|_d|_d|_g|_d|_i|_	dS)zJ
        Initialize the logger with a name and an optional level.
        NTF)
r�r�rbrLr5r=�	propagater��disabledrB)r�rbr5r7r7r8r�|s

zLogger.__init__cCst|�|_|j��dS)zW
        Set the logging level of this logger.  level must be an int or a str.
        N)rLr5r7rFr�r7r7r8r�s
zLogger.setLevelcOs |�t�r|jt||f|�dS)z�
        Log 'msg % args' with severity 'DEBUG'.

        To pass exception information, use the keyword argument exc_info with
        a true value, e.g.

        logger.debug("Houston, we have a %s", "thorny problem", exc_info=1)
        N)�isEnabledForr�_log�r�rcrhr�r7r7r8r�s	
zLogger.debugcOs |�t�r|jt||f|�dS)z�
        Log 'msg % args' with severity 'INFO'.

        To pass exception information, use the keyword argument exc_info with
        a true value, e.g.

        logger.info("Houston, we have a %s", "interesting problem", exc_info=1)
        N)rJr
rKrLr7r7r8r"�s	
zLogger.infocOs |�t�r|jt||f|�dS)z�
        Log 'msg % args' with severity 'WARNING'.

        To pass exception information, use the keyword argument exc_info with
        a true value, e.g.

        logger.warning("Houston, we have a %s", "bit of a problem", exc_info=1)
        N)rJrrKrLr7r7r8r(�s	
zLogger.warningcOs$t�dtd�|j|f|�|�dS�Nz6The 'warn' method is deprecated, use 'warning' insteadr@��warningsr'�DeprecationWarningr(rLr7r7r8r'�s
�zLogger.warncOs |�t�r|jt||f|�dS)z�
        Log 'msg % args' with severity 'ERROR'.

        To pass exception information, use the keyword argument exc_info with
        a true value, e.g.

        logger.error("Houston, we have a %s", "major problem", exc_info=1)
        N)rJrrKrLr7r7r8r�s	
zLogger.errorT�rBcOs|j|f|�d|i|��dS)zU
        Convenience method for logging an ERROR with exception information.
        rBN�r�r�rcrBrhr�r7r7r8r�szLogger.exceptioncOs |�t�r|jt||f|�dS)z�
        Log 'msg % args' with severity 'CRITICAL'.

        To pass exception information, use the keyword argument exc_info with
        a true value, e.g.

        logger.critical("Houston, we have a %s", "major disaster", exc_info=1)
        N)rJrrKrLr7r7r8r�s	
zLogger.criticalcOs<t|t�strtd��ndS|�|�r8|j|||f|�dS)z�
        Log 'msg % args' with the integer severity 'level'.

        To pass exception information, use the keyword argument exc_info with
        a true value, e.g.

        logger.log(level, "We have a %s", "mysterious problem", exc_info=1)
        zlevel must be an integerN)rFrGr,rJrJrK�r�r5rcrhr�r7r7r8r#�s	


z
Logger.logFr_c
Cs�t�}|dk	r|j}|}|r4|dkr4|j}|d8}q|s<|}d}t|d�r�|j}tj�|j�}|tkrn|j}q@d}|r�t	�
�}	|	�d�tj
||	d�|	��}|ddkr�|dd�}|	��|j|j|j|f}q�q@|S)	z�
        Find the stack frame of the caller so that we can note the source
        file name, line number and function name.
        Nr_)�(unknown file)r�(unknown function)Nr	zStack (most recent call last):
rWr�r�)rErDrr	rkrl�normcaser
�_srcfiler�r�rr�rr�r��f_lineno�co_name)
r�rs�
stacklevelr�Zorig_frK�cornr�r�r7r7r8�
findCaller�s8


zLogger.findCallerNc

CsZt|||||||||
�	}|	dk	rV|	D]0}|dks:||jkrFtd|��|	||j|<q$|S)zr
        A factory method which can be overridden in subclasses to create
        specialized LogRecords.
        N)r�r�z$Attempt to overwrite %r in LogRecord)r�r�r�)
r�rbr5�fn�lnorcrhrBr��extrar�rK�keyr7r7r8�
makeRecords�zLogger.makeRecordc
Cs�d}trBz|�||�\}	}
}}WqLtk
r>d\}	}
}YqLXn
d\}	}
}|r~t|t�rlt|�||jf}nt|t�s~t�	�}|�
|j||	|
||||||�
}|�|�dS)z�
        Low-level logging routine which creates a LogRecord and then calls
        all the handlers of this logger to handle the record.
        N)rUrrV)
rXr]rIrF�
BaseException�type�
__traceback__�tupler=rBrbrbr)
r�r5rcrhrBr`rsr[r�r^r_r�r�r7r7r8rKs&


�zLogger._logcCs|js|�|�r|�|�dS)z�
        Call the handlers for the specified record.

        This method is used for unpickled records received from a socket, as
        well as those created locally. Logger-level filtering is applied.
        N)rIr��callHandlersr�r7r7r8r7sz
Logger.handlecCs.t�z||jkr|j�|�W5t�XdS)z;
        Add the specified handler to this logger.
        N)r9r:r�r��r��hdlrr7r7r8�
addHandlerAs

zLogger.addHandlercCs.t�z||jkr|j�|�W5t�XdS)z@
        Remove the specified handler from this logger.
        N)r9r:r�r�rhr7r7r8�
removeHandlerLs

zLogger.removeHandlercCs.|}d}|r*|jrd}q*|js"q*q|j}q|S)a�
        See if this logger has any handlers configured.

        Loop through all handlers for this logger and its parents in the
        logger hierarchy. Return True if a handler was found, else False.
        Stop searching up the hierarchy whenever a logger with the "propagate"
        attribute set to zero is found - that will be the last logger which
        is checked for the existence of handlers.
        FT)r�rHr=)r�r@rKr7r7r8�hasHandlersWs
zLogger.hasHandlerscCs�|}d}|rJ|jD]"}|d}|j|jkr|�|�q|jsBd}q|j}q|dkr�trn|jtjkr�t�|�n&tr�|jj	s�t
j�d|j
�d|j_	dS)a�
        Pass a record to all relevant handlers.

        Loop through all handlers for this logger and its parents in the
        logger hierarchy. If no handler was found, output a one-off error
        message to sys.stderr. Stop searching up the hierarchy whenever a
        logger with the "propagate" attribute set to zero is found - that
        will be the last logger whose handlers are called.
        rr_Nz+No handlers could be found for logger "%s"
T)r�rir5rrHr=r+r,r7r0r=r[rrb)r�r�r@�foundrir7r7r8rgms&

�zLogger.callHandlerscCs |}|r|jr|jS|j}qtS)z�
        Get the effective level for this logger.

        Loop through this logger and its parents in the logger hierarchy,
        looking for a non-zero logging level. Return the first one found.
        )r5r=rrDr7r7r8�getEffectiveLevel�szLogger.getEffectiveLevelc
Csz|jr
dSz|j|WStk
rtt�z6|jj|krJd}|j|<n||��k}|j|<W5t�X|YSXdS)�;
        Is this logger enabled for level 'level'?
        FN)rIrBr�r9r:r7rrn)r�r5Z
is_enabledr7r7r8rJ�s
�zLogger.isEnabledForcCs&|j|k	rd�|j|f�}|j�|�S)ab
        Get a logger which is a descendant to this one.

        This is a convenience method, such that

        logging.getLogger('abc').getChild('def.ghi')

        is the same as

        logging.getLogger('abc.def.ghi')

        It's useful, for example, when the parent logger is named using
        __name__ rather than a literal string.
        r�)r/r�rbr7r )r��suffixr7r7r8�getChild�s
zLogger.getChildcCs t|���}d|jj|j|fSr#)rrnrr�rbr�r7r7r8r��szLogger.__repr__cCs,t|j�|k	r ddl}|�d��t|jffS)Nrzlogger cannot be pickled)r rb�pickleZ
PicklingError)r�rrr7r7r8�
__reduce__�s
zLogger.__reduce__)Fr_)NNN)NNFr_)r�r�r�r�rr�rrr"r(r'rrrrr#r]rbrKrrjrkrlrgrnrJrqr�rsr7r7r7r8rms<

%�
�

c@s eZdZdZdd�Zdd�ZdS)�
RootLoggerz�
    A root logger is not that different to any other logger, except that
    it must have a logging level and there is only one instance of it in
    the hierarchy.
    cCst�|d|�dS)z=
        Initialize the logger with the name "root".
        r/N)rr�r�r7r7r8r��szRootLogger.__init__cCstdfS)Nr7)r r�r7r7r8rs�szRootLogger.__reduce__N)r�r�r�r�r�rsr7r7r7r8rt�srtc@s�eZdZdZdd�Zdd�Zdd�Zdd	�Zd
d�Zdd
�Z	dd�Z
dd�dd�Zdd�Zdd�Z
dd�Zdd�Zdd�Zdd�Zd+d"d#�Zed$d%��Zejd&d%��Zed'd(��Zd)d*�Zd S),rzo
    An adapter for loggers which makes it easier to specify contextual
    information in logging output.
    cCs||_||_dS)ax
        Initialize the adapter with a logger and a dict-like object which
        provides contextual information. This constructor signature allows
        easy stacking of LoggerAdapters, if so desired.

        You can effectively pass keyword arguments as shown in the
        following example:

        adapter = LoggerAdapter(someLogger, dict(p1=v1, p2="v2"))
        N)rEr`)r�rEr`r7r7r8r��szLoggerAdapter.__init__cCs|j|d<||fS)a�
        Process the logging message and keyword arguments passed in to
        a logging call to insert contextual information. You can either
        manipulate the message itself, the keyword args or both. Return
        the message and kwargs modified (or not) to suit your needs.

        Normally, you'll only need to override this one method in a
        LoggerAdapter subclass for your specific needs.
        r`)r`)r�rcr�r7r7r8r��s

zLoggerAdapter.processcOs|jt|f|�|�dS)zA
        Delegate a debug call to the underlying logger.
        N)r#rrLr7r7r8rszLoggerAdapter.debugcOs|jt|f|�|�dS)zA
        Delegate an info call to the underlying logger.
        N)r#r
rLr7r7r8r"
szLoggerAdapter.infocOs|jt|f|�|�dS)zC
        Delegate a warning call to the underlying logger.
        N)r#rrLr7r7r8r(szLoggerAdapter.warningcOs$t�dtd�|j|f|�|�dSrMrNrLr7r7r8r's
�zLoggerAdapter.warncOs|jt|f|�|�dS)zB
        Delegate an error call to the underlying logger.
        N�r#rrLr7r7r8rszLoggerAdapter.errorTrQcOs |jt|f|�d|i|��dS)zF
        Delegate an exception call to the underlying logger.
        rBNrurSr7r7r8r!szLoggerAdapter.exceptioncOs|jt|f|�|�dS)zD
        Delegate a critical call to the underlying logger.
        N)r#rrLr7r7r8r'szLoggerAdapter.criticalcOs4|�|�r0|�||�\}}|jj||f|�|�dS)z�
        Delegate a log call to the underlying logger, after adding
        contextual information from this adapter instance.
        N)rJr�rEr#rTr7r7r8r#-s
zLoggerAdapter.logcCs|j�|�S)ro)rErJr�r7r7r8rJ6szLoggerAdapter.isEnabledForcCs|j�|�dS)zC
        Set the specified level on the underlying logger.
        N)rErr�r7r7r8r<szLoggerAdapter.setLevelcCs
|j��S)zD
        Get the effective level for the underlying logger.
        )rErnr�r7r7r8rnBszLoggerAdapter.getEffectiveLevelcCs
|j��S)z@
        See if the underlying logger has any handlers.
        )rErlr�r7r7r8rlHszLoggerAdapter.hasHandlersNFcCs|jj||||||d�S)zX
        Low-level log implementation, proxied to allow nested logger adapters.
        )rBr`rs)rErK)r�r5rcrhrBr`rsr7r7r8rKNs�zLoggerAdapter._logcCs|jjSrQ�rEr7r�r7r7r8r7[szLoggerAdapter.managercCs||j_dSrQrvr5r7r7r8r7_scCs|jjSrQ)rErbr�r7r7r8rbcszLoggerAdapter.namecCs&|j}t|���}d|jj|j|fSr#)rErrnrr�rb)r�rEr5r7r7r8r�gszLoggerAdapter.__repr__)NNF)r�r�r�r�r�r�rr"r(r'rrrr#rJrrnrlrKrr7rGrbr�r7r7r7r8r�s.	




c
Ks�t��z�|�dd�}|r@tjdd�D]}t�|�|��q(ttj�dk�r�|�dd�}|dkr~d|kr�d|kr�td��nd|ks�d|kr�td	��|dkr�|�dd�}|�d
d�}|r�t	||�}n|�dd�}t
|�}|g}|�dd�}|�d
d�}|tk�rtdd�t�
����|�dt|d�}	t|	||�}
|D]&}|jdk�rV|�|
�t�|��q<|�dd�}|dk	�r�t�|�|�r�d�|�
��}td|��W5t�XdS)a'
    Do basic configuration for the logging system.

    This function does nothing if the root logger already has handlers
    configured, unless the keyword argument *force* is set to ``True``.
    It is a convenience method intended for use by simple scripts
    to do one-shot configuration of the logging package.

    The default behaviour is to create a StreamHandler which writes to
    sys.stderr, set a formatter using the BASIC_FORMAT format string, and
    add the handler to the root logger.

    A number of optional keyword arguments may be specified, which can alter
    the default behaviour.

    filename  Specifies that a FileHandler be created, using the specified
              filename, rather than a StreamHandler.
    filemode  Specifies the mode to open the file, if filename is specified
              (if filemode is unspecified, it defaults to 'a').
    format    Use the specified format string for the handler.
    datefmt   Use the specified date/time format.
    style     If a format string is specified, use this to specify the
              type of format string (possible values '%', '{', '$', for
              %-formatting, :meth:`str.format` and :class:`string.Template`
              - defaults to '%').
    level     Set the root logger level to the specified level.
    stream    Use the specified stream to initialize the StreamHandler. Note
              that this argument is incompatible with 'filename' - if both
              are present, 'stream' is ignored.
    handlers  If specified, this should be an iterable of already created
              handlers, which will be added to the root handler. Any handler
              in the list which does not have a formatter assigned will be
              assigned the formatter created in this function.
    force     If this keyword  is specified as true, any existing handlers
              attached to the root logger are removed and closed, before
              carrying out the configuration as specified by the other
              arguments.
    Note that you could specify a stream created using open(filename, mode)
    rather than passing the filename and mode in. However, it should be
    remembered that StreamHandler does not close its stream (since it may be
    using sys.stdout or sys.stderr), whereas FileHandler closes its stream
    when the handler is closed.

    .. versionchanged:: 3.8
       Added the ``force`` parameter.

    .. versionchanged:: 3.2
       Added the ``style`` parameter.

    .. versionchanged:: 3.3
       Added the ``handlers`` parameter. A ``ValueError`` is now thrown for
       incompatible arguments (e.g. ``handlers`` specified together with
       ``filename``/``filemode``, or ``filename``/``filemode`` specified
       together with ``stream``, or ``handlers`` specified together with
       ``stream``.
    �forceFNrr�rrnz8'stream' and 'filename' should not be specified togetherzG'stream' or 'filename' should not be specified together with 'handlers'�filemoderr�r�r�r�r�r�r_r5z, zUnrecognised argument(s): %s)r9r:�popr/r�rkr�rdrIr
rr�r�r�rr�rrjr)
r�rw�hr�rnrrZdfsr�Zfsr�r5r�r7r7r8rtsR;



�


cCs|rtj�|�StSdS)z�
    Return a logger with the specified name, creating it if necessary.

    If no name is specified, return the root logger.
    N)rr7r r/)rbr7r7r8r �scOs*ttj�dkrt�tj|f|�|�dS)z�
    Log a message with severity 'CRITICAL' on the root logger. If the logger
    has no handlers, call basicConfig() to add a console handler with a
    pre-defined format.
    rN)rdr/r�rr�rcrhr�r7r7r8r�scOs*ttj�dkrt�tj|f|�|�dS)z�
    Log a message with severity 'ERROR' on the root logger. If the logger has
    no handlers, call basicConfig() to add a console handler with a pre-defined
    format.
    rN)rdr/r�rrr{r7r7r8r�srQcOst|f|�d|i|��dS)z�
    Log a message with severity 'ERROR' on the root logger, with exception
    information. If the logger has no handlers, basicConfig() is called to add
    a console handler with a pre-defined format.
    rBNrR)rcrBrhr�r7r7r8rscOs*ttj�dkrt�tj|f|�|�dS)z�
    Log a message with severity 'WARNING' on the root logger. If the logger has
    no handlers, call basicConfig() to add a console handler with a pre-defined
    format.
    rN)rdr/r�rr(r{r7r7r8r(scOs"t�dtd�t|f|�|�dS)Nz8The 'warn' function is deprecated, use 'warning' insteadr@rNr{r7r7r8r's
�cOs*ttj�dkrt�tj|f|�|�dS)z�
    Log a message with severity 'INFO' on the root logger. If the logger has
    no handlers, call basicConfig() to add a console handler with a pre-defined
    format.
    rN)rdr/r�rr"r{r7r7r8r"scOs*ttj�dkrt�tj|f|�|�dS)z�
    Log a message with severity 'DEBUG' on the root logger. If the logger has
    no handlers, call basicConfig() to add a console handler with a pre-defined
    format.
    rN)rdr/r�rrr{r7r7r8r$scOs,ttj�dkrt�tj||f|�|�dS)z�
    Log 'msg % args' with the integer severity 'level' on the root logger. If
    the logger has no handlers, call basicConfig() to add a console handler
    with a pre-defined format.
    rN)rdr/r�rr#)r5rcrhr�r7r7r8r#.scCs|tj_tj��dS)zB
    Disable all logging calls of severity 'level' and below.
    N)r/r7rrF)r5r7r7r8r8sc
Cs�t|dd��D]l}zT|�}|rfz:z|��|��|��Wnttfk
rVYnXW5|��XWqtrv�YqXqdS)z�
    Perform any cleanup actions in the logging system (e.g. flushing
    buffers).

    Should be called at application exit.
    N)�reversedrOrNrr�rrIr,)ZhandlerListr�rzr7r7r8r&?s
c@s(eZdZdZdd�Zdd�Zdd�ZdS)	ra�
    This handler does nothing. It's intended to be used to avoid the
    "No handlers could be found for logger XXX" one-off warning. This is
    important for library code, which may contain code to log events. If a user
    of the library does not configure logging, the one-off warning might be
    produced; to avoid this, the library developer simply needs to instantiate
    a NullHandler and add it to the top-level logger of the library module or
    package.
    cCsdS�zStub.Nr7r�r7r7r8rmszNullHandler.handlecCsdSr}r7r�r7r7r8rpszNullHandler.emitcCs
d|_dSrQ)rr�r7r7r8rYsszNullHandler.createLockN)r�r�r�r�rrrYr7r7r7r8rcs	cCs`|dk	r$tdk	r\t||||||�n8t�|||||�}td�}|jsP|�t��|�d|�dS)a�
    Implementation of showwarnings which redirects to logging, which will first
    check to see if the file parameter is None. If a file is specified, it will
    delegate to the original warnings implementation of showwarning. Otherwise,
    it will call warnings.formatwarning and will log the resulting string to a
    warnings logger named "py.warnings" with level logging.WARNING.
    Nzpy.warningsz%s)�_warnings_showwarningrO�
formatwarningr r�rjrr()r��categoryrnrtrX�liner�rEr7r7r8�_showwarningzsr�cCs0|rtdkr,tjatt_ntdk	r,tt_dadS)z�
    If capture is true, redirect all warnings to the logging package.
    If capture is False, ensure that warnings are not redirected to logging
    but to their original destinations.
    N)r~rO�showwarningr�)Zcapturer7r7r8r�s)N)NN)or�r=rkrar�r�r�rOr�Zcollections.abcre�stringrrZStrFormatter�__all__ry�
__author__Z
__status__�__version__Z__date__rwr,rxr|r~rr	rrrr
rrr2r4rrrrErlrW�__code__r
rXrLr�rMr9r:rTZWeakSetrUr^rP�objectrr�r*r)r$r�r�r�r�rr�r�rrr�ZWeakValueDictionaryr�r�r�r�rrr
r$Z_defaultLastResortr+r%r%r!r.rrtr,rr/r7rr rrrrr(r'r"rr#rr&�atexit�registerrr~r�rr7r7r7r8�<module>sN	H
�
	
�	�

	

�	g
�1*%4
>SE
d
n








config.py000064400000107005150327210150006362 0ustar00# Copyright 2001-2019 by Vinay Sajip. All Rights Reserved.
#
# Permission to use, copy, modify, and distribute this software and its
# documentation for any purpose and without fee is hereby granted,
# provided that the above copyright notice appear in all copies and that
# both that copyright notice and this permission notice appear in
# supporting documentation, and that the name of Vinay Sajip
# not be used in advertising or publicity pertaining to distribution
# of the software without specific, written prior permission.
# VINAY SAJIP DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
# ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL
# VINAY SAJIP BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
# ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER
# IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.

"""
Configuration functions for the logging package for Python. The core package
is based on PEP 282 and comments thereto in comp.lang.python, and influenced
by Apache's log4j system.

Copyright (C) 2001-2019 Vinay Sajip. All Rights Reserved.

To use, simply 'import logging' and log away!
"""

import errno
import io
import logging
import logging.handlers
import re
import struct
import sys
import threading
import traceback

from socketserver import ThreadingTCPServer, StreamRequestHandler


DEFAULT_LOGGING_CONFIG_PORT = 9030

RESET_ERROR = errno.ECONNRESET

#
#   The following code implements a socket listener for on-the-fly
#   reconfiguration of logging.
#
#   _listener holds the server object doing the listening
_listener = None

def fileConfig(fname, defaults=None, disable_existing_loggers=True):
    """
    Read the logging configuration from a ConfigParser-format file.

    This can be called several times from an application, allowing an end user
    the ability to select from various pre-canned configurations (if the
    developer provides a mechanism to present the choices and load the chosen
    configuration).
    """
    import configparser

    if isinstance(fname, configparser.RawConfigParser):
        cp = fname
    else:
        cp = configparser.ConfigParser(defaults)
        if hasattr(fname, 'readline'):
            cp.read_file(fname)
        else:
            cp.read(fname)

    formatters = _create_formatters(cp)

    # critical section
    logging._acquireLock()
    try:
        _clearExistingHandlers()

        # Handlers add themselves to logging._handlers
        handlers = _install_handlers(cp, formatters)
        _install_loggers(cp, handlers, disable_existing_loggers)
    finally:
        logging._releaseLock()


def _resolve(name):
    """Resolve a dotted name to a global object."""
    name = name.split('.')
    used = name.pop(0)
    found = __import__(used)
    for n in name:
        used = used + '.' + n
        try:
            found = getattr(found, n)
        except AttributeError:
            __import__(used)
            found = getattr(found, n)
    return found

def _strip_spaces(alist):
    return map(str.strip, alist)

def _create_formatters(cp):
    """Create and return formatters"""
    flist = cp["formatters"]["keys"]
    if not len(flist):
        return {}
    flist = flist.split(",")
    flist = _strip_spaces(flist)
    formatters = {}
    for form in flist:
        sectname = "formatter_%s" % form
        fs = cp.get(sectname, "format", raw=True, fallback=None)
        dfs = cp.get(sectname, "datefmt", raw=True, fallback=None)
        stl = cp.get(sectname, "style", raw=True, fallback='%')
        c = logging.Formatter
        class_name = cp[sectname].get("class")
        if class_name:
            c = _resolve(class_name)
        f = c(fs, dfs, stl)
        formatters[form] = f
    return formatters


def _install_handlers(cp, formatters):
    """Install and return handlers"""
    hlist = cp["handlers"]["keys"]
    if not len(hlist):
        return {}
    hlist = hlist.split(",")
    hlist = _strip_spaces(hlist)
    handlers = {}
    fixups = [] #for inter-handler references
    for hand in hlist:
        section = cp["handler_%s" % hand]
        klass = section["class"]
        fmt = section.get("formatter", "")
        try:
            klass = eval(klass, vars(logging))
        except (AttributeError, NameError):
            klass = _resolve(klass)
        args = section.get("args", '()')
        args = eval(args, vars(logging))
        kwargs = section.get("kwargs", '{}')
        kwargs = eval(kwargs, vars(logging))
        h = klass(*args, **kwargs)
        if "level" in section:
            level = section["level"]
            h.setLevel(level)
        if len(fmt):
            h.setFormatter(formatters[fmt])
        if issubclass(klass, logging.handlers.MemoryHandler):
            target = section.get("target", "")
            if len(target): #the target handler may not be loaded yet, so keep for later...
                fixups.append((h, target))
        handlers[hand] = h
    #now all handlers are loaded, fixup inter-handler references...
    for h, t in fixups:
        h.setTarget(handlers[t])
    return handlers

def _handle_existing_loggers(existing, child_loggers, disable_existing):
    """
    When (re)configuring logging, handle loggers which were in the previous
    configuration but are not in the new configuration. There's no point
    deleting them as other threads may continue to hold references to them;
    and by disabling them, you stop them doing any logging.

    However, don't disable children of named loggers, as that's probably not
    what was intended by the user. Also, allow existing loggers to NOT be
    disabled if disable_existing is false.
    """
    root = logging.root
    for log in existing:
        logger = root.manager.loggerDict[log]
        if log in child_loggers:
            if not isinstance(logger, logging.PlaceHolder):
                logger.setLevel(logging.NOTSET)
                logger.handlers = []
                logger.propagate = True
        else:
            logger.disabled = disable_existing

def _install_loggers(cp, handlers, disable_existing):
    """Create and install loggers"""

    # configure the root first
    llist = cp["loggers"]["keys"]
    llist = llist.split(",")
    llist = list(_strip_spaces(llist))
    llist.remove("root")
    section = cp["logger_root"]
    root = logging.root
    log = root
    if "level" in section:
        level = section["level"]
        log.setLevel(level)
    for h in root.handlers[:]:
        root.removeHandler(h)
    hlist = section["handlers"]
    if len(hlist):
        hlist = hlist.split(",")
        hlist = _strip_spaces(hlist)
        for hand in hlist:
            log.addHandler(handlers[hand])

    #and now the others...
    #we don't want to lose the existing loggers,
    #since other threads may have pointers to them.
    #existing is set to contain all existing loggers,
    #and as we go through the new configuration we
    #remove any which are configured. At the end,
    #what's left in existing is the set of loggers
    #which were in the previous configuration but
    #which are not in the new configuration.
    existing = list(root.manager.loggerDict.keys())
    #The list needs to be sorted so that we can
    #avoid disabling child loggers of explicitly
    #named loggers. With a sorted list it is easier
    #to find the child loggers.
    existing.sort()
    #We'll keep the list of existing loggers
    #which are children of named loggers here...
    child_loggers = []
    #now set up the new ones...
    for log in llist:
        section = cp["logger_%s" % log]
        qn = section["qualname"]
        propagate = section.getint("propagate", fallback=1)
        logger = logging.getLogger(qn)
        if qn in existing:
            i = existing.index(qn) + 1 # start with the entry after qn
            prefixed = qn + "."
            pflen = len(prefixed)
            num_existing = len(existing)
            while i < num_existing:
                if existing[i][:pflen] == prefixed:
                    child_loggers.append(existing[i])
                i += 1
            existing.remove(qn)
        if "level" in section:
            level = section["level"]
            logger.setLevel(level)
        for h in logger.handlers[:]:
            logger.removeHandler(h)
        logger.propagate = propagate
        logger.disabled = 0
        hlist = section["handlers"]
        if len(hlist):
            hlist = hlist.split(",")
            hlist = _strip_spaces(hlist)
            for hand in hlist:
                logger.addHandler(handlers[hand])

    #Disable any old loggers. There's no point deleting
    #them as other threads may continue to hold references
    #and by disabling them, you stop them doing any logging.
    #However, don't disable children of named loggers, as that's
    #probably not what was intended by the user.
    #for log in existing:
    #    logger = root.manager.loggerDict[log]
    #    if log in child_loggers:
    #        logger.level = logging.NOTSET
    #        logger.handlers = []
    #        logger.propagate = 1
    #    elif disable_existing_loggers:
    #        logger.disabled = 1
    _handle_existing_loggers(existing, child_loggers, disable_existing)


def _clearExistingHandlers():
    """Clear and close existing handlers"""
    logging._handlers.clear()
    logging.shutdown(logging._handlerList[:])
    del logging._handlerList[:]


IDENTIFIER = re.compile('^[a-z_][a-z0-9_]*$', re.I)


def valid_ident(s):
    m = IDENTIFIER.match(s)
    if not m:
        raise ValueError('Not a valid Python identifier: %r' % s)
    return True


class ConvertingMixin(object):
    """For ConvertingXXX's, this mixin class provides common functions"""

    def convert_with_key(self, key, value, replace=True):
        result = self.configurator.convert(value)
        #If the converted value is different, save for next time
        if value is not result:
            if replace:
                self[key] = result
            if type(result) in (ConvertingDict, ConvertingList,
                               ConvertingTuple):
                result.parent = self
                result.key = key
        return result

    def convert(self, value):
        result = self.configurator.convert(value)
        if value is not result:
            if type(result) in (ConvertingDict, ConvertingList,
                               ConvertingTuple):
                result.parent = self
        return result


# The ConvertingXXX classes are wrappers around standard Python containers,
# and they serve to convert any suitable values in the container. The
# conversion converts base dicts, lists and tuples to their wrapped
# equivalents, whereas strings which match a conversion format are converted
# appropriately.
#
# Each wrapper should have a configurator attribute holding the actual
# configurator to use for conversion.

class ConvertingDict(dict, ConvertingMixin):
    """A converting dictionary wrapper."""

    def __getitem__(self, key):
        value = dict.__getitem__(self, key)
        return self.convert_with_key(key, value)

    def get(self, key, default=None):
        value = dict.get(self, key, default)
        return self.convert_with_key(key, value)

    def pop(self, key, default=None):
        value = dict.pop(self, key, default)
        return self.convert_with_key(key, value, replace=False)

class ConvertingList(list, ConvertingMixin):
    """A converting list wrapper."""
    def __getitem__(self, key):
        value = list.__getitem__(self, key)
        return self.convert_with_key(key, value)

    def pop(self, idx=-1):
        value = list.pop(self, idx)
        return self.convert(value)

class ConvertingTuple(tuple, ConvertingMixin):
    """A converting tuple wrapper."""
    def __getitem__(self, key):
        value = tuple.__getitem__(self, key)
        # Can't replace a tuple entry.
        return self.convert_with_key(key, value, replace=False)

class BaseConfigurator(object):
    """
    The configurator base class which defines some useful defaults.
    """

    CONVERT_PATTERN = re.compile(r'^(?P<prefix>[a-z]+)://(?P<suffix>.*)$')

    WORD_PATTERN = re.compile(r'^\s*(\w+)\s*')
    DOT_PATTERN = re.compile(r'^\.\s*(\w+)\s*')
    INDEX_PATTERN = re.compile(r'^\[\s*(\w+)\s*\]\s*')
    DIGIT_PATTERN = re.compile(r'^\d+$')

    value_converters = {
        'ext' : 'ext_convert',
        'cfg' : 'cfg_convert',
    }

    # We might want to use a different one, e.g. importlib
    importer = staticmethod(__import__)

    def __init__(self, config):
        self.config = ConvertingDict(config)
        self.config.configurator = self

    def resolve(self, s):
        """
        Resolve strings to objects using standard import and attribute
        syntax.
        """
        name = s.split('.')
        used = name.pop(0)
        try:
            found = self.importer(used)
            for frag in name:
                used += '.' + frag
                try:
                    found = getattr(found, frag)
                except AttributeError:
                    self.importer(used)
                    found = getattr(found, frag)
            return found
        except ImportError:
            e, tb = sys.exc_info()[1:]
            v = ValueError('Cannot resolve %r: %s' % (s, e))
            v.__cause__, v.__traceback__ = e, tb
            raise v

    def ext_convert(self, value):
        """Default converter for the ext:// protocol."""
        return self.resolve(value)

    def cfg_convert(self, value):
        """Default converter for the cfg:// protocol."""
        rest = value
        m = self.WORD_PATTERN.match(rest)
        if m is None:
            raise ValueError("Unable to convert %r" % value)
        else:
            rest = rest[m.end():]
            d = self.config[m.groups()[0]]
            #print d, rest
            while rest:
                m = self.DOT_PATTERN.match(rest)
                if m:
                    d = d[m.groups()[0]]
                else:
                    m = self.INDEX_PATTERN.match(rest)
                    if m:
                        idx = m.groups()[0]
                        if not self.DIGIT_PATTERN.match(idx):
                            d = d[idx]
                        else:
                            try:
                                n = int(idx) # try as number first (most likely)
                                d = d[n]
                            except TypeError:
                                d = d[idx]
                if m:
                    rest = rest[m.end():]
                else:
                    raise ValueError('Unable to convert '
                                     '%r at %r' % (value, rest))
        #rest should be empty
        return d

    def convert(self, value):
        """
        Convert values to an appropriate type. dicts, lists and tuples are
        replaced by their converting alternatives. Strings are checked to
        see if they have a conversion format and are converted if they do.
        """
        if not isinstance(value, ConvertingDict) and isinstance(value, dict):
            value = ConvertingDict(value)
            value.configurator = self
        elif not isinstance(value, ConvertingList) and isinstance(value, list):
            value = ConvertingList(value)
            value.configurator = self
        elif not isinstance(value, ConvertingTuple) and\
                 isinstance(value, tuple) and not hasattr(value, '_fields'):
            value = ConvertingTuple(value)
            value.configurator = self
        elif isinstance(value, str): # str for py3k
            m = self.CONVERT_PATTERN.match(value)
            if m:
                d = m.groupdict()
                prefix = d['prefix']
                converter = self.value_converters.get(prefix, None)
                if converter:
                    suffix = d['suffix']
                    converter = getattr(self, converter)
                    value = converter(suffix)
        return value

    def configure_custom(self, config):
        """Configure an object with a user-supplied factory."""
        c = config.pop('()')
        if not callable(c):
            c = self.resolve(c)
        props = config.pop('.', None)
        # Check for valid identifiers
        kwargs = {k: config[k] for k in config if valid_ident(k)}
        result = c(**kwargs)
        if props:
            for name, value in props.items():
                setattr(result, name, value)
        return result

    def as_tuple(self, value):
        """Utility function which converts lists to tuples."""
        if isinstance(value, list):
            value = tuple(value)
        return value

class DictConfigurator(BaseConfigurator):
    """
    Configure logging using a dictionary-like object to describe the
    configuration.
    """

    def configure(self):
        """Do the configuration."""

        config = self.config
        if 'version' not in config:
            raise ValueError("dictionary doesn't specify a version")
        if config['version'] != 1:
            raise ValueError("Unsupported version: %s" % config['version'])
        incremental = config.pop('incremental', False)
        EMPTY_DICT = {}
        logging._acquireLock()
        try:
            if incremental:
                handlers = config.get('handlers', EMPTY_DICT)
                for name in handlers:
                    if name not in logging._handlers:
                        raise ValueError('No handler found with '
                                         'name %r'  % name)
                    else:
                        try:
                            handler = logging._handlers[name]
                            handler_config = handlers[name]
                            level = handler_config.get('level', None)
                            if level:
                                handler.setLevel(logging._checkLevel(level))
                        except Exception as e:
                            raise ValueError('Unable to configure handler '
                                             '%r' % name) from e
                loggers = config.get('loggers', EMPTY_DICT)
                for name in loggers:
                    try:
                        self.configure_logger(name, loggers[name], True)
                    except Exception as e:
                        raise ValueError('Unable to configure logger '
                                         '%r' % name) from e
                root = config.get('root', None)
                if root:
                    try:
                        self.configure_root(root, True)
                    except Exception as e:
                        raise ValueError('Unable to configure root '
                                         'logger') from e
            else:
                disable_existing = config.pop('disable_existing_loggers', True)

                _clearExistingHandlers()

                # Do formatters first - they don't refer to anything else
                formatters = config.get('formatters', EMPTY_DICT)
                for name in formatters:
                    try:
                        formatters[name] = self.configure_formatter(
                                                            formatters[name])
                    except Exception as e:
                        raise ValueError('Unable to configure '
                                         'formatter %r' % name) from e
                # Next, do filters - they don't refer to anything else, either
                filters = config.get('filters', EMPTY_DICT)
                for name in filters:
                    try:
                        filters[name] = self.configure_filter(filters[name])
                    except Exception as e:
                        raise ValueError('Unable to configure '
                                         'filter %r' % name) from e

                # Next, do handlers - they refer to formatters and filters
                # As handlers can refer to other handlers, sort the keys
                # to allow a deterministic order of configuration
                handlers = config.get('handlers', EMPTY_DICT)
                deferred = []
                for name in sorted(handlers):
                    try:
                        handler = self.configure_handler(handlers[name])
                        handler.name = name
                        handlers[name] = handler
                    except Exception as e:
                        if 'target not configured yet' in str(e.__cause__):
                            deferred.append(name)
                        else:
                            raise ValueError('Unable to configure handler '
                                             '%r' % name) from e

                # Now do any that were deferred
                for name in deferred:
                    try:
                        handler = self.configure_handler(handlers[name])
                        handler.name = name
                        handlers[name] = handler
                    except Exception as e:
                        raise ValueError('Unable to configure handler '
                                         '%r' % name) from e

                # Next, do loggers - they refer to handlers and filters

                #we don't want to lose the existing loggers,
                #since other threads may have pointers to them.
                #existing is set to contain all existing loggers,
                #and as we go through the new configuration we
                #remove any which are configured. At the end,
                #what's left in existing is the set of loggers
                #which were in the previous configuration but
                #which are not in the new configuration.
                root = logging.root
                existing = list(root.manager.loggerDict.keys())
                #The list needs to be sorted so that we can
                #avoid disabling child loggers of explicitly
                #named loggers. With a sorted list it is easier
                #to find the child loggers.
                existing.sort()
                #We'll keep the list of existing loggers
                #which are children of named loggers here...
                child_loggers = []
                #now set up the new ones...
                loggers = config.get('loggers', EMPTY_DICT)
                for name in loggers:
                    if name in existing:
                        i = existing.index(name) + 1 # look after name
                        prefixed = name + "."
                        pflen = len(prefixed)
                        num_existing = len(existing)
                        while i < num_existing:
                            if existing[i][:pflen] == prefixed:
                                child_loggers.append(existing[i])
                            i += 1
                        existing.remove(name)
                    try:
                        self.configure_logger(name, loggers[name])
                    except Exception as e:
                        raise ValueError('Unable to configure logger '
                                         '%r' % name) from e

                #Disable any old loggers. There's no point deleting
                #them as other threads may continue to hold references
                #and by disabling them, you stop them doing any logging.
                #However, don't disable children of named loggers, as that's
                #probably not what was intended by the user.
                #for log in existing:
                #    logger = root.manager.loggerDict[log]
                #    if log in child_loggers:
                #        logger.level = logging.NOTSET
                #        logger.handlers = []
                #        logger.propagate = True
                #    elif disable_existing:
                #        logger.disabled = True
                _handle_existing_loggers(existing, child_loggers,
                                         disable_existing)

                # And finally, do the root logger
                root = config.get('root', None)
                if root:
                    try:
                        self.configure_root(root)
                    except Exception as e:
                        raise ValueError('Unable to configure root '
                                         'logger') from e
        finally:
            logging._releaseLock()

    def configure_formatter(self, config):
        """Configure a formatter from a dictionary."""
        if '()' in config:
            factory = config['()'] # for use in exception handler
            try:
                result = self.configure_custom(config)
            except TypeError as te:
                if "'format'" not in str(te):
                    raise
                #Name of parameter changed from fmt to format.
                #Retry with old name.
                #This is so that code can be used with older Python versions
                #(e.g. by Django)
                config['fmt'] = config.pop('format')
                config['()'] = factory
                result = self.configure_custom(config)
        else:
            fmt = config.get('format', None)
            dfmt = config.get('datefmt', None)
            style = config.get('style', '%')
            cname = config.get('class', None)

            if not cname:
                c = logging.Formatter
            else:
                c = _resolve(cname)

            # A TypeError would be raised if "validate" key is passed in with a formatter callable
            # that does not accept "validate" as a parameter
            if 'validate' in config:  # if user hasn't mentioned it, the default will be fine
                result = c(fmt, dfmt, style, config['validate'])
            else:
                result = c(fmt, dfmt, style)

        return result

    def configure_filter(self, config):
        """Configure a filter from a dictionary."""
        if '()' in config:
            result = self.configure_custom(config)
        else:
            name = config.get('name', '')
            result = logging.Filter(name)
        return result

    def add_filters(self, filterer, filters):
        """Add filters to a filterer from a list of names."""
        for f in filters:
            try:
                filterer.addFilter(self.config['filters'][f])
            except Exception as e:
                raise ValueError('Unable to add filter %r' % f) from e

    def configure_handler(self, config):
        """Configure a handler from a dictionary."""
        config_copy = dict(config)  # for restoring in case of error
        formatter = config.pop('formatter', None)
        if formatter:
            try:
                formatter = self.config['formatters'][formatter]
            except Exception as e:
                raise ValueError('Unable to set formatter '
                                 '%r' % formatter) from e
        level = config.pop('level', None)
        filters = config.pop('filters', None)
        if '()' in config:
            c = config.pop('()')
            if not callable(c):
                c = self.resolve(c)
            factory = c
        else:
            cname = config.pop('class')
            klass = self.resolve(cname)
            #Special case for handler which refers to another handler
            if issubclass(klass, logging.handlers.MemoryHandler) and\
                'target' in config:
                try:
                    th = self.config['handlers'][config['target']]
                    if not isinstance(th, logging.Handler):
                        config.update(config_copy)  # restore for deferred cfg
                        raise TypeError('target not configured yet')
                    config['target'] = th
                except Exception as e:
                    raise ValueError('Unable to set target handler '
                                     '%r' % config['target']) from e
            elif issubclass(klass, logging.handlers.SMTPHandler) and\
                'mailhost' in config:
                config['mailhost'] = self.as_tuple(config['mailhost'])
            elif issubclass(klass, logging.handlers.SysLogHandler) and\
                'address' in config:
                config['address'] = self.as_tuple(config['address'])
            factory = klass
        props = config.pop('.', None)
        kwargs = {k: config[k] for k in config if valid_ident(k)}
        try:
            result = factory(**kwargs)
        except TypeError as te:
            if "'stream'" not in str(te):
                raise
            #The argument name changed from strm to stream
            #Retry with old name.
            #This is so that code can be used with older Python versions
            #(e.g. by Django)
            kwargs['strm'] = kwargs.pop('stream')
            result = factory(**kwargs)
        if formatter:
            result.setFormatter(formatter)
        if level is not None:
            result.setLevel(logging._checkLevel(level))
        if filters:
            self.add_filters(result, filters)
        if props:
            for name, value in props.items():
                setattr(result, name, value)
        return result

    def add_handlers(self, logger, handlers):
        """Add handlers to a logger from a list of names."""
        for h in handlers:
            try:
                logger.addHandler(self.config['handlers'][h])
            except Exception as e:
                raise ValueError('Unable to add handler %r' % h) from e

    def common_logger_config(self, logger, config, incremental=False):
        """
        Perform configuration which is common to root and non-root loggers.
        """
        level = config.get('level', None)
        if level is not None:
            logger.setLevel(logging._checkLevel(level))
        if not incremental:
            #Remove any existing handlers
            for h in logger.handlers[:]:
                logger.removeHandler(h)
            handlers = config.get('handlers', None)
            if handlers:
                self.add_handlers(logger, handlers)
            filters = config.get('filters', None)
            if filters:
                self.add_filters(logger, filters)

    def configure_logger(self, name, config, incremental=False):
        """Configure a non-root logger from a dictionary."""
        logger = logging.getLogger(name)
        self.common_logger_config(logger, config, incremental)
        propagate = config.get('propagate', None)
        if propagate is not None:
            logger.propagate = propagate

    def configure_root(self, config, incremental=False):
        """Configure a root logger from a dictionary."""
        root = logging.getLogger()
        self.common_logger_config(root, config, incremental)

dictConfigClass = DictConfigurator

def dictConfig(config):
    """Configure logging using a dictionary."""
    dictConfigClass(config).configure()


def listen(port=DEFAULT_LOGGING_CONFIG_PORT, verify=None):
    """
    Start up a socket server on the specified port, and listen for new
    configurations.

    These will be sent as a file suitable for processing by fileConfig().
    Returns a Thread object on which you can call start() to start the server,
    and which you can join() when appropriate. To stop the server, call
    stopListening().

    Use the ``verify`` argument to verify any bytes received across the wire
    from a client. If specified, it should be a callable which receives a
    single argument - the bytes of configuration data received across the
    network - and it should return either ``None``, to indicate that the
    passed in bytes could not be verified and should be discarded, or a
    byte string which is then passed to the configuration machinery as
    normal. Note that you can return transformed bytes, e.g. by decrypting
    the bytes passed in.
    """

    class ConfigStreamHandler(StreamRequestHandler):
        """
        Handler for a logging configuration request.

        It expects a completely new logging configuration and uses fileConfig
        to install it.
        """
        def handle(self):
            """
            Handle a request.

            Each request is expected to be a 4-byte length, packed using
            struct.pack(">L", n), followed by the config file.
            Uses fileConfig() to do the grunt work.
            """
            try:
                conn = self.connection
                chunk = conn.recv(4)
                if len(chunk) == 4:
                    slen = struct.unpack(">L", chunk)[0]
                    chunk = self.connection.recv(slen)
                    while len(chunk) < slen:
                        chunk = chunk + conn.recv(slen - len(chunk))
                    if self.server.verify is not None:
                        chunk = self.server.verify(chunk)
                    if chunk is not None:   # verified, can process
                        chunk = chunk.decode("utf-8")
                        try:
                            import json
                            d =json.loads(chunk)
                            assert isinstance(d, dict)
                            dictConfig(d)
                        except Exception:
                            #Apply new configuration.

                            file = io.StringIO(chunk)
                            try:
                                fileConfig(file)
                            except Exception:
                                traceback.print_exc()
                    if self.server.ready:
                        self.server.ready.set()
            except OSError as e:
                if e.errno != RESET_ERROR:
                    raise

    class ConfigSocketReceiver(ThreadingTCPServer):
        """
        A simple TCP socket-based logging config receiver.
        """

        allow_reuse_address = 1

        def __init__(self, host='localhost', port=DEFAULT_LOGGING_CONFIG_PORT,
                     handler=None, ready=None, verify=None):
            ThreadingTCPServer.__init__(self, (host, port), handler)
            logging._acquireLock()
            self.abort = 0
            logging._releaseLock()
            self.timeout = 1
            self.ready = ready
            self.verify = verify

        def serve_until_stopped(self):
            import select
            abort = 0
            while not abort:
                rd, wr, ex = select.select([self.socket.fileno()],
                                           [], [],
                                           self.timeout)
                if rd:
                    self.handle_request()
                logging._acquireLock()
                abort = self.abort
                logging._releaseLock()
            self.server_close()

    class Server(threading.Thread):

        def __init__(self, rcvr, hdlr, port, verify):
            super(Server, self).__init__()
            self.rcvr = rcvr
            self.hdlr = hdlr
            self.port = port
            self.verify = verify
            self.ready = threading.Event()

        def run(self):
            server = self.rcvr(port=self.port, handler=self.hdlr,
                               ready=self.ready,
                               verify=self.verify)
            if self.port == 0:
                self.port = server.server_address[1]
            self.ready.set()
            global _listener
            logging._acquireLock()
            _listener = server
            logging._releaseLock()
            server.serve_until_stopped()

    return Server(ConfigSocketReceiver, ConfigStreamHandler, port, verify)

def stopListening():
    """
    Stop the listening server which was created with a call to listen().
    """
    global _listener
    logging._acquireLock()
    try:
        if _listener:
            _listener.abort = 1
            _listener = None
    finally:
        logging._releaseLock()
config.pyc000064400000062532150327210520006533 0ustar00�
{fc@sdZddlZddlZddlZddlZddlZddlZddlZddlZddl	Z	ddl
Z
ddlZddlZyddl
Z
ddlZWnek
r�eZ
nXddlmZmZdZejZeaeed�Zd�Zd�Zd�Zd	�Zd
�Zd�Zej dej!�Z"d
�Z#de$fd��YZ%de&e%fd��YZ'de(e%fd��YZ)de*e%fd��YZ+de$fd��YZ,de,fd��YZ-e-Z.d�Z/ed�Z0d�Z1dS(s
Configuration functions for the logging package for Python. The core package
is based on PEP 282 and comments thereto in comp.lang.python, and influenced
by Apache's log4j system.

Copyright (C) 2001-2014 Vinay Sajip. All Rights Reserved.

To use, simply 'import logging' and log away!
i����N(tThreadingTCPServertStreamRequestHandleriF#cCs�ddl}|j|�}t|d�r:|j|�n
|j|�t|�}tj�z7tjj�tj	2t
||�}t|||�Wdtj�XdS(sD
    Read the logging configuration from a ConfigParser-format file.

    This can be called several times from an application, allowing an end user
    the ability to select from various pre-canned configurations (if the
    developer provides a mechanism to present the choices and load the chosen
    configuration).
    i����Ntreadline(
tConfigParserthasattrtreadfptreadt_create_formatterstloggingt_acquireLockt	_handlerstcleart_handlerListt_install_handlerst_install_loggerst_releaseLock(tfnametdefaultstdisable_existing_loggersRtcpt
formattersthandlers((s&/usr/lib64/python2.7/logging/config.pyt
fileConfig<s	


cCs�|jd�}|jd�}t|�}x\|D]T}|d|}yt||�}Wq1tk
r�t|�t||�}q1Xq1W|S(s)Resolve a dotted name to a global object.t.i(tsplittpopt
__import__tgetattrtAttributeError(tnametusedtfoundtn((s&/usr/lib64/python2.7/logging/config.pyt_resolve[s


cCstd�|�S(NcSs
|j�S(N(tstrip(tx((s&/usr/lib64/python2.7/logging/config.pyt<lambda>jt(tmap(talist((s&/usr/lib64/python2.7/logging/config.pyt
_strip_spacesiscCs t|t�r|S|jd�S(Nsutf-8(t
isinstancetstrtencode(ts((s&/usr/lib64/python2.7/logging/config.pyt_encodedlscCs|jdd�}t|�s"iS|jd�}t|�}i}x�|D]�}d|}|j|�}d|kr�|j|dd�}nd	}d|kr�|j|dd�}nd	}tj}d|kr�|j|d�}	|	r�t|	�}q�n|||�}
|
||<qJW|S(
sCreate and return formattersRtkeyst,sformatter_%stformatitdatefmttclassN(	tgettlenRR(toptionstNoneRt	FormatterR!(RtflistRtformtsectnametoptstfstdfstct
class_nametf((s&/usr/lib64/python2.7/logging/config.pyRos.

	cCs
|jdd�}t|�s"iS|jd�}t|�}i}g}x�|D]�}d|}|j|d�}|j|�}d|kr�|j|d�}	nd}	yt|tt��}Wn#tt	fk
r�t
|�}nX|j|d�}
t|
tt��}
||
�}d	|krO|j|d	�}|jtj|�nt|	�ro|j
||	�nt|tjj�r�d
|kr�|j|d
�}
nd}
t|
�r�|j||
f�q�n|||<qPWx%|D]\}}|j||�q�W|S(sInstall and return handlersRR.R/s
handler_%sR2t	formatterR%targstlevelttarget(R3R4RR(R5tevaltvarsRRt	NameErrorR!tsetLevelt_levelNamestsetFormattert
issubclassRt
MemoryHandlertappendt	setTarget(RRthlistRtfixupsthandR:tklassR;tfmtRBthRCRDtt((s&/usr/lib64/python2.7/logging/config.pyR
�sH

cCsq|jdd�}|jd�}ttd�|��}|jd�d}tj}|}|j|�}d|kr�|j|d�}|jtj	|�nx|j
D]}	|j|	�q�W|j|d�}
t|
�r|
jd�}
t
|
�}
x"|
D]}|j||�qWnt|jjj��}|j�g}
x�|D]�}d	|}|j|d
�}|j|�}d|kr�|j|d�}nd}tj|�}||krK|j|�d}|d
}t|�}t|�}xB||kr:||| |kr-|
j||�n|d7}q�W|j|�nd|kr�|j|d�}|jtj	|�nx|j
D]}	|j|	�q�W||_d|_|j|d�}
t|
�rN|
jd�}
t
|
�}
x"|
D]}|j||�q�WqNqNWxT|D]L}|jj|}||
kr`tj|_g|_
d|_q||_qWdS(sCreate and install loggerstloggersR.R/cSs
|j�S(N(R"(R#((s&/usr/lib64/python2.7/logging/config.pyR$�R%troottlogger_rootRCRs	logger_%stqualnamet	propagateiRiN(R3RtlistR&tremoveRRWR5RHRIRt
removeHandlerR4R(t
addHandlertmanagert
loggerDictR.tsorttgetintt	getLoggertindexRMRZtdisabledtNOTSETRC(RRRtllistR:RWtlogR;RCRTRORQtexistingt
child_loggerstqnRZtloggertitprefixedtpflentnum_existing((s&/usr/lib64/python2.7/logging/config.pyR�sx
	




		

	s^[a-z_][a-z0-9_]*$cCs,tj|�}|s(td|��ntS(Ns!Not a valid Python identifier: %r(t
IDENTIFIERtmatcht
ValueErrortTrue(R,tm((s&/usr/lib64/python2.7/logging/config.pytvalid_identstConvertingMixincBs#eZdZed�Zd�ZRS(s?For ConvertingXXX's, this mixin class provides common functionscCsh|jj|�}||k	rd|r1|||<nt|�tttfkrd||_||_qdn|S(N(tconfiguratortconvertttypetConvertingDicttConvertingListtConvertingTupletparenttkey(tselfRtvaluetreplacetresult((s&/usr/lib64/python2.7/logging/config.pytconvert_with_key s
	cCsL|jj|�}||k	rHt|�tttfkrH||_qHn|S(N(RxRyRzR{R|R}R~(R�R�R�((s&/usr/lib64/python2.7/logging/config.pyRy,s(t__name__t
__module__t__doc__RtR�Ry(((s&/usr/lib64/python2.7/logging/config.pyRwsR{cBs/eZdZd�Zdd�Zdd�ZRS(s A converting dictionary wrapper.cCs"tj||�}|j||�S(N(tdictt__getitem__R�(R�RR�((s&/usr/lib64/python2.7/logging/config.pyR�AscCs%tj|||�}|j||�S(N(R�R3R�(R�RtdefaultR�((s&/usr/lib64/python2.7/logging/config.pyR3EscCs+tj|||�}|j||dt�S(NR�(R�RR�tFalse(R�RR�R�((s&/usr/lib64/python2.7/logging/config.pyRIsN(R�R�R�R�R6R3R(((s&/usr/lib64/python2.7/logging/config.pyR{>s	R|cBs#eZdZd�Zdd�ZRS(sA converting list wrapper.cCs"tj||�}|j||�S(N(R[R�R�(R�RR�((s&/usr/lib64/python2.7/logging/config.pyR�Osi����cCstj||�}|j|�S(N(R[RRy(R�tidxR�((s&/usr/lib64/python2.7/logging/config.pyRSs(R�R�R�R�R(((s&/usr/lib64/python2.7/logging/config.pyR|Ms	R}cBseZdZd�ZRS(sA converting tuple wrapper.cCs(tj||�}|j||dt�S(NR�(ttupleR�R�R�(R�RR�((s&/usr/lib64/python2.7/logging/config.pyR�Ys(R�R�R�R�(((s&/usr/lib64/python2.7/logging/config.pyR}WstBaseConfiguratorcBs�eZdZejd�Zejd�Zejd�Zejd�Zejd�Z	idd6dd	6Z
eZd
�Z
d�Zd�Zd
�Zd�Zd�Zd�ZRS(sI
    The configurator base class which defines some useful defaults.
    s%^(?P<prefix>[a-z]+)://(?P<suffix>.*)$s^\s*(\w+)\s*s^\.\s*(\w+)\s*s^\[\s*(\w+)\s*\]\s*s^\d+$text_converttexttcfg_converttcfgcCs@t|�|_||j_tt�tjkr<t|_ndS(N(R{tconfigRxRzRttypestFunctionTypetimporter(R�R�((s&/usr/lib64/python2.7/logging/config.pyt__init__rsc	Cs�|jd�}|jd�}yy|j|�}x_|D]W}|d|7}yt||�}Wq7tk
r�|j|�t||�}q7Xq7W|SWnVtk
r�tj�d\}}td||f�}|||_	|_
|�nXdS(s`
        Resolve strings to objects using standard import and attribute
        syntax.
        RiisCannot resolve %r: %sN(RRR�RRtImportErrortsystexc_infoRst	__cause__t
__traceback__(	R�R,RRRtfragtettbtv((s&/usr/lib64/python2.7/logging/config.pytresolve|s"



cCs
|j|�S(s*Default converter for the ext:// protocol.(R�(R�R�((s&/usr/lib64/python2.7/logging/config.pyR��scCsO|}|jj|�}|dkr7td|��n||j�}|j|j�d}x�|rJ|jj|�}|r�||j�d}n�|jj|�}|r|j�d}|j	j|�s�||}qyt
|�}||}Wqtk
r||}qXn|r1||j�}qatd||f��qaW|S(s*Default converter for the cfg:// protocol.sUnable to convert %risUnable to convert %r at %rN(tWORD_PATTERNRrR6RstendR�tgroupstDOT_PATTERNt
INDEX_PATTERNt
DIGIT_PATTERNtintt	TypeError(R�R�trestRutdR�R ((s&/usr/lib64/python2.7/logging/config.pyR��s2	

cCs/t|t�r7t|t�r7t|�}||_n�t|t�rnt|t�rnt|�}||_n�t|t�r�t|t�r�t|�}||_n�t|t�r+|j	j
|�}|r+|j�}|d}|jj
|d�}|r(|d}t||�}||�}q(q+n|S(s�
        Convert values to an appropriate type. dicts, lists and tuples are
        replaced by their converting alternatives. Strings are checked to
        see if they have a conversion format and are converted if they do.
        tprefixtsuffixN(R)R{R�RxR|R[R}R�t
basestringtCONVERT_PATTERNRrt	groupdicttvalue_convertersR3R6R(R�R�RuR�R�t	converterR�((s&/usr/lib64/python2.7/logging/config.pyRy�s*

c	Cs�|jd�}t|d�rUttd�rUt|�tjkrU|j|�}n|jdd�}tg|D]"}t|�rq|||f^qq�}||�}|r�x-|j	�D]\}}t
|||�q�Wn|S(s1Configure an object with a user-supplied factory.s()t__call__t	ClassTypeRN(RRR�RzR�R�R6R�Rvtitemstsetattr(	R�R�R>tpropstktkwargsR�RR�((s&/usr/lib64/python2.7/logging/config.pytconfigure_custom�s45cCs"t|t�rt|�}n|S(s0Utility function which converts lists to tuples.(R)R[R�(R�R�((s&/usr/lib64/python2.7/logging/config.pytas_tuple�s(R�R�R�tretcompileR�R�R�R�R�R�RR�R�R�R�R�RyR�R�(((s&/usr/lib64/python2.7/logging/config.pyR�^s"
	
			"		tDictConfiguratorcBsheZdZd�Zd�Zd�Zd�Zd�Zd�Ze	d�Z
e	d�Ze	d	�ZRS(
s]
    Configure logging using a dictionary-like object to describe the
    configuration.
    cCs�|j}d|kr$td��n|ddkrKtd|d��n|jdt�}i}tj�zz|r�|jd|�}x�|D]�}|tjkr�td|��q�yLtj|}||}|jdd�}|r|j	tj
|��nWq�tk
r.}	td	||	f��q�Xq�W|jd
|�}
xU|
D]M}y|j||
|t
�WqLtk
r�}	td||	f��qLXqLW|jdd�}|r�y|j|t
�Wq�tk
r�}	td
|	��q�Xq�n�|jdt
�}tjj�tj2|jd|�}
xU|
D]M}y|j|
|�|
|<Wq4tk
r�}	td||	f��q4Xq4W|jd|�}xU|D]M}y|j||�||<Wq�tk
r�}	td||	f��q�Xq�W|jd|�}g}x�t|�D]~}y*|j||�}||_|||<Wqtk
r�}	dt|	�krx|j|�q�td	||	f��qXqWxd|D]\}y*|j||�}||_|||<Wq�tk
r�}	td	||	f��q�Xq�Wtj}|jjj�}|j�g}|jd
|�}
x�|
D]�}t|�}||kr�|j|�}|d}t|�}t|�}|d}x?||kr�||| |kr�|j||�|d}q�W|j |�ny|j||
|�WqAtk
r/}	td||	f��qAXqAWx]|D]U}|jj|}||kr~tj!|_"g|_#t
|_$q;|r;t
|_%q;q;W|jdd�}|r�y|j|�Wq�tk
r�}	td
|	��q�XnWdtj&�XdS(sDo the configuration.tversions$dictionary doesn't specify a versionisUnsupported version: %stincrementalRsNo handler found with name %rRCs"Unable to configure handler %r: %sRVs!Unable to configure logger %r: %sRWs#Unable to configure root logger: %sRRs$Unable to configure formatter %r: %stfilterss!Unable to configure filter %r: %sstarget not configured yetRN('R�RsRR�RR	R3R
R6RHt_checkLevelt
StandardErrortconfigure_loggerRttconfigure_rootRRtconfigure_formattertconfigure_filtertsortedtconfigure_handlerRR*RMRWR_R`R.RaR-RdR4R\RfRCRRZReR(R�R�R�t
EMPTY_DICTRRthandlerthandler_configRCR�RVRWtdisable_existingRR�tdeferredRiRjRmRnRoRpRhRl((s&/usr/lib64/python2.7/logging/config.pyt	configure�s�	








	
		




	cCs�d|kr�|d}y|j|�}Wq�tk
r�}dt|�krS�n|jd�|d<||d<|j|�}q�Xn6|jdd�}|jdd�}tj||�}|S(s(Configure a formatter from a dictionary.s()s'format'R0RSR1N(R�R�R*RR3R6RR7(R�R�tfactoryR�tteRStdfmt((s&/usr/lib64/python2.7/logging/config.pyR��s

cCsCd|kr|j|�}n!|jdd�}tj|�}|S(s%Configure a filter from a dictionary.s()RR%(R�R3RtFilter(R�R�R�R((s&/usr/lib64/python2.7/logging/config.pyR��s
cCs]xV|D]N}y|j|jd|�Wqtk
rT}td||f��qXqWdS(s/Add filters to a filterer from a list of names.R�sUnable to add filter %r: %sN(t	addFilterR�R�Rs(R�tfiltererR�R@R�((s&/usr/lib64/python2.7/logging/config.pytadd_filters�s

cCs|jdd�}|r\y|jd|}Wq\tk
rX}td||f��q\Xn|jdd�}|jdd�}d|kr�|jd�}t|d�r�ttd�r�t|�tjkr�|j	|�}n|}n<|jd	�}|j	|�}	t
|	tjj
�r�d
|kr�yN|jd|d
}
t|
tj�sl||d	<td��n|
|d
<Wq tk
r�}td
|d
|f��q Xnvt
|	tjj�r�d|kr�|j|d�|d<n;t
|	tjj�r d|kr |j|d�|d<n|	}tg|D]"}t|�r0|||f^q0�}y||�}
WnJtk
r�}dt|�kr��n|jd�|d<||�}
nX|r�|
j|�n|dk	r�|
jtj|��n|r|j|
|�n|
S(s&Configure a handler from a dictionary.RARsUnable to set formatter %r: %sRCR�s()R�R�R2RDRstarget not configured yets#Unable to set target handler %r: %stmailhosttaddresss'stream'tstreamtstrmN(RR6R�R�RsRR�RzR�R�RKRRRLR)tHandlertSMTPHandlerR�t
SysLogHandlerR�RvR�R*RJRHR�R�(R�R�RAR�RCR�R>R�tcnameRRtthR�R�R�R�((s&/usr/lib64/python2.7/logging/config.pyR��sb4	
5cCs]xV|D]N}y|j|jd|�Wqtk
rT}td||f��qXqWdS(s.Add handlers to a logger from a list of names.RsUnable to add handler %r: %sN(R^R�R�Rs(R�RlRRTR�((s&/usr/lib64/python2.7/logging/config.pytadd_handlers�s

cCs�|jdd�}|dk	r7|jtj|��n|s�x|jD]}|j|�qHW|jdd�}|r�|j||�n|jdd�}|r�|j||�q�ndS(sU
        Perform configuration which is common to root and non-root loggers.
        RCRR�N(	R3R6RHRR�RR]R�R�(R�RlR�R�RCRTRR�((s&/usr/lib64/python2.7/logging/config.pytcommon_logger_config�scCsPtj|�}|j|||�|jdd�}|dk	rL||_ndS(s.Configure a non-root logger from a dictionary.RZN(RRcR�R3R6RZ(R�RR�R�RlRZ((s&/usr/lib64/python2.7/logging/config.pyR�	s
cCs#tj�}|j|||�dS(s*Configure a root logger from a dictionary.N(RRcR�(R�R�R�RW((s&/usr/lib64/python2.7/logging/config.pyR�s(
R�R�R�R�R�R�R�R�R�R�R�R�R�(((s&/usr/lib64/python2.7/logging/config.pyR��s	�					:	cCst|�j�dS(s%Configure logging using a dictionary.N(tdictConfigClassR�(R�((s&/usr/lib64/python2.7/logging/config.pyt
dictConfigscsptstd��ndtfd��Y}dtfd��Y}dtjf�fd��Y��|||�S(sW
    Start up a socket server on the specified port, and listen for new
    configurations.

    These will be sent as a file suitable for processing by fileConfig().
    Returns a Thread object on which you can call start() to start the server,
    and which you can join() when appropriate. To stop the server, call
    stopListening().
    s listen() needs threading to worktConfigStreamHandlercBseZdZd�ZRS(s�
        Handler for a logging configuration request.

        It expects a completely new logging configuration and uses fileConfig
        to install it.
        c	Ss~ddl}y@|j}|jd�}t|�dkrKtjd|�d}|jj|�}x3t|�|kr�||j|t|��}qdWy>ddl}|j|�}t|t	�s�t
�t|�WnQtj
|�}yt|�Wq)ttfk
r�q)tj�q)XnX|jjrK|jjj�qKnWn+tjk
ry}|jtkrz�qznXdS(s�
            Handle a request.

            Each request is expected to be a 4-byte length, packed using
            struct.pack(">L", n), followed by the config file.
            Uses fileConfig() to do the grunt work.
            i����Nis>Li(ttempfilet
connectiontrecvR4tstructtunpacktjsontloadsR)R�tAssertionErrorR�t	cStringIOtStringIORtKeyboardInterruptt
SystemExitt	tracebackt	print_exctservertreadytsettsocketterrorterrnotRESET_ERROR(	R�R�tconntchunktslenR�R�tfileR�((s&/usr/lib64/python2.7/logging/config.pythandle1s6	!(R�R�R�R�(((s&/usr/lib64/python2.7/logging/config.pyR�*stConfigSocketReceivercBs2eZdZdZdeddd�Zd�ZRS(sD
        A simple TCP socket-based logging config receiver.
        it	localhostcSsLtj|||f|�tj�d|_tj�d|_||_dS(Nii(RR�RR	tabortRttimeoutR�(R�thosttportR�R�((s&/usr/lib64/python2.7/logging/config.pyR�^s
	
	cSs�ddl}d}xj|s~|j|jj�ggg|j�\}}}|r^|j�ntj�|j}tj�qW|jj	�dS(Ni����i(
tselectR�tfilenoRthandle_requestRR	RRtclose(R�RRtrdtwrtex((s&/usr/lib64/python2.7/logging/config.pytserve_until_stoppedgs	

	N(R�R�R�tallow_reuse_addresstDEFAULT_LOGGING_CONFIG_PORTR6R�R(((s&/usr/lib64/python2.7/logging/config.pyR�Ws
tServercs eZ�fd�Zd�ZRS(csAt�|�j�||_||_||_tj�|_dS(N(tsuperR�trcvrthdlrRt	threadingtEventR�(R�RRR(R(s&/usr/lib64/python2.7/logging/config.pyR�ws
			cSs~|jd|jd|jd|j�}|jdkrI|jd|_n|jj�tj�|atj	�|j
�dS(NRR�R�ii(RRRR�tserver_addressR�RR	t	_listenerRR(R�R�((s&/usr/lib64/python2.7/logging/config.pytrun~s


(R�R�R�R((R(s&/usr/lib64/python2.7/logging/config.pyRus(tthreadtNotImplementedErrorRRRtThread(RR�R�((Rs&/usr/lib64/python2.7/logging/config.pytlistens
-cCs8tj�ztr%dt_danWdtj�XdS(sN
    Stop the listening server which was created with a call to listen().
    iN(RR	RRR6R(((s&/usr/lib64/python2.7/logging/config.pyt
stopListening�s
	
(2R�R�R�tioRtlogging.handlerstosR�R�R�R�R�R�RRR�R6tSocketServerRRRt
ECONNRESETR�RRtRR!R(R-RR
RR�tIRqRvtobjectRwR�R{R[R|R�R}R�R�R�R�RR(((s&/usr/lib64/python2.7/logging/config.pyt<module>sR

						+	\	!
��.	o__init__.pyo000064400000160300150327210520007031 0ustar00�
{fc%@sdZddlZddlZddlZddlZddlZddlZddlZddlZddddddd	d
ddd
ddddddddddddddddddd d!d"d#d$d%d&d'g%Z	yddl
Z
Wnek
reZ
nXyddl
Z
ddlZWnek
r:eZ
nXd(Zd)Zd*Zd+ZyeeZWnek
rzeZnXd,�Zeed-�r�d.�Znejjejj�Zej�Zd/Z d/Z!d/Z"d/Z#d0Z$e$Z%d1Z&d2Z'e'Z(d3Z)d4Z*d5Z+i
de$6de&6de'6d
e)6de*6de+6e$d6e&d6e'd6e'd6e)d
6e*d6e+d6Z,d6�Z-d7�Z.d8�Z/e
r�ej0�Z1neZ1d9�Z2d:�Z3de4fd;��YZ5d<�Z6de4fd=��YZ7e7�Z8de4fd>��YZ9d
e4fd?��YZ:d@e4fdA��YZ;ej<�Z=gZ>dB�Z?dC�Z@de;fdD��YZAdeAfdE��YZBd	eBfdF��YZCdGe4fdH��YZDeaEdI�ZFdJ�ZGdKe4fdL��YZHde;fdM��YZIdNeIfdO��YZJeIaEde4fdP��YZKeJe'�ZLeLeI_LeHeIjL�eI_MdQZNdR�ZOedS�ZPdT�ZQeQZRdU�ZSdV�ZTdW�ZUeUZVdX�ZWdY�ZXdZ�ZYd[�ZZe>d\�Z[ddl\Z\e\j]e[�deAfd]��YZ^ea_eed^�Z`d_�ZadS(`s�
Logging package for Python. Based on PEP 282 and comments thereto in
comp.lang.python.

Copyright (C) 2001-2014 Vinay Sajip. All Rights Reserved.

To use, simply 'import logging' and log away!
i����NtBASIC_FORMATtBufferingFormattertCRITICALtDEBUGtERRORtFATALtFileHandlertFiltert	FormattertHandlertINFOt	LogRecordtLoggert
LoggerAdaptertNOTSETtNullHandlert
StreamHandlertWARNtWARNINGtaddLevelNametbasicConfigtcaptureWarningstcriticaltdebugtdisableterrort	exceptiontfataltgetLevelNamet	getLoggertgetLoggerClasstinfotlogt
makeLogRecordtsetLoggerClasstwarntwarnings&Vinay Sajip <vinay_sajip@red-dove.com>t
productions0.5.1.2s07 February 2010cCs)y
t�Wntj�djjSXdS(s5Return the frame object for the caller's stack frame.iN(t	Exceptiontsystexc_infottb_frametf_back(((s(/usr/lib64/python2.7/logging/__init__.pytcurrentframe?s
t	_getframecCs
tjd�S(Ni(R'R,(((s(/usr/lib64/python2.7/logging/__init__.pyt<lambda>Ftii2i(iii
icCstj|d|�S(s
    Return the textual representation of logging level 'level'.

    If the level is one of the predefined levels (CRITICAL, ERROR, WARNING,
    INFO, DEBUG) then you get the corresponding string. If you have
    associated levels with names using addLevelName then the name you have
    associated with 'level' is returned.

    If a numeric value corresponding to one of the defined levels is passed
    in, the corresponding string representation is returned.

    Otherwise, the string "Level %s" % level is returned.
    sLevel %s(t_levelNamestget(tlevel((s(/usr/lib64/python2.7/logging/__init__.pyR�scCs.t�z|t|<|t|<Wdt�XdS(sy
    Associate 'levelName' with 'level'.

    This is used when converting levels to text during message formatting.
    N(t_acquireLockR/t_releaseLock(R1t	levelName((s(/usr/lib64/python2.7/logging/__init__.pyR�s

cCspt|ttf�r|}nNt|�|kr\|tkrOtd|��nt|}ntd|��|S(NsUnknown level: %rs*Level not an integer or a valid string: %r(t
isinstancetinttlongtstrR/t
ValueErrort	TypeError(R1trv((s(/usr/lib64/python2.7/logging/__init__.pyt_checkLevel�s	
cCstrtj�ndS(s�
    Acquire the module-level lock for serializing access to shared data.

    This should be released with _releaseLock().
    N(t_locktacquire(((s(/usr/lib64/python2.7/logging/__init__.pyR2�scCstrtj�ndS(sK
    Release the module-level lock acquired by calling _acquireLock().
    N(R=trelease(((s(/usr/lib64/python2.7/logging/__init__.pyR3�scBs,eZdZdd�Zd�Zd�ZRS(s
    A LogRecord instance represents an event being logged.

    LogRecord instances are created every time something is logged. They
    contain all the information pertinent to the event being logged. The
    main information passed in is in msg and args, which are combined
    using str(msg) % args to create the message field of the record. The
    record also includes information such as when the record was created,
    the source line where the logging call was made, and any exception
    information to be logged.
    c	Cs%tj�}	||_||_|rct|�dkrct|dtj�rc|drc|d}n||_t|�|_	||_
||_y5tj
j|�|_tj
j|j�d|_Wn,tttfk
r�||_d|_nX||_d|_||_||_|	|_|	t|	�d|_|jtd|_tryt ryt j!�|_ t"j#�j|_$nd|_ d|_$t%s�d|_&nTd|_&t'j(j)d�}
|
dk	r�y|
j*�j|_&Wq�t+k
r�q�Xnt,rt-td�rtj.�|_/n	d|_/dS(	sK
        Initialize a logging record with interesting information.
        iisUnknown modulei�tMainProcesstmultiprocessingtgetpidN(0ttimetnametmsgtlenR5tcollectionstMappingtargsRt	levelnametlevelnotpathnametostpathtbasenametfilenametsplitexttmoduleR:R9tAttributeErrorR(tNonetexc_texttlinenotfuncNametcreatedR7tmsecst
_startTimetrelativeCreatedt
logThreadstthreadt	get_identt	threadingtcurrent_threadt
threadNametlogMultiprocessingtprocessNameR'tmodulesR0tcurrent_processt
StandardErrortlogProcessesthasattrRBtprocess(tselfRDR1RLRVRERIR(tfunctcttmp((s(/usr/lib64/python2.7/logging/__init__.pyt__init__�sP		.

			 	
								
cCs&d|j|j|j|j|jfS(Ns!<LogRecord: %s, %s, %s, %s, "%s">(RDRKRLRVRE(Rj((s(/usr/lib64/python2.7/logging/__init__.pyt__str__4scCs�tst|j�}nK|j}t|t�scyt|j�}Wqctk
r_|j}qcXn|jr|||j}n|S(s�
        Return the message for this LogRecord.

        Return the message for this LogRecord after merging any user-supplied
        arguments with the message.
        (t_unicodeR8RER5t
basestringtUnicodeErrorRI(RjRE((s(/usr/lib64/python2.7/logging/__init__.pyt
getMessage8s	
	N(t__name__t
__module__t__doc__RTRnRoRs(((s(/usr/lib64/python2.7/logging/__init__.pyR�sF	c	Cs5tdddddddd�}|jj|�|S(s�
    Make a LogRecord whose attributes are defined by the specified dictionary,
    This function is useful for converting a logging event received over
    a socket connection (which is sent as a dictionary) into a LogRecord
    instance.
    R.iN((RRTt__dict__tupdate(tdictR;((s(/usr/lib64/python2.7/logging/__init__.pyR!Ls!cBsMeZdZejZddd�Zdd�Zd�Z	d�Z
d�ZRS(s�
    Formatter instances are used to convert a LogRecord to text.

    Formatters need to know how a LogRecord is constructed. They are
    responsible for converting a LogRecord to (usually) a string which can
    be interpreted by either a human or an external system. The base Formatter
    allows a formatting string to be specified. If none is supplied, the
    default value of "%s(message)\n" is used.

    The Formatter can be initialized with a format string which makes use of
    knowledge of the LogRecord attributes - e.g. the default value mentioned
    above makes use of the fact that the user's message and arguments are pre-
    formatted into a LogRecord's message attribute. Currently, the useful
    attributes in a LogRecord are described by:

    %(name)s            Name of the logger (logging channel)
    %(levelno)s         Numeric logging level for the message (DEBUG, INFO,
                        WARNING, ERROR, CRITICAL)
    %(levelname)s       Text logging level for the message ("DEBUG", "INFO",
                        "WARNING", "ERROR", "CRITICAL")
    %(pathname)s        Full pathname of the source file where the logging
                        call was issued (if available)
    %(filename)s        Filename portion of pathname
    %(module)s          Module (name portion of filename)
    %(lineno)d          Source line number where the logging call was issued
                        (if available)
    %(funcName)s        Function name
    %(created)f         Time when the LogRecord was created (time.time()
                        return value)
    %(asctime)s         Textual time when the LogRecord was created
    %(msecs)d           Millisecond portion of the creation time
    %(relativeCreated)d Time in milliseconds when the LogRecord was created,
                        relative to the time the logging module was loaded
                        (typically at application startup time)
    %(thread)d          Thread ID (if available)
    %(threadName)s      Thread name (if available)
    %(process)d         Process ID (if available)
    %(message)s         The result of record.getMessage(), computed just as
                        the record is emitted
    cCs(|r||_n	d|_||_dS(s8
        Initialize the formatter with specified format strings.

        Initialize the formatter either with the specified format string, or a
        default as described above. Allow for specialized date formatting with
        the optional datefmt argument (if omitted, you get the ISO8601 format).
        s%(message)sN(t_fmttdatefmt(RjtfmtR{((s(/usr/lib64/python2.7/logging/__init__.pyRn�s	cCsV|j|j�}|r-tj||�}n%tjd|�}d||jf}|S(s
        Return the creation time of the specified LogRecord as formatted text.

        This method should be called from format() by a formatter which
        wants to make use of a formatted time. This method can be overridden
        in formatters to provide for any specific requirement, but the
        basic behaviour is as follows: if datefmt (a string) is specified,
        it is used with time.strftime() to format the creation time of the
        record. Otherwise, the ISO8601 format is used. The resulting
        string is returned. This function uses a user-configurable function
        to convert the creation time to a tuple. By default, time.localtime()
        is used; to change this for a particular formatter instance, set the
        'converter' attribute to a function with the same signature as
        time.localtime() or time.gmtime(). To change it for all formatters,
        for example if you want all logging times to be shown in GMT,
        set the 'converter' attribute in the Formatter class.
        s%Y-%m-%d %H:%M:%Ss%s,%03d(t	converterRXRCtstrftimeRY(RjtrecordR{Rltstt((s(/usr/lib64/python2.7/logging/__init__.pyt
formatTime�scCshtj�}tj|d|d|dd|�|j�}|j�|ddkrd|d }n|S(s�
        Format and return the specified exception information as a string.

        This default implementation just uses
        traceback.print_exception()
        iiii����s
N(t	cStringIOtStringIOt	tracebacktprint_exceptionRTtgetvaluetclose(RjteitsioR�((s(/usr/lib64/python2.7/logging/__init__.pytformatException�s%

cCs|jjd�dkS(sK
        Check if the format uses the creation time of the record.
        s
%(asctime)i(Rztfind(Rj((s(/usr/lib64/python2.7/logging/__init__.pytusesTime�scCsA|j�|_|j�r6|j||j�|_ny|j|j}WnVtk
r�}y)|j	j
d�|_	|j|j}Wq�tk
r�|�q�XnX|jr�|js�|j
|j�|_q�n|jr=|ddkr�|d}ny||j}Wq=tk
r9||jj
tj�d�}q=Xn|S(sz
        Format the specified record as text.

        The record's attribute dictionary is used as the operand to a
        string formatting operation which yields the returned string.
        Before formatting the dictionary, a couple of preparatory steps
        are carried out. The message attribute of the record is computed
        using LogRecord.getMessage(). If the formatting string uses the
        time (as determined by a call to usesTime(), formatTime() is
        called to format the event time. If there is exception information,
        it is formatted using formatException() and appended to the message.
        sutf-8i����s
treplace(RstmessageR�R�R{tasctimeRzRwtUnicodeDecodeErrorRDtdecodeR(RUR�RrR'tgetfilesystemencoding(RjRR�te((s(/usr/lib64/python2.7/logging/__init__.pytformat�s.

			

N(RtRuRvRCt	localtimeR}RTRnR�R�R�R�(((s(/usr/lib64/python2.7/logging/__init__.pyR[s(			cBs5eZdZdd�Zd�Zd�Zd�ZRS(sB
    A formatter suitable for formatting a number of records.
    cCs|r||_n	t|_dS(sm
        Optionally specify a formatter which will be used to format each
        individual record.
        N(tlinefmtt_defaultFormatter(RjR�((s(/usr/lib64/python2.7/logging/__init__.pyRn�scCsdS(sE
        Return the header string for the specified records.
        R.((Rjtrecords((s(/usr/lib64/python2.7/logging/__init__.pytformatHeaderscCsdS(sE
        Return the footer string for the specified records.
        R.((RjR�((s(/usr/lib64/python2.7/logging/__init__.pytformatFooterscCsld}t|�dkrh||j|�}x$|D]}||jj|�}q2W||j|�}n|S(sQ
        Format the specified records and return the result as a string.
        R.i(RFR�R�R�R�(RjR�R;R((s(/usr/lib64/python2.7/logging/__init__.pyR�s
N(RtRuRvRTRnR�R�R�(((s(/usr/lib64/python2.7/logging/__init__.pyR�s

		cBs#eZdZdd�Zd�ZRS(s�
    Filter instances are used to perform arbitrary filtering of LogRecords.

    Loggers and Handlers can optionally use Filter instances to filter
    records as desired. The base filter class only allows events which are
    below a certain point in the logger hierarchy. For example, a filter
    initialized with "A.B" will allow events logged by loggers "A.B",
    "A.B.C", "A.B.C.D", "A.B.D" etc. but not "A.BB", "B.A.B" etc. If
    initialized with the empty string, all events are passed.
    R.cCs||_t|�|_dS(s�
        Initialize a filter.

        Initialize with the name of the logger which, together with its
        children, will have its events allowed through the filter. If no
        name is specified, allow every event.
        N(RDRFtnlen(RjRD((s(/usr/lib64/python2.7/logging/__init__.pyRn,s	cCse|jdkrdS|j|jkr)dS|jj|jd|j�dkrQdS|j|jdkS(s�
        Determine if the specified record is to be logged.

        Is the specified record to be logged? Returns 0 for no, nonzero for
        yes. If deemed appropriate, the record may be modified in-place.
        iit.(R�RDR�(RjR((s(/usr/lib64/python2.7/logging/__init__.pytfilter7s$(RtRuRvRnR�(((s(/usr/lib64/python2.7/logging/__init__.pyR!s
tFilterercBs2eZdZd�Zd�Zd�Zd�ZRS(s[
    A base class for loggers and handlers which allows them to share
    common code.
    cCs
g|_dS(sE
        Initialize the list of filters to be an empty list.
        N(tfilters(Rj((s(/usr/lib64/python2.7/logging/__init__.pyRnKscCs&||jkr"|jj|�ndS(s;
        Add the specified filter to this handler.
        N(R�tappend(RjR�((s(/usr/lib64/python2.7/logging/__init__.pyt	addFilterQscCs&||jkr"|jj|�ndS(s@
        Remove the specified filter from this handler.
        N(R�tremove(RjR�((s(/usr/lib64/python2.7/logging/__init__.pytremoveFilterXscCs7d}x*|jD]}|j|�sd}PqqW|S(s
        Determine if a record is loggable by consulting all the filters.

        The default is to allow the record to be logged; any filter can veto
        this and the record is then dropped. Returns a zero value if a record
        is to be dropped, else non-zero.
        ii(R�R�(RjRR;tf((s(/usr/lib64/python2.7/logging/__init__.pyR�_s(RtRuRvRnR�R�R�(((s(/usr/lib64/python2.7/logging/__init__.pyR�Fs
			cCswttt}}}|rs|rs|rsy6|�z ||krO|j|�nWd|�XWqstk
roqsXndS(sD
    Remove a handler reference from the internal cleanup list.
    N(R2R3t_handlerListR�R:(twrR>R?thandlers((s(/usr/lib64/python2.7/logging/__init__.pyt_removeHandlerRefus
cCs3t�ztjtj|t��Wdt�XdS(sL
    Add a handler to the internal cleanup list using a weak reference.
    N(R2R�R�tweakreftrefR�R3(thandler((s(/usr/lib64/python2.7/logging/__init__.pyt_addHandlerRef�scBs�eZdZed�Zd�Zd�Zeee�Zd�Z	d�Z
d�Zd�Zd�Z
d	�Zd
�Zd�Zd�Zd
�Zd�ZRS(sq
    Handler instances dispatch logging events to specific destinations.

    The base handler class. Acts as a placeholder which defines the Handler
    interface. Handlers can optionally use Formatter instances to format
    records as desired. By default, no formatter is specified; in this case,
    the 'raw' message as determined by record.message is logged.
    cCsFtj|�d|_t|�|_d|_t|�|j�dS(sz
        Initializes the instance - basically setting the formatter to None
        and the filter list to empty.
        N(	R�RnRTt_nameR<R1t	formatterR�t
createLock(RjR1((s(/usr/lib64/python2.7/logging/__init__.pyRn�s
		
cCs|jS(N(R�(Rj((s(/usr/lib64/python2.7/logging/__init__.pytget_name�scCsRt�z<|jtkr&t|j=n||_|rB|t|<nWdt�XdS(N(R2R�t	_handlersR3(RjRD((s(/usr/lib64/python2.7/logging/__init__.pytset_name�s
	cCs%trtj�|_n	d|_dS(sU
        Acquire a thread lock for serializing access to the underlying I/O.
        N(R]R_tRLocktlockRT(Rj((s(/usr/lib64/python2.7/logging/__init__.pyR��scCs|jr|jj�ndS(s.
        Acquire the I/O thread lock.
        N(R�R>(Rj((s(/usr/lib64/python2.7/logging/__init__.pyR>�s	cCs|jr|jj�ndS(s.
        Release the I/O thread lock.
        N(R�R?(Rj((s(/usr/lib64/python2.7/logging/__init__.pyR?�s	cCst|�|_dS(s8
        Set the logging level of this handler.
        N(R<R1(RjR1((s(/usr/lib64/python2.7/logging/__init__.pytsetLevel�scCs(|jr|j}nt}|j|�S(s�
        Format the specified record.

        If a formatter is set, use it. Otherwise, use the default formatter
        for the module.
        (R�R�R�(RjRR|((s(/usr/lib64/python2.7/logging/__init__.pyR��s	cCstd��dS(s�
        Do whatever it takes to actually log the specified logging record.

        This version is intended to be implemented by subclasses and so
        raises a NotImplementedError.
        s.emit must be implemented by Handler subclassesN(tNotImplementedError(RjR((s(/usr/lib64/python2.7/logging/__init__.pytemit�scCsE|j|�}|rA|j�z|j|�Wd|j�Xn|S(s<
        Conditionally emit the specified logging record.

        Emission depends on filters which may have been added to the handler.
        Wrap the actual emission of the record with acquisition/release of
        the I/O thread lock. Returns whether the filter passed the record for
        emission.
        N(R�R>R�R?(RjRR;((s(/usr/lib64/python2.7/logging/__init__.pythandle�s	
cCs
||_dS(s5
        Set the formatter for this handler.
        N(R�(RjR|((s(/usr/lib64/python2.7/logging/__init__.pytsetFormatterscCsdS(s�
        Ensure all logging output has been flushed.

        This version does nothing and is intended to be implemented by
        subclasses.
        N((Rj((s(/usr/lib64/python2.7/logging/__init__.pytflush	scCs?t�z)|jr/|jtkr/t|j=nWdt�XdS(s%
        Tidy up any resources used by the handler.

        This version removes the handler from an internal map of handlers,
        _handlers, which is used for handler lookup by name. Subclasses
        should ensure that this gets called from overridden close()
        methods.
        N(R2R�R�R3(Rj((s(/usr/lib64/python2.7/logging/__init__.pyR�s

cCs�tr�tjr�tj�}zdyLtj|d|d|ddtj�tjjd|j|j	f�Wnt
k
r}nXWd~XndS(sD
        Handle errors which occur during an emit() call.

        This method should be called from handlers when an exception is
        encountered during an emit() call. If raiseExceptions is false,
        exceptions get silently ignored. This is what is mostly wanted
        for a logging system - most users will not care about errors in
        the logging system, they are more interested in application errors.
        You could, however, replace this with a custom handler if you wish.
        The record which was being processed is passed in to this method.
        iiisLogged from file %s, line %s
N(traiseExceptionsR'tstderrR(R�R�RTtwriteRPRVtIOError(RjRR�((s(/usr/lib64/python2.7/logging/__init__.pythandleError#s

(RtRuRvRRnR�R�tpropertyRDR�R>R?R�R�R�R�R�R�R�R�(((s(/usr/lib64/python2.7/logging/__init__.pyR	�s 
								
	
					cBs,eZdZdd�Zd�Zd�ZRS(s�
    A handler class which writes logging records, appropriately formatted,
    to a stream. Note that this class does not close the stream, as
    sys.stdout or sys.stderr may be used.
    cCs2tj|�|dkr%tj}n||_dS(sb
        Initialize the handler.

        If stream is not specified, sys.stderr is used.
        N(R	RnRTR'R�tstream(RjR�((s(/usr/lib64/python2.7/logging/__init__.pyRnBs
cCsK|j�z/|jr8t|jd�r8|jj�nWd|j�XdS(s%
        Flushes the stream.
        R�N(R>R�RhR�R?(Rj((s(/usr/lib64/python2.7/logging/__init__.pyR�Ms

cCs-y�|j|�}|j}d}ts;|j||�n�y�t|t�r�t|dd�r�d}y|j||�Wq�tk
r�|j||j	|j
��q�Xn|j||�Wn+tk
r�|j||j	d��nX|j�Wn-t
tfk
r�n|j|�nXdS(s�
        Emit a record.

        If a formatter is specified, it is used to format the record.
        The record is then written to the stream with a trailing newline.  If
        exception information is present, it is formatted using
        traceback.print_exception and appended to the stream.  If the stream
        has an 'encoding' attribute, it is used to determine how to do the
        output to the stream.
        s%s
tencodingu%s
sUTF-8N(R�R�RpR�R5tunicodetgetattrRTtUnicodeEncodeErrortencodeR�RrR�tKeyboardInterruptt
SystemExitR�(RjRRER�tfstufs((s(/usr/lib64/python2.7/logging/__init__.pyR�Xs,	
$
N(RtRuRvRTRnR�R�(((s(/usr/lib64/python2.7/logging/__init__.pyR;s	cBs;eZdZdddd�Zd�Zd�Zd�ZRS(sO
    A handler class which writes formatted logging records to disk files.
    taicCs~tdkrd}ntjj|�|_||_||_||_|rdt	j
|�d|_ntj
||j
��dS(sO
        Open the specified file and use it as the stream for logging.
        N(tcodecsRTRMRNtabspathtbaseFilenametmodeR�tdelayR	RnR�Rt_open(RjRPR�R�R�((s(/usr/lib64/python2.7/logging/__init__.pyRn�s				
cCs�|j�zezP|jr\z|j�Wd|j}d|_t|d�rX|j�nXnWdtj|�XWd|j�XdS(s$
        Closes the stream.
        NR�(R>R�R�RTRhR�RR?(RjR�((s(/usr/lib64/python2.7/logging/__init__.pyR��s
			cCsI|jdkr't|j|j�}ntj|j|j|j�}|S(sx
        Open the current base file with the (original) mode and encoding.
        Return the resulting stream.
        N(R�RTtopenR�R�R�(RjR�((s(/usr/lib64/python2.7/logging/__init__.pyR��scCs5|jdkr!|j�|_ntj||�dS(s�
        Emit a record.

        If the stream was not opened because 'delay' was specified in the
        constructor, open it before calling the superclass's emit.
        N(R�RTR�RR�(RjR((s(/usr/lib64/python2.7/logging/__init__.pyR��sN(RtRuRvRTRnR�R�R�(((s(/usr/lib64/python2.7/logging/__init__.pyR�s
		tPlaceHoldercBs eZdZd�Zd�ZRS(s�
    PlaceHolder instances are used in the Manager logger hierarchy to take
    the place of nodes for which no loggers have been defined. This class is
    intended for internal use only and not as part of the public API.
    cCsid|6|_dS(sY
        Initialize with the specified logger being a child of this placeholder.
        N(RTt	loggerMap(Rjtalogger((s(/usr/lib64/python2.7/logging/__init__.pyRn�scCs#||jkrd|j|<ndS(sJ
        Add the specified logger as a child of this placeholder.
        N(R�RT(RjR�((s(/usr/lib64/python2.7/logging/__init__.pyR��s(RtRuRvRnR�(((s(/usr/lib64/python2.7/logging/__init__.pyR��s	cCs>|tkr4t|t�s4td|j��q4n|adS(s�
    Set the class to be used when instantiating a logger. The class should
    define __init__() such that only a name argument is required, and the
    __init__() should call Logger.__init__()
    s(logger not derived from logging.Logger: N(Rt
issubclassR:Rtt_loggerClass(tklass((s(/usr/lib64/python2.7/logging/__init__.pyR"�s
cCstS(sB
    Return the class to be used when instantiating a logger.
    (R�(((s(/usr/lib64/python2.7/logging/__init__.pyR�stManagercBs;eZdZd�Zd�Zd�Zd�Zd�ZRS(st
    There is [under normal circumstances] just one Manager instance, which
    holds the hierarchy of loggers.
    cCs1||_d|_d|_i|_d|_dS(sT
        Initialize the manager with the root node of the logger hierarchy.
        iN(trootRtemittedNoHandlerWarningt
loggerDictRTtloggerClass(Rjtrootnode((s(/usr/lib64/python2.7/logging/__init__.pyRn�s
				cCsd}t|t�s$td��nt|t�rE|jd�}nt�z�||jkr�|j|}t|t�r|}|j	p�t
|�}||_||j|<|j||�|j
|�qn8|j	p�t
|�}||_||j|<|j
|�Wdt�X|S(s�
        Get a logger with the specified name (channel name), creating it
        if it doesn't yet exist. This name is a dot-separated hierarchical
        name, such as "a", "a.b", "a.b.c" or similar.

        If a PlaceHolder existed for the specified name [i.e. the logger
        didn't exist but a child of it did], replace it with the created
        logger and fix up the parent/child references which pointed to the
        placeholder to now point to the logger.
        s'A logger name must be string or Unicodesutf-8N(RTR5RqR:R�R�R2R�R�R�R�tmanagert_fixupChildrent
_fixupParentsR3(RjRDR;tph((s(/usr/lib64/python2.7/logging/__init__.pyRs,
	
	
cCsA|tkr4t|t�s4td|j��q4n||_dS(sY
        Set the class to be used when instantiating a logger with this Manager.
        s(logger not derived from logging.Logger: N(RR�R:RtR�(RjR�((s(/usr/lib64/python2.7/logging/__init__.pyR",s
cCs�|j}|jd�}d}x�|dkr�|r�|| }||jkrct|�|j|<n2|j|}t|t�r�|}n
|j|�|jdd|d�}q!W|s�|j}n||_	dS(s�
        Ensure that there are either loggers or placeholders all the way
        from the specified logger to the root of the logger hierarchy.
        R�iiN(
RDtrfindRTR�R�R5RR�R�tparent(RjR�RDtiR;tsubstrtobj((s(/usr/lib64/python2.7/logging/__init__.pyR�6s	

	
cCsa|j}t|�}xE|jj�D]4}|jj| |kr%|j|_||_q%q%WdS(sk
        Ensure that children of the placeholder ph are connected to the
        specified logger.
        N(RDRFR�tkeysR�(RjR�R�RDtnamelentc((s(/usr/lib64/python2.7/logging/__init__.pyR�Ns	(RtRuRvRnRR"R�R�(((s(/usr/lib64/python2.7/logging/__init__.pyR��s	
	$	
	cBs�eZdZed�Zd�Zd�Zd�Zd�ZeZ	d�Z
d�Zd�ZeZ
d	�Zd
�Zddd�Zddd�Zd
�Zd�Zd�Zd�Zd�Zd�Zd�ZRS(sr
    Instances of the Logger class represent a single logging channel. A
    "logging channel" indicates an area of an application. Exactly how an
    "area" is defined is up to the application developer. Since an
    application can have any number of areas, logging channels are identified
    by a unique string. Application areas can be nested (e.g. an area
    of "input processing" might include sub-areas "read CSV files", "read
    XLS files" and "read Gnumeric files"). To cater for this natural nesting,
    channel names are organized into a namespace hierarchy where levels are
    separated by periods, much like the Java or Python package namespace. So
    in the instance given above, channel names might be "input" for the upper
    level, and "input.csv", "input.xls" and "input.gnu" for the sub-levels.
    There is no arbitrary limit to the depth of nesting.
    cCsMtj|�||_t|�|_d|_d|_g|_d|_	dS(sJ
        Initialize the logger with a name and an optional level.
        iiN(
R�RnRDR<R1RTR�t	propagateR�tdisabled(RjRDR1((s(/usr/lib64/python2.7/logging/__init__.pyRnns
				cCst|�|_dS(s7
        Set the logging level of this logger.
        N(R<R1(RjR1((s(/usr/lib64/python2.7/logging/__init__.pyR�zscOs,|jt�r(|jt|||�ndS(s�
        Log 'msg % args' with severity 'DEBUG'.

        To pass exception information, use the keyword argument exc_info with
        a true value, e.g.

        logger.debug("Houston, we have a %s", "thorny problem", exc_info=1)
        N(tisEnabledForRt_log(RjRERItkwargs((s(/usr/lib64/python2.7/logging/__init__.pyR�s	cOs,|jt�r(|jt|||�ndS(s�
        Log 'msg % args' with severity 'INFO'.

        To pass exception information, use the keyword argument exc_info with
        a true value, e.g.

        logger.info("Houston, we have a %s", "interesting problem", exc_info=1)
        N(R�R
R�(RjRERIR�((s(/usr/lib64/python2.7/logging/__init__.pyR�s	cOs,|jt�r(|jt|||�ndS(s�
        Log 'msg % args' with severity 'WARNING'.

        To pass exception information, use the keyword argument exc_info with
        a true value, e.g.

        logger.warning("Houston, we have a %s", "bit of a problem", exc_info=1)
        N(R�RR�(RjRERIR�((s(/usr/lib64/python2.7/logging/__init__.pyR$�s	cOs,|jt�r(|jt|||�ndS(s�
        Log 'msg % args' with severity 'ERROR'.

        To pass exception information, use the keyword argument exc_info with
        a true value, e.g.

        logger.error("Houston, we have a %s", "major problem", exc_info=1)
        N(R�RR�(RjRERIR�((s(/usr/lib64/python2.7/logging/__init__.pyR�s	cOs!d|d<|j|||�dS(sU
        Convenience method for logging an ERROR with exception information.
        iR(N(R(RjRERIR�((s(/usr/lib64/python2.7/logging/__init__.pyR�s
cOs,|jt�r(|jt|||�ndS(s�
        Log 'msg % args' with severity 'CRITICAL'.

        To pass exception information, use the keyword argument exc_info with
        a true value, e.g.

        logger.critical("Houston, we have a %s", "major disaster", exc_info=1)
        N(R�RR�(RjRERIR�((s(/usr/lib64/python2.7/logging/__init__.pyR�s	cOs]t|ttf�s1tr*td��q1dSn|j|�rY|j||||�ndS(s�
        Log 'msg % args' with the integer severity 'level'.

        To pass exception information, use the keyword argument exc_info with
        a true value, e.g.

        logger.log(level, "We have a %s", "mysterious problem", exc_info=1)
        slevel must be an integerN(R5R6R7R�R:R�R�(RjR1RERIR�((s(/usr/lib64/python2.7/logging/__init__.pyR �s	cCs�t�}|dk	r!|j}nd}xet|d�r�|j}tjj|j�}|t	krr|j}q*n|j|j
|jf}Pq*W|S(s�
        Find the stack frame of the caller so that we can note the source
        file name, line number and function name.
        s(unknown file)is(unknown function)tf_codeN(s(unknown file)is(unknown function)(R+RTR*RhR�RMRNtnormcasetco_filenamet_srcfiletf_linenotco_name(RjR�R;tcoRP((s(/usr/lib64/python2.7/logging/__init__.pyt
findCaller�s			c
	Cs�t||||||||�}
|	dk	r�xP|	D]E}|dksU||
jkrhtd|��n|	||
j|<q4Wn|
S(sr
        A factory method which can be overridden in subclasses to create
        specialized LogRecords.
        R�R�s$Attempt to overwrite %r in LogRecordN(R�R�(RRTRwtKeyError(RjRDR1tfntlnoRERIR(RktextraR;tkey((s(/usr/lib64/python2.7/logging/__init__.pyt
makeRecord�s!
c

Cs�trEy|j�\}}}WqTtk
rAd\}}}qTXnd\}}}|r{t|t�s{tj�}q{n|j|j||||||||�	}	|j	|	�dS(s�
        Low-level logging routine which creates a LogRecord and then calls
        all the handlers of this logger to handle the record.
        s(unknown file)is(unknown function)N(s(unknown file)is(unknown function)(s(unknown file)is(unknown function)(
R�R�R9R5ttupleR'R(R�RDR�(
RjR1RERIR(R�R�R�RkR((s(/usr/lib64/python2.7/logging/__init__.pyR��s
*cCs-|jr)|j|�r)|j|�ndS(s�
        Call the handlers for the specified record.

        This method is used for unpickled records received from a socket, as
        well as those created locally. Logger-level filtering is applied.
        N(R�R�tcallHandlers(RjR((s(/usr/lib64/python2.7/logging/__init__.pyR�scCs<t�z&||jkr,|jj|�nWdt�XdS(s;
        Add the specified handler to this logger.
        N(R2R�R�R3(Rjthdlr((s(/usr/lib64/python2.7/logging/__init__.pyt
addHandlers
cCs<t�z&||jkr,|jj|�nWdt�XdS(s@
        Remove the specified handler from this logger.
        N(R2R�R�R3(RjR((s(/usr/lib64/python2.7/logging/__init__.pyt
removeHandler$s
cCs�|}d}xe|rsx=|jD]2}|d}|j|jkr|j|�qqW|jsgd}q|j}qW|dkr�tr�|jj	r�t
jjd|j
�d|j_	ndS(s�
        Pass a record to all relevant handlers.

        Loop through all handlers for this logger and its parents in the
        logger hierarchy. If no handler was found, output a one-off error
        message to sys.stderr. Stop searching up the hierarchy whenever a
        logger with the "propagate" attribute set to zero is found - that
        will be the last logger whose handlers are called.
        iis+No handlers could be found for logger "%s"
N(R�RKR1R�R�RTR�R�R�R�R'R�R�RD(RjRR�tfoundR((s(/usr/lib64/python2.7/logging/__init__.pyR/s
	
		
cCs0|}x#|r+|jr|jS|j}q	WtS(s�
        Get the effective level for this logger.

        Loop through this logger and its parents in the logger hierarchy,
        looking for a non-zero logging level. Return the first one found.
        (R1R�R(Rjtlogger((s(/usr/lib64/python2.7/logging/__init__.pytgetEffectiveLevelIs		
cCs&|jj|krdS||j�kS(s;
        Is this logger enabled for level 'level'?
        i(R�RR(RjR1((s(/usr/lib64/python2.7/logging/__init__.pyR�WscCs:|j|k	r*dj|j|f�}n|jj|�S(sb
        Get a logger which is a descendant to this one.

        This is a convenience method, such that

        logging.getLogger('abc').getChild('def.ghi')

        is the same as

        logging.getLogger('abc.def.ghi')

        It's useful, for example, when the parent logger is named using
        __name__ rather than a literal string.
        R�(R�tjoinRDR�R(Rjtsuffix((s(/usr/lib64/python2.7/logging/__init__.pytgetChild_sN(RtRuRvRRnR�RRR$R#RRRRR R�RTR�R�R�RRRRR�R	(((s(/usr/lib64/python2.7/logging/__init__.pyR_s,									
	
					t
RootLoggercBseZdZd�ZRS(s�
    A root logger is not that different to any other logger, except that
    it must have a logging level and there is only one instance of it in
    the hierarchy.
    cCstj|d|�dS(s=
        Initialize the logger with the name "root".
        R�N(RRn(RjR1((s(/usr/lib64/python2.7/logging/__init__.pyRnxs(RtRuRvRn(((s(/usr/lib64/python2.7/logging/__init__.pyR
rscBsheZdZd�Zd�Zd�Zd�Zd�Zd�Zd�Z	d�Z
d	�Zd
�ZRS(so
    An adapter for loggers which makes it easier to specify contextual
    information in logging output.
    cCs||_||_dS(sx
        Initialize the adapter with a logger and a dict-like object which
        provides contextual information. This constructor signature allows
        easy stacking of LoggerAdapters, if so desired.

        You can effectively pass keyword arguments as shown in the
        following example:

        adapter = LoggerAdapter(someLogger, dict(p1=v1, p2="v2"))
        N(RR�(RjRR�((s(/usr/lib64/python2.7/logging/__init__.pyRn�s	cCs|j|d<||fS(s�
        Process the logging message and keyword arguments passed in to
        a logging call to insert contextual information. You can either
        manipulate the message itself, the keyword args or both. Return
        the message and kwargs modified (or not) to suit your needs.

        Normally, you'll only need to override this one method in a
        LoggerAdapter subclass for your specific needs.
        R�(R�(RjRER�((s(/usr/lib64/python2.7/logging/__init__.pyRi�s

cOs2|j||�\}}|jj|||�dS(s�
        Delegate a debug call to the underlying logger, after adding
        contextual information from this adapter instance.
        N(RiRR(RjRERIR�((s(/usr/lib64/python2.7/logging/__init__.pyR�scOs2|j||�\}}|jj|||�dS(s�
        Delegate an info call to the underlying logger, after adding
        contextual information from this adapter instance.
        N(RiRR(RjRERIR�((s(/usr/lib64/python2.7/logging/__init__.pyR�scOs2|j||�\}}|jj|||�dS(s�
        Delegate a warning call to the underlying logger, after adding
        contextual information from this adapter instance.
        N(RiRR$(RjRERIR�((s(/usr/lib64/python2.7/logging/__init__.pyR$�scOs2|j||�\}}|jj|||�dS(s�
        Delegate an error call to the underlying logger, after adding
        contextual information from this adapter instance.
        N(RiRR(RjRERIR�((s(/usr/lib64/python2.7/logging/__init__.pyR�scOs<|j||�\}}d|d<|jj|||�dS(s�
        Delegate an exception call to the underlying logger, after adding
        contextual information from this adapter instance.
        iR(N(RiRR(RjRERIR�((s(/usr/lib64/python2.7/logging/__init__.pyR�s
cOs2|j||�\}}|jj|||�dS(s�
        Delegate a critical call to the underlying logger, after adding
        contextual information from this adapter instance.
        N(RiRR(RjRERIR�((s(/usr/lib64/python2.7/logging/__init__.pyR�scOs5|j||�\}}|jj||||�dS(s�
        Delegate a log call to the underlying logger, after adding
        contextual information from this adapter instance.
        N(RiRR (RjR1RERIR�((s(/usr/lib64/python2.7/logging/__init__.pyR �scCs|jj|�S(sR
        See if the underlying logger is enabled for the specified level.
        (RR�(RjR1((s(/usr/lib64/python2.7/logging/__init__.pyR��s(
RtRuRvRnRiRRR$RRRR R�(((s(/usr/lib64/python2.7/logging/__init__.pyR
�s		
								s"%(levelname)s:%(name)s:%(message)sc	Ks�t�z�ttj�dkr�|jd�}|rX|jdd�}t||�}n|jd�}t|�}|jdt�}|jdd	�}t	||�}|j
|�tj|�|jd�}|d	k	r�tj|�q�nWd	t
�Xd	S(
s�
    Do basic configuration for the logging system.

    This function does nothing if the root logger already has handlers
    configured. It is a convenience method intended for use by simple scripts
    to do one-shot configuration of the logging package.

    The default behaviour is to create a StreamHandler which writes to
    sys.stderr, set a formatter using the BASIC_FORMAT format string, and
    add the handler to the root logger.

    A number of optional keyword arguments may be specified, which can alter
    the default behaviour.

    filename  Specifies that a FileHandler be created, using the specified
              filename, rather than a StreamHandler.
    filemode  Specifies the mode to open the file, if filename is specified
              (if filemode is unspecified, it defaults to 'a').
    format    Use the specified format string for the handler.
    datefmt   Use the specified date/time format.
    level     Set the root logger level to the specified level.
    stream    Use the specified stream to initialize the StreamHandler. Note
              that this argument is incompatible with 'filename' - if both
              are present, 'stream' is ignored.

    Note that you could specify a stream created using open(filename, mode)
    rather than passing the filename and mode in. However, it should be
    remembered that StreamHandler does not close its stream (since it may be
    using sys.stdout or sys.stderr), whereas FileHandler closes its stream
    when the handler is closed.
    iRPtfilemodeR�R�R�R{R1N(R2RFR�R�R0RRRRTRR�RR�R3(	R�RPR�RR�R�tdfsR|R1((s(/usr/lib64/python2.7/logging/__init__.pyR�s$"

cCs|rtjj|�StSdS(s�
    Return a logger with the specified name, creating it if necessary.

    If no name is specified, return the root logger.
    N(RR�RR�(RD((s(/usr/lib64/python2.7/logging/__init__.pyR&scOs6ttj�dkrt�ntj|||�dS(sD
    Log a message with severity 'CRITICAL' on the root logger.
    iN(RFR�R�RR(RERIR�((s(/usr/lib64/python2.7/logging/__init__.pyR:s
cOs6ttj�dkrt�ntj|||�dS(sA
    Log a message with severity 'ERROR' on the root logger.
    iN(RFR�R�RR(RERIR�((s(/usr/lib64/python2.7/logging/__init__.pyRDs
cOsd|d<t|||�dS(sa
    Log a message with severity 'ERROR' on the root logger,
    with exception information.
    iR(N(R(RERIR�((s(/usr/lib64/python2.7/logging/__init__.pyRLs
cOs6ttj�dkrt�ntj|||�dS(sC
    Log a message with severity 'WARNING' on the root logger.
    iN(RFR�R�RR$(RERIR�((s(/usr/lib64/python2.7/logging/__init__.pyR$Ts
cOs6ttj�dkrt�ntj|||�dS(s@
    Log a message with severity 'INFO' on the root logger.
    iN(RFR�R�RR(RERIR�((s(/usr/lib64/python2.7/logging/__init__.pyR^s
cOs6ttj�dkrt�ntj|||�dS(sA
    Log a message with severity 'DEBUG' on the root logger.
    iN(RFR�R�RR(RERIR�((s(/usr/lib64/python2.7/logging/__init__.pyRfs
cOs9ttj�dkrt�ntj||||�dS(sP
    Log 'msg % args' with the integer severity 'level' on the root logger.
    iN(RFR�R�RR (R1RERIR�((s(/usr/lib64/python2.7/logging/__init__.pyR ns
cCs|tj_dS(sB
    Disable all logging calls of severity 'level' and below.
    N(R�R�R(R1((s(/usr/lib64/python2.7/logging/__init__.pyRvscCs�x�t|�D]�}yd|�}|rwz@y"|j�|j�|j�Wnttfk
rdnXWd|j�XnWqtr��q�qXqWdS(s�
    Perform any cleanup actions in the logging system (e.g. flushing
    buffers).

    Should be called at application exit.
    N(treversedR>R�R�R�R9R?R�(thandlerListR�th((s(/usr/lib64/python2.7/logging/__init__.pytshutdown|s	

cBs)eZdZd�Zd�Zd�ZRS(s�
    This handler does nothing. It's intended to be used to avoid the
    "No handlers could be found for logger XXX" one-off warning. This is
    important for library code, which may contain code to log events. If a user
    of the library does not configure logging, the one-off warning might be
    produced; to avoid this, the library developer simply needs to instantiate
    a NullHandler and add it to the top-level logger of the library module or
    package.
    cCsdS(N((RjR((s(/usr/lib64/python2.7/logging/__init__.pyR��scCsdS(N((RjR((s(/usr/lib64/python2.7/logging/__init__.pyR��scCs
d|_dS(N(RTR�(Rj((s(/usr/lib64/python2.7/logging/__init__.pyR��s(RtRuRvR�R�R�(((s(/usr/lib64/python2.7/logging/__init__.pyR�s			cCs�|dk	r7tdk	r�t||||||�q�nStj|||||�}td�}|jsz|jt��n|jd|�dS(s�
    Implementation of showwarnings which redirects to logging, which will first
    check to see if the file parameter is None. If a file is specified, it will
    delegate to the original warnings implementation of showwarning. Otherwise,
    it will call warnings.formatwarning and will log the resulting string to a
    warnings logger named "py.warnings" with level logging.WARNING.
    spy.warningss%sN(	RTt_warnings_showwarningtwarningst
formatwarningRR�RRR$(R�tcategoryRPRVtfiletlineR�R((s(/usr/lib64/python2.7/logging/__init__.pyt_showwarning�s	cCsL|r*tdkrHtjatt_qHntdk	rHtt_dandS(s�
    If capture is true, redirect all warnings to the logging package.
    If capture is False, ensure that warnings are not redirected to logging
    but to their original destinations.
    N(RRTRtshowwarningR(tcapture((s(/usr/lib64/python2.7/logging/__init__.pyR�s		(bRvR'RMRCR�R�RR�RGt__all__R�tImportErrorRTR]R_t
__author__t
__status__t__version__t__date__R�tTrueRpt	NameErrortFalseR+RhRNR�t__code__R�R�RZR�R\RbRgRRRRRR
RRR/RRR<R�R=R2R3tobjectRR!RR�RRR�tWeakValueDictionaryR�R�R�R�R	RRR�R�R"RR�RR
R
R�R�RRRRRRRR$R#RRR RRtatexittregisterRRRR(((s(/usr/lib64/python2.7/logging/__init__.pyt<module>s�`






	

		
				k	�	*%,		
�GH	
	f�`		<								
config.pyo000064400000062446150327210520006553 0ustar00�
{fc@sdZddlZddlZddlZddlZddlZddlZddlZddlZddl	Z	ddl
Z
ddlZddlZyddl
Z
ddlZWnek
r�eZ
nXddlmZmZdZejZeaeed�Zd�Zd�Zd�Zd	�Zd
�Zd�Zej dej!�Z"d
�Z#de$fd��YZ%de&e%fd��YZ'de(e%fd��YZ)de*e%fd��YZ+de$fd��YZ,de,fd��YZ-e-Z.d�Z/ed�Z0d�Z1dS(s
Configuration functions for the logging package for Python. The core package
is based on PEP 282 and comments thereto in comp.lang.python, and influenced
by Apache's log4j system.

Copyright (C) 2001-2014 Vinay Sajip. All Rights Reserved.

To use, simply 'import logging' and log away!
i����N(tThreadingTCPServertStreamRequestHandleriF#cCs�ddl}|j|�}t|d�r:|j|�n
|j|�t|�}tj�z7tjj�tj	2t
||�}t|||�Wdtj�XdS(sD
    Read the logging configuration from a ConfigParser-format file.

    This can be called several times from an application, allowing an end user
    the ability to select from various pre-canned configurations (if the
    developer provides a mechanism to present the choices and load the chosen
    configuration).
    i����Ntreadline(
tConfigParserthasattrtreadfptreadt_create_formatterstloggingt_acquireLockt	_handlerstcleart_handlerListt_install_handlerst_install_loggerst_releaseLock(tfnametdefaultstdisable_existing_loggersRtcpt
formattersthandlers((s&/usr/lib64/python2.7/logging/config.pyt
fileConfig<s	


cCs�|jd�}|jd�}t|�}x\|D]T}|d|}yt||�}Wq1tk
r�t|�t||�}q1Xq1W|S(s)Resolve a dotted name to a global object.t.i(tsplittpopt
__import__tgetattrtAttributeError(tnametusedtfoundtn((s&/usr/lib64/python2.7/logging/config.pyt_resolve[s


cCstd�|�S(NcSs
|j�S(N(tstrip(tx((s&/usr/lib64/python2.7/logging/config.pyt<lambda>jt(tmap(talist((s&/usr/lib64/python2.7/logging/config.pyt
_strip_spacesiscCs t|t�r|S|jd�S(Nsutf-8(t
isinstancetstrtencode(ts((s&/usr/lib64/python2.7/logging/config.pyt_encodedlscCs|jdd�}t|�s"iS|jd�}t|�}i}x�|D]�}d|}|j|�}d|kr�|j|dd�}nd	}d|kr�|j|dd�}nd	}tj}d|kr�|j|d�}	|	r�t|	�}q�n|||�}
|
||<qJW|S(
sCreate and return formattersRtkeyst,sformatter_%stformatitdatefmttclassN(	tgettlenRR(toptionstNoneRt	FormatterR!(RtflistRtformtsectnametoptstfstdfstct
class_nametf((s&/usr/lib64/python2.7/logging/config.pyRos.

	cCs
|jdd�}t|�s"iS|jd�}t|�}i}g}x�|D]�}d|}|j|d�}|j|�}d|kr�|j|d�}	nd}	yt|tt��}Wn#tt	fk
r�t
|�}nX|j|d�}
t|
tt��}
||
�}d	|krO|j|d	�}|jtj|�nt|	�ro|j
||	�nt|tjj�r�d
|kr�|j|d
�}
nd}
t|
�r�|j||
f�q�n|||<qPWx%|D]\}}|j||�q�W|S(sInstall and return handlersRR.R/s
handler_%sR2t	formatterR%targstlevelttarget(R3R4RR(R5tevaltvarsRRt	NameErrorR!tsetLevelt_levelNamestsetFormattert
issubclassRt
MemoryHandlertappendt	setTarget(RRthlistRtfixupsthandR:tklassR;tfmtRBthRCRDtt((s&/usr/lib64/python2.7/logging/config.pyR
�sH

cCsq|jdd�}|jd�}ttd�|��}|jd�d}tj}|}|j|�}d|kr�|j|d�}|jtj	|�nx|j
D]}	|j|	�q�W|j|d�}
t|
�r|
jd�}
t
|
�}
x"|
D]}|j||�qWnt|jjj��}|j�g}
x�|D]�}d	|}|j|d
�}|j|�}d|kr�|j|d�}nd}tj|�}||krK|j|�d}|d
}t|�}t|�}xB||kr:||| |kr-|
j||�n|d7}q�W|j|�nd|kr�|j|d�}|jtj	|�nx|j
D]}	|j|	�q�W||_d|_|j|d�}
t|
�rN|
jd�}
t
|
�}
x"|
D]}|j||�q�WqNqNWxT|D]L}|jj|}||
kr`tj|_g|_
d|_q||_qWdS(sCreate and install loggerstloggersR.R/cSs
|j�S(N(R"(R#((s&/usr/lib64/python2.7/logging/config.pyR$�R%troottlogger_rootRCRs	logger_%stqualnamet	propagateiRiN(R3RtlistR&tremoveRRWR5RHRIRt
removeHandlerR4R(t
addHandlertmanagert
loggerDictR.tsorttgetintt	getLoggertindexRMRZtdisabledtNOTSETRC(RRRtllistR:RWtlogR;RCRTRORQtexistingt
child_loggerstqnRZtloggertitprefixedtpflentnum_existing((s&/usr/lib64/python2.7/logging/config.pyR�sx
	




		

	s^[a-z_][a-z0-9_]*$cCs,tj|�}|s(td|��ntS(Ns!Not a valid Python identifier: %r(t
IDENTIFIERtmatcht
ValueErrortTrue(R,tm((s&/usr/lib64/python2.7/logging/config.pytvalid_identstConvertingMixincBs#eZdZed�Zd�ZRS(s?For ConvertingXXX's, this mixin class provides common functionscCsh|jj|�}||k	rd|r1|||<nt|�tttfkrd||_||_qdn|S(N(tconfiguratortconvertttypetConvertingDicttConvertingListtConvertingTupletparenttkey(tselfRtvaluetreplacetresult((s&/usr/lib64/python2.7/logging/config.pytconvert_with_key s
	cCsL|jj|�}||k	rHt|�tttfkrH||_qHn|S(N(RxRyRzR{R|R}R~(R�R�R�((s&/usr/lib64/python2.7/logging/config.pyRy,s(t__name__t
__module__t__doc__RtR�Ry(((s&/usr/lib64/python2.7/logging/config.pyRwsR{cBs/eZdZd�Zdd�Zdd�ZRS(s A converting dictionary wrapper.cCs"tj||�}|j||�S(N(tdictt__getitem__R�(R�RR�((s&/usr/lib64/python2.7/logging/config.pyR�AscCs%tj|||�}|j||�S(N(R�R3R�(R�RtdefaultR�((s&/usr/lib64/python2.7/logging/config.pyR3EscCs+tj|||�}|j||dt�S(NR�(R�RR�tFalse(R�RR�R�((s&/usr/lib64/python2.7/logging/config.pyRIsN(R�R�R�R�R6R3R(((s&/usr/lib64/python2.7/logging/config.pyR{>s	R|cBs#eZdZd�Zdd�ZRS(sA converting list wrapper.cCs"tj||�}|j||�S(N(R[R�R�(R�RR�((s&/usr/lib64/python2.7/logging/config.pyR�Osi����cCstj||�}|j|�S(N(R[RRy(R�tidxR�((s&/usr/lib64/python2.7/logging/config.pyRSs(R�R�R�R�R(((s&/usr/lib64/python2.7/logging/config.pyR|Ms	R}cBseZdZd�ZRS(sA converting tuple wrapper.cCs(tj||�}|j||dt�S(NR�(ttupleR�R�R�(R�RR�((s&/usr/lib64/python2.7/logging/config.pyR�Ys(R�R�R�R�(((s&/usr/lib64/python2.7/logging/config.pyR}WstBaseConfiguratorcBs�eZdZejd�Zejd�Zejd�Zejd�Zejd�Z	idd6dd	6Z
eZd
�Z
d�Zd�Zd
�Zd�Zd�Zd�ZRS(sI
    The configurator base class which defines some useful defaults.
    s%^(?P<prefix>[a-z]+)://(?P<suffix>.*)$s^\s*(\w+)\s*s^\.\s*(\w+)\s*s^\[\s*(\w+)\s*\]\s*s^\d+$text_converttexttcfg_converttcfgcCs@t|�|_||j_tt�tjkr<t|_ndS(N(R{tconfigRxRzRttypestFunctionTypetimporter(R�R�((s&/usr/lib64/python2.7/logging/config.pyt__init__rsc	Cs�|jd�}|jd�}yy|j|�}x_|D]W}|d|7}yt||�}Wq7tk
r�|j|�t||�}q7Xq7W|SWnVtk
r�tj�d\}}td||f�}|||_	|_
|�nXdS(s`
        Resolve strings to objects using standard import and attribute
        syntax.
        RiisCannot resolve %r: %sN(RRR�RRtImportErrortsystexc_infoRst	__cause__t
__traceback__(	R�R,RRRtfragtettbtv((s&/usr/lib64/python2.7/logging/config.pytresolve|s"



cCs
|j|�S(s*Default converter for the ext:// protocol.(R�(R�R�((s&/usr/lib64/python2.7/logging/config.pyR��scCsO|}|jj|�}|dkr7td|��n||j�}|j|j�d}x�|rJ|jj|�}|r�||j�d}n�|jj|�}|r|j�d}|j	j|�s�||}qyt
|�}||}Wqtk
r||}qXn|r1||j�}qatd||f��qaW|S(s*Default converter for the cfg:// protocol.sUnable to convert %risUnable to convert %r at %rN(tWORD_PATTERNRrR6RstendR�tgroupstDOT_PATTERNt
INDEX_PATTERNt
DIGIT_PATTERNtintt	TypeError(R�R�trestRutdR�R ((s&/usr/lib64/python2.7/logging/config.pyR��s2	

cCs/t|t�r7t|t�r7t|�}||_n�t|t�rnt|t�rnt|�}||_n�t|t�r�t|t�r�t|�}||_n�t|t�r+|j	j
|�}|r+|j�}|d}|jj
|d�}|r(|d}t||�}||�}q(q+n|S(s�
        Convert values to an appropriate type. dicts, lists and tuples are
        replaced by their converting alternatives. Strings are checked to
        see if they have a conversion format and are converted if they do.
        tprefixtsuffixN(R)R{R�RxR|R[R}R�t
basestringtCONVERT_PATTERNRrt	groupdicttvalue_convertersR3R6R(R�R�RuR�R�t	converterR�((s&/usr/lib64/python2.7/logging/config.pyRy�s*

c	Cs�|jd�}t|d�rUttd�rUt|�tjkrU|j|�}n|jdd�}tg|D]"}t|�rq|||f^qq�}||�}|r�x-|j	�D]\}}t
|||�q�Wn|S(s1Configure an object with a user-supplied factory.s()t__call__t	ClassTypeRN(RRR�RzR�R�R6R�Rvtitemstsetattr(	R�R�R>tpropstktkwargsR�RR�((s&/usr/lib64/python2.7/logging/config.pytconfigure_custom�s45cCs"t|t�rt|�}n|S(s0Utility function which converts lists to tuples.(R)R[R�(R�R�((s&/usr/lib64/python2.7/logging/config.pytas_tuple�s(R�R�R�tretcompileR�R�R�R�R�R�RR�R�R�R�R�RyR�R�(((s&/usr/lib64/python2.7/logging/config.pyR�^s"
	
			"		tDictConfiguratorcBsheZdZd�Zd�Zd�Zd�Zd�Zd�Ze	d�Z
e	d�Ze	d	�ZRS(
s]
    Configure logging using a dictionary-like object to describe the
    configuration.
    cCs�|j}d|kr$td��n|ddkrKtd|d��n|jdt�}i}tj�zz|r�|jd|�}x�|D]�}|tjkr�td|��q�yLtj|}||}|jdd�}|r|j	tj
|��nWq�tk
r.}	td	||	f��q�Xq�W|jd
|�}
xU|
D]M}y|j||
|t
�WqLtk
r�}	td||	f��qLXqLW|jdd�}|r�y|j|t
�Wq�tk
r�}	td
|	��q�Xq�n�|jdt
�}tjj�tj2|jd|�}
xU|
D]M}y|j|
|�|
|<Wq4tk
r�}	td||	f��q4Xq4W|jd|�}xU|D]M}y|j||�||<Wq�tk
r�}	td||	f��q�Xq�W|jd|�}g}x�t|�D]~}y*|j||�}||_|||<Wqtk
r�}	dt|	�krx|j|�q�td	||	f��qXqWxd|D]\}y*|j||�}||_|||<Wq�tk
r�}	td	||	f��q�Xq�Wtj}|jjj�}|j�g}|jd
|�}
x�|
D]�}t|�}||kr�|j|�}|d}t|�}t|�}|d}x?||kr�||| |kr�|j||�|d}q�W|j |�ny|j||
|�WqAtk
r/}	td||	f��qAXqAWx]|D]U}|jj|}||kr~tj!|_"g|_#t
|_$q;|r;t
|_%q;q;W|jdd�}|r�y|j|�Wq�tk
r�}	td
|	��q�XnWdtj&�XdS(sDo the configuration.tversions$dictionary doesn't specify a versionisUnsupported version: %stincrementalRsNo handler found with name %rRCs"Unable to configure handler %r: %sRVs!Unable to configure logger %r: %sRWs#Unable to configure root logger: %sRRs$Unable to configure formatter %r: %stfilterss!Unable to configure filter %r: %sstarget not configured yetRN('R�RsRR�RR	R3R
R6RHt_checkLevelt
StandardErrortconfigure_loggerRttconfigure_rootRRtconfigure_formattertconfigure_filtertsortedtconfigure_handlerRR*RMRWR_R`R.RaR-RdR4R\RfRCRRZReR(R�R�R�t
EMPTY_DICTRRthandlerthandler_configRCR�RVRWtdisable_existingRR�tdeferredRiRjRmRnRoRpRhRl((s&/usr/lib64/python2.7/logging/config.pyt	configure�s�	








	
		




	cCs�d|kr�|d}y|j|�}Wq�tk
r�}dt|�krS�n|jd�|d<||d<|j|�}q�Xn6|jdd�}|jdd�}tj||�}|S(s(Configure a formatter from a dictionary.s()s'format'R0RSR1N(R�R�R*RR3R6RR7(R�R�tfactoryR�tteRStdfmt((s&/usr/lib64/python2.7/logging/config.pyR��s

cCsCd|kr|j|�}n!|jdd�}tj|�}|S(s%Configure a filter from a dictionary.s()RR%(R�R3RtFilter(R�R�R�R((s&/usr/lib64/python2.7/logging/config.pyR��s
cCs]xV|D]N}y|j|jd|�Wqtk
rT}td||f��qXqWdS(s/Add filters to a filterer from a list of names.R�sUnable to add filter %r: %sN(t	addFilterR�R�Rs(R�tfiltererR�R@R�((s&/usr/lib64/python2.7/logging/config.pytadd_filters�s

cCs|jdd�}|r\y|jd|}Wq\tk
rX}td||f��q\Xn|jdd�}|jdd�}d|kr�|jd�}t|d�r�ttd�r�t|�tjkr�|j	|�}n|}n<|jd	�}|j	|�}	t
|	tjj
�r�d
|kr�yN|jd|d
}
t|
tj�sl||d	<td��n|
|d
<Wq tk
r�}td
|d
|f��q Xnvt
|	tjj�r�d|kr�|j|d�|d<n;t
|	tjj�r d|kr |j|d�|d<n|	}tg|D]"}t|�r0|||f^q0�}y||�}
WnJtk
r�}dt|�kr��n|jd�|d<||�}
nX|r�|
j|�n|dk	r�|
jtj|��n|r|j|
|�n|
S(s&Configure a handler from a dictionary.RARsUnable to set formatter %r: %sRCR�s()R�R�R2RDRstarget not configured yets#Unable to set target handler %r: %stmailhosttaddresss'stream'tstreamtstrmN(RR6R�R�RsRR�RzR�R�RKRRRLR)tHandlertSMTPHandlerR�t
SysLogHandlerR�RvR�R*RJRHR�R�(R�R�RAR�RCR�R>R�tcnameRRtthR�R�R�R�((s&/usr/lib64/python2.7/logging/config.pyR��sb4	
5cCs]xV|D]N}y|j|jd|�Wqtk
rT}td||f��qXqWdS(s.Add handlers to a logger from a list of names.RsUnable to add handler %r: %sN(R^R�R�Rs(R�RlRRTR�((s&/usr/lib64/python2.7/logging/config.pytadd_handlers�s

cCs�|jdd�}|dk	r7|jtj|��n|s�x|jD]}|j|�qHW|jdd�}|r�|j||�n|jdd�}|r�|j||�q�ndS(sU
        Perform configuration which is common to root and non-root loggers.
        RCRR�N(	R3R6RHRR�RR]R�R�(R�RlR�R�RCRTRR�((s&/usr/lib64/python2.7/logging/config.pytcommon_logger_config�scCsPtj|�}|j|||�|jdd�}|dk	rL||_ndS(s.Configure a non-root logger from a dictionary.RZN(RRcR�R3R6RZ(R�RR�R�RlRZ((s&/usr/lib64/python2.7/logging/config.pyR�	s
cCs#tj�}|j|||�dS(s*Configure a root logger from a dictionary.N(RRcR�(R�R�R�RW((s&/usr/lib64/python2.7/logging/config.pyR�s(
R�R�R�R�R�R�R�R�R�R�R�R�R�(((s&/usr/lib64/python2.7/logging/config.pyR��s	�					:	cCst|�j�dS(s%Configure logging using a dictionary.N(tdictConfigClassR�(R�((s&/usr/lib64/python2.7/logging/config.pyt
dictConfigscsptstd��ndtfd��Y}dtfd��Y}dtjf�fd��Y��|||�S(sW
    Start up a socket server on the specified port, and listen for new
    configurations.

    These will be sent as a file suitable for processing by fileConfig().
    Returns a Thread object on which you can call start() to start the server,
    and which you can join() when appropriate. To stop the server, call
    stopListening().
    s listen() needs threading to worktConfigStreamHandlercBseZdZd�ZRS(s�
        Handler for a logging configuration request.

        It expects a completely new logging configuration and uses fileConfig
        to install it.
        c	Ssiddl}y+|j}|jd�}t|�dkr6tjd|�d}|jj|�}x3t|�|kr�||j|t|��}qdWy)ddl}|j|�}t|�WnQt	j
|�}yt|�Wqtt
fk
r��qtj�qXnX|jjr6|jjj�q6nWn+tjk
rd}|jtkre�qenXdS(s�
            Handle a request.

            Each request is expected to be a 4-byte length, packed using
            struct.pack(">L", n), followed by the config file.
            Uses fileConfig() to do the grunt work.
            i����Nis>Li(ttempfilet
connectiontrecvR4tstructtunpacktjsontloadsR�t	cStringIOtStringIORtKeyboardInterruptt
SystemExitt	tracebackt	print_exctservertreadytsettsocketterrorterrnotRESET_ERROR(	R�R�tconntchunktslenR�R�tfileR�((s&/usr/lib64/python2.7/logging/config.pythandle1s4	!(R�R�R�R�(((s&/usr/lib64/python2.7/logging/config.pyR�*stConfigSocketReceivercBs2eZdZdZdeddd�Zd�ZRS(sD
        A simple TCP socket-based logging config receiver.
        it	localhostcSsLtj|||f|�tj�d|_tj�d|_||_dS(Nii(RR�RR	tabortRttimeoutR�(R�thosttportR�R�((s&/usr/lib64/python2.7/logging/config.pyR�^s
	
	cSs�ddl}d}xj|s~|j|jj�ggg|j�\}}}|r^|j�ntj�|j}tj�qW|jj	�dS(Ni����i(
tselectR�tfilenoRthandle_requestRR	RRtclose(R�RRtrdtwrtex((s&/usr/lib64/python2.7/logging/config.pytserve_until_stoppedgs	

	N(R�R�R�tallow_reuse_addresstDEFAULT_LOGGING_CONFIG_PORTR6R�R(((s&/usr/lib64/python2.7/logging/config.pyR�Ws
tServercs eZ�fd�Zd�ZRS(csAt�|�j�||_||_||_tj�|_dS(N(tsuperR�trcvrthdlrRt	threadingtEventR�(R�RRR(R(s&/usr/lib64/python2.7/logging/config.pyR�ws
			cSs~|jd|jd|jd|j�}|jdkrI|jd|_n|jj�tj�|atj	�|j
�dS(NRR�R�ii(RRRR�tserver_addressR�RR	t	_listenerRR(R�R�((s&/usr/lib64/python2.7/logging/config.pytrun~s


(R�R�R�R((R(s&/usr/lib64/python2.7/logging/config.pyRus(tthreadtNotImplementedErrorRRRtThread(RR�R�((Rs&/usr/lib64/python2.7/logging/config.pytlistens
-cCs8tj�ztr%dt_danWdtj�XdS(sN
    Stop the listening server which was created with a call to listen().
    iN(RR	RRR6R(((s&/usr/lib64/python2.7/logging/config.pyt
stopListening�s
	
(2R�R�R�tioRtlogging.handlerstosR�R�R�R�R�R�RRR�R6tSocketServerRRR
t
ECONNRESETR�RRtRR!R(R-RR
RR�tIRqRvtobjectRwR�R{R[R|R�R}R�R�R�R�RR(((s&/usr/lib64/python2.7/logging/config.pyt<module>sR

						+	\	!
��.	ohandlers.pyc000064400000115312150327210520007061 0ustar00�
{fc@s"dZddlZddlZddlZddlZddlZddlZddlZddlZddl	m
Z
mZmZyddl
Z
Wnek
r�dZ
nXyeeZWnek
r�eZnXdZdZdZdZdZdZd$Zdejfd��YZd
efd��YZdefd��YZdejfd��YZ dej!fd��YZ"de"fd��YZ#dej!fd��YZ$dej!fd��YZ%dej!fd��YZ&dej!fd��YZ'dej!fd ��YZ(d!e(fd"��YZ)dS(%s�
Additional handlers for the logging package for Python. The core package is
based on PEP 282 and comments thereto in comp.lang.python.

Copyright (C) 2001-2013 Vinay Sajip. All Rights Reserved.

To use, simply 'import logging.handlers' and log away!
i����N(tST_DEVtST_INOtST_MTIMEi<#i=#i>#i?#iii<tBaseRotatingHandlercBs&eZdZddd�Zd�ZRS(s�
    Base class for handlers that rotate log files at a certain point.
    Not meant to be instantiated directly.  Instead, use RotatingFileHandler
    or TimedRotatingFileHandler.
    icCsGtdkrd}ntjj|||||�||_||_dS(sA
        Use the specified filename for streamed logging
        N(tcodecstNonetloggingtFileHandlert__init__tmodetencoding(tselftfilenameR	R
tdelay((s(/usr/lib64/python2.7/logging/handlers.pyR:s
		cCsgy3|j|�r|j�ntjj||�Wn-ttfk
rO�n|j|�nXdS(s�
        Emit a record.

        Output the record to the file, catering for rollover as described
        in doRollover().
        N(tshouldRollovert
doRolloverRRtemittKeyboardInterruptt
SystemExitthandleError(Rtrecord((s(/usr/lib64/python2.7/logging/handlers.pyRDs
N(t__name__t
__module__t__doc__RRR(((s(/usr/lib64/python2.7/logging/handlers.pyR4s
tRotatingFileHandlercBs8eZdZdddddd�Zd�Zd�ZRS(s�
    Handler for logging to a set of files, which switches from one file
    to the next when the current file reaches a certain size.
    taicCsD|dkrd}ntj|||||�||_||_dS(s�
        Open the specified file and use it as the stream for logging.

        By default, the file grows indefinitely. You can specify particular
        values of maxBytes and backupCount to allow the file to rollover at
        a predetermined size.

        Rollover occurs whenever the current log file is nearly maxBytes in
        length. If backupCount is >= 1, the system will successively create
        new files with the same pathname as the base file, but with extensions
        ".1", ".2" etc. appended to it. For example, with a backupCount of 5
        and a base file name of "app.log", you would get "app.log",
        "app.log.1", "app.log.2", ... through to "app.log.5". The file being
        written to is always "app.log" - when it gets filled up, it is closed
        and renamed to "app.log.1", and if files "app.log.1", "app.log.2" etc.
        exist, then they are renamed to "app.log.2", "app.log.3" etc.
        respectively.

        If maxBytes is zero, rollover never occurs.
        iRN(RRtmaxBytestbackupCount(RRR	RRR
R
((s(/usr/lib64/python2.7/logging/handlers.pyRYs
		cCsB|jr"|jj�d|_n|jdkr#x�t|jddd�D]w}d|j|f}d|j|df}tjj|�rKtjj|�r�tj	|�ntj
||�qKqKW|jd}tjj|�r�tj	|�ntjj|j�r#tj
|j|�q#n|js>|j�|_ndS(s<
        Do a rollover, as described in __init__().
        iii����s%s.%ds.1N(
tstreamtcloseRRtrangetbaseFilenametostpathtexiststremovetrenameR
t_open(Rtitsfntdfn((s(/usr/lib64/python2.7/logging/handlers.pyRys$	
 
	cCs�|jdkr!|j�|_n|jdkrd|j|�}|jjdd�|jj�t|�|jkrdSndS(s�
        Determine if rollover should occur.

        Basically, see if the supplied record would cause the file to exceed
        the size limit we have.
        is%s
iiN(RRR%Rtformattseekttelltlen(RRtmsg((s(/usr/lib64/python2.7/logging/handlers.pyR�s"N(RRRRRRR(((s(/usr/lib64/python2.7/logging/handlers.pyRTs 	tTimedRotatingFileHandlercBsMeZdZdddd	eed�Zd�Zd�Zd�Zd�Z	RS(
s�
    Handler for logging to a file, rotating the log file at certain timed
    intervals.

    If backupCount is > 0, when rollover is done, no more than backupCount
    files are kept - the oldest ones are deleted.
    thiic	Cs2tj||d||�|j�|_||_||_|jdkrgd|_d|_d|_nV|jdkr�d|_d|_d	|_n)|jd
kr�d|_d|_d|_n�|jd
ks�|jdkr�d|_d|_d|_n�|jj	d�r�d|_t
|j�dkrCtd|j��n|jddksi|jddkrtd|j��nt|jd�|_
d|_d|_ntd|j��tj|j�|_|j||_tjj|�r
tj|�t}nttj��}|j|�|_dS( NRtSis%Y-%m-%d_%H-%M-%Ss%^\d{4}-\d{2}-\d{2}_\d{2}-\d{2}-\d{2}$tMi<s%Y-%m-%d_%H-%Ms^\d{4}-\d{2}-\d{2}_\d{2}-\d{2}$tHs%Y-%m-%d_%Hs^\d{4}-\d{2}-\d{2}_\d{2}$tDtMIDNIGHTis%Y-%m-%ds^\d{4}-\d{2}-\d{2}$tWiisHYou must specify a day for weekly rollover from 0 to 6 (0 is Monday): %st0t6s-Invalid day specified for weekly rollover: %ss'Invalid rollover interval specified: %siii�Qii�Qi�:	(RRtuppertwhenRtutctintervaltsuffixtextMatcht
startswithR,t
ValueErrortintt	dayOfWeektretcompileR R!R"tstatRttimetcomputeRollovert
rolloverAt(	RRR9R;RR
R
R:tt((s(/usr/lib64/python2.7/logging/handlers.pyR�sH		
									&	cCsq||j}|jdks.|jjd�rm|jrItj|�}ntj|�}|d}|d}|d}t|d|d|}||}|jjd�rm|d}||jkrj||jkr�|j|}	nd||jd}	||	d}
|js^|d
}tj|
�d
}||kr^|sHd}
nd}
|
|
7}
q^n|
}qjqmn|S(sI
        Work out the rollover time based on the specified time.
        R4R5iiii<iiii����i��iii�Q(	R;R9R>R:REtgmtimet	localtimet	_MIDNIGHTRA(RtcurrentTimetresultRHtcurrentHourt
currentMinutet
currentSecondtrtdayt
daysToWaitt
newRolloverAttdstNowt
dstAtRollovertaddend((s(/usr/lib64/python2.7/logging/handlers.pyRF�s8
!	




	
	cCs)ttj��}||jkr%dSdS(s�
        Determine if rollover should occur.

        record is not used, as we are just comparing times, but it is needed so
        the method signatures are the same
        ii(R@RERG(RRRH((s(/usr/lib64/python2.7/logging/handlers.pyRsc	Cs�tjj|j�\}}tj|�}g}|d}t|�}x\|D]T}|| |krM||}|jj|�r�|jtjj	||��q�qMqMW|j
�t|�|jkr�g}n|t|�|j }|S(s�
        Determine the files to delete when rolling over.

        More specific than the earlier method, which just used glob.glob().
        t.(R R!tsplitRtlistdirR,R=tmatchtappendtjointsortR(	RtdirNametbaseNamet	fileNamesRMtprefixtplentfileNameR<((s(/usr/lib64/python2.7/logging/handlers.pytgetFilesToDelete(s


&
	cCs+|jr"|jj�d|_nttj��}tj|�d}|j|j}|jrrtj	|�}nPtj|�}|d}||kr�|r�d}nd}tj||�}n|j
dtj|j|�}t
jj|�rt
j|�nt
jj|j
�r/t
j|j
|�n|jdkrex$|j�D]}t
j|�qKWn|js�|j�|_n|j|�}	x|	|kr�|	|j}	q�W|jdks�|jjd�r|jrtj|	�d}
||
kr|sd}nd}|	|7}	qn|	|_dS(	sx
        do a rollover; in this case, a date/time stamp is appended to the filename
        when the rollover happens.  However, you want the file to be named for the
        start of the interval, not the current time.  If there is a backup count,
        then we have to get a list of matching filenames, sort them and remove
        the one with the oldest suffix.
        i����ii��RXiR4R5N(RRRR@RERJRGR;R:RIRtstrftimeR<R R!R"R#R$RReR
R%RFR9R>(RRLRURHt	timeTupletdstThenRWR(tsRTRV((s(/usr/lib64/python2.7/logging/handlers.pyR?sH	
	
	 	+	N(
RRRRtFalseRRFRReR(((s(/usr/lib64/python2.7/logging/handlers.pyR.�s5	<	
	tWatchedFileHandlercBs2eZdZdddd�Zd�Zd�ZRS(s�
    A handler for logging to a file, which watches the file
    to see if it has changed while in use. This can happen because of
    usage of programs such as newsyslog and logrotate which perform
    log file rotation. This handler, intended for use under Unix,
    watches the file to see if it has changed since the last emit.
    (A file has changed if its device or inode have changed.)
    If it has changed, the old file stream is closed, and the file
    opened to get a new stream.

    This handler is not appropriate for use under Windows, because
    under Windows open files cannot be moved or renamed - logging
    opens the files with exclusive locks - and so there is no need
    for such a handler. Furthermore, ST_INO is not supported under
    Windows; stat always returns zero for this value.

    This handler is based on a suggestion and patch by Chad J.
    Schroeder.
    RicCs<tjj|||||�d\|_|_|j�dS(Ni����(i����i����(RRRtdevtinot_statstream(RRR	R
R
((s(/usr/lib64/python2.7/logging/handlers.pyR�scCsC|jr?tj|jj��}|t|t|_|_ndS(N(RR tfstattfilenoRRRlRm(Rtsres((s(/usr/lib64/python2.7/logging/handlers.pyRn�s	cCs�ytj|j�}Wn1tk
rI}|jtjkrCd}qJ�nX|sw|t|jksw|t	|j
kr�|jdk	r�|jj�|jj
�d|_|j�|_|j�q�ntjj||�dS(s�
        Emit a record.

        First check if the underlying file has changed, and if it
        has, close the old stream and reopen the file to get the
        current stream.
        N(R RDRtOSErrorterrnotENOENTRRRlRRmRtflushRR%RnRRR(RRRqterr((s(/usr/lib64/python2.7/logging/handlers.pyR�s	-

	N(RRRRRRnR(((s(/usr/lib64/python2.7/logging/handlers.pyRkrs	t
SocketHandlercBsYeZdZd�Zdd�Zd�Zd�Zd�Zd�Zd�Z	d	�Z
RS(
s
    A handler class which writes logging records, in pickle format, to
    a streaming socket. The socket is kept open across logging calls.
    If the peer resets it, an attempt is made to reconnect on the next call.
    The pickle which is sent is that of the LogRecord's attribute dictionary
    (__dict__), so that the receiver does not need to have the logging module
    installed in order to process the logging event.

    To unpickle the record at the receiving end into a LogRecord, use the
    makeLogRecord function.
    cCs\tjj|�||_||_d|_d|_d|_d|_	d|_
d|_dS(s	
        Initializes the handler with a specific host address and port.

        The attribute 'closeOnError' is set to 1 - which means that if
        a socket error occurs, the socket is silently closed and then
        reopened on the next logging call.
        ig�?g>@g@N(RtHandlerRthosttportRtsocktcloseOnErrort	retryTimet
retryStarttretryMaxtretryFactor(RRyRz((s(/usr/lib64/python2.7/logging/handlers.pyR�s							icCsTtjtjtj�}t|d�r7|j|�n|j|j|jf�|S(sr
        A factory method which allows subclasses to define the precise
        type of socket they want.
        t
settimeout(tsockettAF_INETtSOCK_STREAMthasattrR�tconnectRyRz(RttimeoutRi((s(/usr/lib64/python2.7/logging/handlers.pyt
makeSocket�s
cCs�tj�}|jdkr$d}n||jk}|r�y|j�|_d|_Wq�tjk
r�|jdkr�|j|_n4|j|j	|_|j|j
kr�|j
|_n||j|_q�XndS(s�
        Try to create a socket, using an exponential backoff with
        a max retry time. Thanks to Robert Olson for the original patch
        (SF #815911) which has been slightly refactored.
        iN(RER}RR�R{R�terrorR~tretryPeriodR�R(Rtnowtattempt((s(/usr/lib64/python2.7/logging/handlers.pytcreateSocket�s	
cCs�|jdkr|j�n|jr�yxt|jd�rM|jj|�nOd}t|�}x:|dkr�|jj||�}||}||}qbWWq�tjk
r�|jj	�d|_q�XndS(s�
        Send a pickled string to the socket.

        This function allows for partial sends which can happen when the
        network is busy.
        tsendalliN(
R{RR�R�R�R,tsendR�R�R(RRit	sentsofartlefttsent((s(/usr/lib64/python2.7/logging/handlers.pyR��s
	

cCs�|j}|r*|j|�}d|_nt|j�}|j�|d<d|d<tj|d�}|rw||_ntj	dt
|��}||S(s�
        Pickles the record in binary format with a length prefix, and
        returns it ready for transmission across the socket.
        R-targsis>LN(texc_infoR)Rtdictt__dict__t
getMessagetcPickletdumpststructtpackR,(RRteitdummytdRitslen((s(/usr/lib64/python2.7/logging/handlers.pyt
makePickles	
cCsB|jr+|jr+|jj�d|_ntjj||�dS(s�
        Handle an error during logging.

        An error has occurred during logging. Most likely cause -
        connection lost. Close the socket so that we can retry on the
        next event.
        N(R|R{RRRRxR(RR((s(/usr/lib64/python2.7/logging/handlers.pyR*s
cCsTy |j|�}|j|�Wn-ttfk
r<�n|j|�nXdS(s
        Emit a record.

        Pickles the record and writes it to the socket in binary format.
        If there is an error with the socket, silently drop the packet.
        If there was a problem with the socket, re-establishes the
        socket.
        N(R�R�RRR(RRRi((s(/usr/lib64/python2.7/logging/handlers.pyR8s	cCsU|j�z)|j}|r2d|_|j�nWd|j�Xtjj|�dS(s$
        Closes the socket.
        N(tacquireR{RRtreleaseRRx(RR{((s(/usr/lib64/python2.7/logging/handlers.pyRIs
		(RRRRR�R�R�R�RRR(((s(/usr/lib64/python2.7/logging/handlers.pyRw�s						tDatagramHandlercBs)eZdZd�Zd�Zd�ZRS(s�
    A handler class which writes logging records, in pickle format, to
    a datagram socket.  The pickle which is sent is that of the LogRecord's
    attribute dictionary (__dict__), so that the receiver does not need to
    have the logging module installed in order to process the logging event.

    To unpickle the record at the receiving end into a LogRecord, use the
    makeLogRecord function.

    cCs tj|||�d|_dS(sP
        Initializes the handler with a specific host address and port.
        iN(RwRR|(RRyRz((s(/usr/lib64/python2.7/logging/handlers.pyRbscCstjtjtj�}|S(su
        The factory method of SocketHandler is here overridden to create
        a UDP socket (SOCK_DGRAM).
        (R�R�t
SOCK_DGRAM(RRi((s(/usr/lib64/python2.7/logging/handlers.pyR�iscCs?|jdkr|j�n|jj||j|jf�dS(s�
        Send a pickled string to a socket.

        This function no longer allows for partial sends which can happen
        when the network is busy - UDP does not guarantee delivery and
        can deliver packets out of sequence.
        N(R{RR�tsendtoRyRz(RRi((s(/usr/lib64/python2.7/logging/handlers.pyR�qs
(RRRRR�R�(((s(/usr/lib64/python2.7/logging/handlers.pyR�Ws
		t
SysLogHandlercBseZdZdZdZdZdZdZdZdZ	dZ
dZdZdZ
dZdZdZdZdZd	Zd
ZdZdZd
ZdZdZdZdZdZdZdZied6ed6ed6e
d6ed6ed6ed6e	d6ed6ed6ed6ed 6Zied!6ed"6ed#6ed$6ed%6ed&6ed'6e
d(6ed)6ed*6ed+6ed,6ed-6ed.6ed/6ed06ed16ed26ed36ed46ed56Z idd66dd76d d86dd96dd:6Z!d;e"fedCd<�Z$d=�Z%d>Z&d?�Z'd@�Z(dA�Z)dB�Z*RS(Ds
    A handler class which sends formatted logging records to a syslog
    server. Based on Sam Rushing's syslog module:
    http://www.nightmare.com/squirl/python-ext/misc/syslog.py
    Contributed by Nicolas Untz (after which minor refactoring changes
    have been made).
    iiiiiiiiii	i
iiiiiiiiitalerttcrittcriticaltdebugtemergRvR�tinfotnoticetpanictwarntwarningtauthtauthprivtcrontdaemontftptkerntlprtmailtnewstsecuritytsyslogtusertuucptlocal0tlocal1tlocal2tlocal3tlocal4tlocal5tlocal6tlocal7tDEBUGtINFOtWARNINGtERRORtCRITICALt	localhostcCs|tjj|�||_||_||_t|t�rSd|_|j	|�n%t
|_|dkrttj
}n|\}}tj||d|�}|s�tjd��nx�|D]�}|\}}}	}
}d}}
y9tj|||	�}
|tjkr|
j|�nPWq�tjk
rL}|}|
dk	rM|
j�qMq�Xq�W|dk	rf|�n|
|_||_dS(s
        Initialize a handler.

        If address is specified as a string, a UNIX socket is used. To log to a
        local syslogd, "SysLogHandler(address="/dev/log")" can be used.
        If facility is not specified, LOG_USER is used. If socktype is
        specified as socket.SOCK_DGRAM or socket.SOCK_STREAM, that specific
        socket type will be used. For Unix sockets, you can also specify a
        socktype of None, in which case socket.SOCK_DGRAM will be used, falling
        back to socket.SOCK_STREAM.
        iis!getaddrinfo returns an empty listN(RRxRtaddresstfacilitytsocktypet
isinstancet
basestringt
unixsockett_connect_unixsocketRjRR�R�tgetaddrinfoR�R�R�R(RR�R�R�RyRztresstrestaftprotot_tsaRvR{texc((s(/usr/lib64/python2.7/logging/handlers.pyR�s<
					

		cCs�|j}|dkr!tj}ntjtj|�|_y|jj|�||_Wn�tjk
r�|jj�|jdk	r��ntj}tjtj|�|_y|jj|�||_Wq�tjk
r�|jj��q�XnXdS(N(	R�RR�R�tAF_UNIXR�R�RR�(RR�tuse_socktype((s(/usr/lib64/python2.7/logging/handlers.pyR�s&	

	

s<%d>%scCsJt|t�r|j|}nt|t�r>|j|}n|d>|BS(s�
        Encode the facility and priority. You can pass in strings or
        integers - if strings are passed, the facility_names and
        priority_names mapping dictionaries are used to convert them to
        integers.
        i(R�R�tfacility_namestpriority_names(RR�tpriority((s(/usr/lib64/python2.7/logging/handlers.pytencodePriority1s
cCsI|j�z|jr&|jj�nWd|j�Xtjj|�dS(s$
        Closes the socket.
        N(R�R�R�RR�RRx(R((s(/usr/lib64/python2.7/logging/handlers.pyR>s
	cCs|jj|d�S(sK
        Map a logging level name to a key in the priority_names map.
        This is useful in two scenarios: when custom levels are being
        used, and in the case where you can't do a straightforward
        mapping by lowercasing the logging level name because of locale-
        specific issues (see SF #1524081).
        R�(tpriority_maptget(Rt	levelName((s(/usr/lib64/python2.7/logging/handlers.pytmapPriorityJscCs=y	|j|�d}d|j|j|j|j��}t|�tkr_|jd�}n||}|jr�y|j	j
|�Wqt	jk
r�|j	j�|j
|j�|j	j
|�qXn;|jt	jkr�|j	j||j�n|j	j|�Wn-ttfk
r%�n|j|�nXdS(s�
        Emit a record.

        The record is formatted, and then sent to the syslog server. If
        exception information is present, it is NOT sent to the server.
        ss<%d>sutf-8N(R)R�R�R�t	levelnamettypetunicodetencodeR�R�R�R�RR�R�R�R�R�R�RRR(RRR-tprio((s(/usr/lib64/python2.7/logging/handlers.pyRTs*
	
N(+RRRt	LOG_EMERGt	LOG_ALERTtLOG_CRITtLOG_ERRtLOG_WARNINGt
LOG_NOTICEtLOG_INFOt	LOG_DEBUGtLOG_KERNtLOG_USERtLOG_MAILt
LOG_DAEMONtLOG_AUTHt
LOG_SYSLOGtLOG_LPRtLOG_NEWStLOG_UUCPtLOG_CRONtLOG_AUTHPRIVtLOG_FTPt
LOG_LOCAL0t
LOG_LOCAL1t
LOG_LOCAL2t
LOG_LOCAL3t
LOG_LOCAL4t
LOG_LOCAL5t
LOG_LOCAL6t
LOG_LOCAL7R�R�R�tSYSLOG_UDP_PORTRRR�tlog_format_stringR�RR�R(((s(/usr/lib64/python2.7/logging/handlers.pyR�}s�


	.		
		
tSMTPHandlercBs/eZdZddd�Zd�Zd�ZRS(sK
    A handler class which sends an SMTP email for each logging event.
    cCs�tjj|�t|ttf�r:|\|_|_n|d|_|_t|ttf�rw|\|_	|_
n	d|_	||_t|t�r�|g}n||_
||_||_d|_dS(s

        Initialize the handler.

        Initialize the instance with the from and to addresses and subject
        line of the email. To specify a non-standard SMTP port, use the
        (host, port) tuple format for the mailhost argument. To specify
        authentication credentials, supply a (username, password) tuple
        for the credentials argument. To specify the use of a secure
        protocol (TLS), pass in a tuple for the secure argument. This will
        only be used when authentication credentials are supplied. The tuple
        will be either an empty tuple, or a single-value tuple with the name
        of a keyfile, or a 2-value tuple with the names of the keyfile and
        certificate file. (This tuple is passed to the `starttls` method).
        g@N(RRxRR�tlistttupletmailhosttmailportRtusernametpasswordtfromaddrR�ttoaddrstsubjecttsecuret_timeout(RRRRRtcredentialsR((s(/usr/lib64/python2.7/logging/handlers.pyR{s					cCs|jS(s�
        Determine the subject for the email.

        If you want to specify a subject line which is record-dependent,
        override this method.
        (R(RR((s(/usr/lib64/python2.7/logging/handlers.pyt
getSubject�scCsKyddl}ddlm}|j}|s:|j}n|j|j|d|j�}|j|�}d|j	dj
|j�|j|�|�|f}|j
r�|jdk	r�|j�|j|j�|j�n|j|j
|j�n|j|j	|j|�|j�Wn-ttfk
r3�n|j|�nXdS(sd
        Emit a record.

        Format the record and send it to the specified addressees.
        i����N(t
formatdateR�s-From: %s
To: %s
Subject: %s
Date: %s

%st,(tsmtplibtemail.utilsRRt	SMTP_PORTtSMTPRRR)RR]RRR
RRtehlotstarttlstloginRtsendmailtquitRRR(RRRRRztsmtpR-((s(/usr/lib64/python2.7/logging/handlers.pyR�s2		

N(RRRRRRR(((s(/usr/lib64/python2.7/logging/handlers.pyRws 		tNTEventLogHandlercBsJeZdZddd�Zd�Zd�Zd�Zd�Zd�Z	RS(	s�
    A handler class which sends events to the NT Event Log. Adds a
    registry entry for the specified application name. If no dllname is
    provided, win32service.pyd (which contains some basic message
    placeholders) is used. Note that use of these placeholders will make
    your event logs big, as the entire message source is held in the log.
    If you want slimmer logs, you have to pass in the name of your own DLL
    which contains the message definitions you want to use in the event log.
    tApplicationcCs2tjj|�y�ddl}ddl}||_||_|s�tjj	|jj
�}tjj	|d�}tjj|dd�}n||_||_
|jj|||�|j|_i|jtj6|jtj6|jtj6|jtj6|jtj6|_Wntk
r-dGHd|_nXdS(Ni����iswin32service.pydsWThe Python Win32 extensions for NT (service, event logging) appear not to be available.(RRxRtwin32evtlogutiltwin32evtlogtappnamet_weluR R!RYt__file__R]tdllnametlogtypetAddSourceToRegistrytEVENTLOG_ERROR_TYPEtdeftypetEVENTLOG_INFORMATION_TYPER�R�tEVENTLOG_WARNING_TYPER�R�R�ttypemaptImportErrorR(RR&R)R*R$R%((s(/usr/lib64/python2.7/logging/handlers.pyR�s,				




cCsdS(sy
        Return the message ID for the event record. If you are using your
        own messages, you could do this by having the msg passed to the
        logger being an ID rather than a formatting string. Then, in here,
        you could use a dictionary lookup to get the message ID. This
        version returns 1, which is the base message ID in win32service.pyd.
        i((RR((s(/usr/lib64/python2.7/logging/handlers.pytgetMessageID�scCsdS(s�
        Return the event category for the record.

        Override this if you want to specify your own categories. This version
        returns 0.
        i((RR((s(/usr/lib64/python2.7/logging/handlers.pytgetEventCategory�scCs|jj|j|j�S(s�
        Return the event type for the record.

        Override this if you want to specify your own types. This version does
        a mapping using the handler's typemap attribute, which is set up in
        __init__() to a dictionary which contains mappings for DEBUG, INFO,
        WARNING, ERROR and CRITICAL. If you are using your own levels you will
        either need to override this method or place a suitable dictionary in
        the handler's typemap attribute.
        (R0R�tlevelnoR-(RR((s(/usr/lib64/python2.7/logging/handlers.pytgetEventType�scCs�|jr�yb|j|�}|j|�}|j|�}|j|�}|jj|j||||g�Wq�ttfk
r��q�|j	|�q�XndS(s�
        Emit a record.

        Determine the message ID, event category and event type. Then
        log the message in the NT event log.
        N(
R'R2R3R5R)tReportEventR&RRR(RRtidtcatR�R-((s(/usr/lib64/python2.7/logging/handlers.pyR	s	&cCstjj|�dS(sS
        Clean up this handler.

        You can remove the application name from the registry as a
        source of event log entries. However, if you do this, you will
        not be able to see the events as you intended in the Event Log
        Viewer - it needs to be able to access the registry to get the
        DLL name.
        N(RRxR(R((s(/usr/lib64/python2.7/logging/handlers.pyRsN(
RRRRRR2R3R5RR(((s(/usr/lib64/python2.7/logging/handlers.pyR"�s		
			
	tHTTPHandlercBs,eZdZdd�Zd�Zd�ZRS(s^
    A class which sends records to a Web server, using either GET or
    POST semantics.
    tGETcCsVtjj|�|j�}|dkr7td��n||_||_||_dS(sr
        Initialize the instance with the host, the request URL, and the method
        ("GET" or "POST")
        R:tPOSTsmethod must be GET or POSTN(R:R;(RRxRR8R?Ryturltmethod(RRyR<R=((s(/usr/lib64/python2.7/logging/handlers.pyR.s		cCs|jS(s�
        Default implementation of mapping the log record into a dict
        that is sent as the CGI data. Overwrite in your class.
        Contributed by Franz Glasner.
        (R�(RR((s(/usr/lib64/python2.7/logging/handlers.pytmapLogRecord;sc
Cs�yTddl}ddl}|j}|j|�}|j}|j|j|��}|jdkr�|jd�dkr�d}nd}|d||f}n|j	|j|�|jd�}	|	dkr�||	 }n|j
d	|�|jd
kr'|j
dd�|j
d
tt|���n|j
|jd
krB|nd�|j�Wn-ttfk
rp�n|j|�nXdS(sk
        Emit a record.

        Send the record to the Web server as a percent-encoded dictionary
        i����NR:t?it&s%c%st:tHostR;sContent-types!application/x-www-form-urlencodedsContent-length(thttplibturllibRytHTTPR<t	urlencodeR>R=tfindt
putrequestt	putheadertstrR,t
endheadersRtgetreplyRRR(
RRRCRDRyR/R<tdatatsepR&((s(/usr/lib64/python2.7/logging/handlers.pyRCs4			
	"(RRRRR>R(((s(/usr/lib64/python2.7/logging/handlers.pyR9)s
	tBufferingHandlercBs;eZdZd�Zd�Zd�Zd�Zd�ZRS(s�
  A handler class which buffers logging records in memory. Whenever each
  record is added to the buffer, a check is made to see if the buffer should
  be flushed. If it should, then flush() is expected to do what's needed.
    cCs&tjj|�||_g|_dS(s>
        Initialize the handler with the buffer size.
        N(RRxRtcapacitytbuffer(RRP((s(/usr/lib64/python2.7/logging/handlers.pyRms	cCst|j�|jkS(s�
        Should the handler flush its buffer?

        Returns true if the buffer is up to capacity. This method can be
        overridden to implement custom flushing strategies.
        (R,RQRP(RR((s(/usr/lib64/python2.7/logging/handlers.pytshouldFlushuscCs0|jj|�|j|�r,|j�ndS(s�
        Emit a record.

        Append the record. If shouldFlush() tells us to, call flush() to process
        the buffer.
        N(RQR\RRRu(RR((s(/usr/lib64/python2.7/logging/handlers.pyR~scCs)|j�z
g|_Wd|j�XdS(sw
        Override to implement custom flushing behaviour.

        This version just zaps the buffer to empty.
        N(R�RQR�(R((s(/usr/lib64/python2.7/logging/handlers.pyRu�s

cCs&z|j�Wdtjj|�XdS(sp
        Close the handler.

        This version just flushes and chains to the parent class' close().
        N(RuRRxR(R((s(/usr/lib64/python2.7/logging/handlers.pyR�s(RRRRRRRRuR(((s(/usr/lib64/python2.7/logging/handlers.pyROgs					t
MemoryHandlercBsDeZdZejdd�Zd�Zd�Zd�Z	d�Z
RS(s�
    A handler class which buffers logging records in memory, periodically
    flushing them to a target handler. Flushing occurs whenever the buffer
    is full, or when an event of a certain severity or greater is seen.
    cCs&tj||�||_||_dS(s
        Initialize the handler with the buffer size, the level at which
        flushing should occur and an optional target.

        Note that without a target being set either here or via setTarget(),
        a MemoryHandler is no use to anyone!
        N(RORt
flushLevelttarget(RRPRTRU((s(/usr/lib64/python2.7/logging/handlers.pyR�s	cCs(t|j�|jkp'|j|jkS(sP
        Check for buffer full or a record at the flushLevel or higher.
        (R,RQRPR4RT(RR((s(/usr/lib64/python2.7/logging/handlers.pyRR�scCs
||_dS(s:
        Set the target handler for this handler.
        N(RU(RRU((s(/usr/lib64/python2.7/logging/handlers.pyt	setTarget�scCsY|j�z=|jrFx!|jD]}|jj|�q Wg|_nWd|j�XdS(s�
        For a MemoryHandler, flushing means just sending the buffered
        records to the target, if there is one. Override if you want
        different behaviour.
        N(R�RURQthandleR�(RR((s(/usr/lib64/python2.7/logging/handlers.pyRu�s
	cCsHz|j�Wd|j�zd|_tj|�Wd|j�XXdS(sD
        Flush, set the target to None and lose the buffer.
        N(RuR�RRURORR�(R((s(/usr/lib64/python2.7/logging/handlers.pyR�s
	N(RRRRR�RRRRRVRuR(((s(/usr/lib64/python2.7/logging/handlers.pyRS�s			i�i�Q(*RRsRR�R R�R�RERBRDRRRRR1RR�tTruet_unicodet	NameErrorRjtDEFAULT_TCP_LOGGING_PORTtDEFAULT_UDP_LOGGING_PORTtDEFAULT_HTTP_LOGGING_PORTtDEFAULT_SOAP_LOGGING_PORTRtSYSLOG_TCP_PORTRKRRRR.RkRxRwR�R�RR"R9RORS(((s(/usr/lib64/python2.7/logging/handlers.pyt<module>s<`




 N�>�&�Nd>9handlers.pyo000064400000115312150327210520007075 0ustar00�
{fc@s"dZddlZddlZddlZddlZddlZddlZddlZddlZddl	m
Z
mZmZyddl
Z
Wnek
r�dZ
nXyeeZWnek
r�eZnXdZdZdZdZdZdZd$Zdejfd��YZd
efd��YZdefd��YZdejfd��YZ dej!fd��YZ"de"fd��YZ#dej!fd��YZ$dej!fd��YZ%dej!fd��YZ&dej!fd��YZ'dej!fd ��YZ(d!e(fd"��YZ)dS(%s�
Additional handlers for the logging package for Python. The core package is
based on PEP 282 and comments thereto in comp.lang.python.

Copyright (C) 2001-2013 Vinay Sajip. All Rights Reserved.

To use, simply 'import logging.handlers' and log away!
i����N(tST_DEVtST_INOtST_MTIMEi<#i=#i>#i?#iii<tBaseRotatingHandlercBs&eZdZddd�Zd�ZRS(s�
    Base class for handlers that rotate log files at a certain point.
    Not meant to be instantiated directly.  Instead, use RotatingFileHandler
    or TimedRotatingFileHandler.
    icCsGtdkrd}ntjj|||||�||_||_dS(sA
        Use the specified filename for streamed logging
        N(tcodecstNonetloggingtFileHandlert__init__tmodetencoding(tselftfilenameR	R
tdelay((s(/usr/lib64/python2.7/logging/handlers.pyR:s
		cCsgy3|j|�r|j�ntjj||�Wn-ttfk
rO�n|j|�nXdS(s�
        Emit a record.

        Output the record to the file, catering for rollover as described
        in doRollover().
        N(tshouldRollovert
doRolloverRRtemittKeyboardInterruptt
SystemExitthandleError(Rtrecord((s(/usr/lib64/python2.7/logging/handlers.pyRDs
N(t__name__t
__module__t__doc__RRR(((s(/usr/lib64/python2.7/logging/handlers.pyR4s
tRotatingFileHandlercBs8eZdZdddddd�Zd�Zd�ZRS(s�
    Handler for logging to a set of files, which switches from one file
    to the next when the current file reaches a certain size.
    taicCsD|dkrd}ntj|||||�||_||_dS(s�
        Open the specified file and use it as the stream for logging.

        By default, the file grows indefinitely. You can specify particular
        values of maxBytes and backupCount to allow the file to rollover at
        a predetermined size.

        Rollover occurs whenever the current log file is nearly maxBytes in
        length. If backupCount is >= 1, the system will successively create
        new files with the same pathname as the base file, but with extensions
        ".1", ".2" etc. appended to it. For example, with a backupCount of 5
        and a base file name of "app.log", you would get "app.log",
        "app.log.1", "app.log.2", ... through to "app.log.5". The file being
        written to is always "app.log" - when it gets filled up, it is closed
        and renamed to "app.log.1", and if files "app.log.1", "app.log.2" etc.
        exist, then they are renamed to "app.log.2", "app.log.3" etc.
        respectively.

        If maxBytes is zero, rollover never occurs.
        iRN(RRtmaxBytestbackupCount(RRR	RRR
R
((s(/usr/lib64/python2.7/logging/handlers.pyRYs
		cCsB|jr"|jj�d|_n|jdkr#x�t|jddd�D]w}d|j|f}d|j|df}tjj|�rKtjj|�r�tj	|�ntj
||�qKqKW|jd}tjj|�r�tj	|�ntjj|j�r#tj
|j|�q#n|js>|j�|_ndS(s<
        Do a rollover, as described in __init__().
        iii����s%s.%ds.1N(
tstreamtcloseRRtrangetbaseFilenametostpathtexiststremovetrenameR
t_open(Rtitsfntdfn((s(/usr/lib64/python2.7/logging/handlers.pyRys$	
 
	cCs�|jdkr!|j�|_n|jdkrd|j|�}|jjdd�|jj�t|�|jkrdSndS(s�
        Determine if rollover should occur.

        Basically, see if the supplied record would cause the file to exceed
        the size limit we have.
        is%s
iiN(RRR%Rtformattseekttelltlen(RRtmsg((s(/usr/lib64/python2.7/logging/handlers.pyR�s"N(RRRRRRR(((s(/usr/lib64/python2.7/logging/handlers.pyRTs 	tTimedRotatingFileHandlercBsMeZdZdddd	eed�Zd�Zd�Zd�Zd�Z	RS(
s�
    Handler for logging to a file, rotating the log file at certain timed
    intervals.

    If backupCount is > 0, when rollover is done, no more than backupCount
    files are kept - the oldest ones are deleted.
    thiic	Cs2tj||d||�|j�|_||_||_|jdkrgd|_d|_d|_nV|jdkr�d|_d|_d	|_n)|jd
kr�d|_d|_d|_n�|jd
ks�|jdkr�d|_d|_d|_n�|jj	d�r�d|_t
|j�dkrCtd|j��n|jddksi|jddkrtd|j��nt|jd�|_
d|_d|_ntd|j��tj|j�|_|j||_tjj|�r
tj|�t}nttj��}|j|�|_dS( NRtSis%Y-%m-%d_%H-%M-%Ss%^\d{4}-\d{2}-\d{2}_\d{2}-\d{2}-\d{2}$tMi<s%Y-%m-%d_%H-%Ms^\d{4}-\d{2}-\d{2}_\d{2}-\d{2}$tHs%Y-%m-%d_%Hs^\d{4}-\d{2}-\d{2}_\d{2}$tDtMIDNIGHTis%Y-%m-%ds^\d{4}-\d{2}-\d{2}$tWiisHYou must specify a day for weekly rollover from 0 to 6 (0 is Monday): %st0t6s-Invalid day specified for weekly rollover: %ss'Invalid rollover interval specified: %siii�Qii�Qi�:	(RRtuppertwhenRtutctintervaltsuffixtextMatcht
startswithR,t
ValueErrortintt	dayOfWeektretcompileR R!R"tstatRttimetcomputeRollovert
rolloverAt(	RRR9R;RR
R
R:tt((s(/usr/lib64/python2.7/logging/handlers.pyR�sH		
									&	cCsq||j}|jdks.|jjd�rm|jrItj|�}ntj|�}|d}|d}|d}t|d|d|}||}|jjd�rm|d}||jkrj||jkr�|j|}	nd||jd}	||	d}
|js^|d
}tj|
�d
}||kr^|sHd}
nd}
|
|
7}
q^n|
}qjqmn|S(sI
        Work out the rollover time based on the specified time.
        R4R5iiii<iiii����i��iii�Q(	R;R9R>R:REtgmtimet	localtimet	_MIDNIGHTRA(RtcurrentTimetresultRHtcurrentHourt
currentMinutet
currentSecondtrtdayt
daysToWaitt
newRolloverAttdstNowt
dstAtRollovertaddend((s(/usr/lib64/python2.7/logging/handlers.pyRF�s8
!	




	
	cCs)ttj��}||jkr%dSdS(s�
        Determine if rollover should occur.

        record is not used, as we are just comparing times, but it is needed so
        the method signatures are the same
        ii(R@RERG(RRRH((s(/usr/lib64/python2.7/logging/handlers.pyRsc	Cs�tjj|j�\}}tj|�}g}|d}t|�}x\|D]T}|| |krM||}|jj|�r�|jtjj	||��q�qMqMW|j
�t|�|jkr�g}n|t|�|j }|S(s�
        Determine the files to delete when rolling over.

        More specific than the earlier method, which just used glob.glob().
        t.(R R!tsplitRtlistdirR,R=tmatchtappendtjointsortR(	RtdirNametbaseNamet	fileNamesRMtprefixtplentfileNameR<((s(/usr/lib64/python2.7/logging/handlers.pytgetFilesToDelete(s


&
	cCs+|jr"|jj�d|_nttj��}tj|�d}|j|j}|jrrtj	|�}nPtj|�}|d}||kr�|r�d}nd}tj||�}n|j
dtj|j|�}t
jj|�rt
j|�nt
jj|j
�r/t
j|j
|�n|jdkrex$|j�D]}t
j|�qKWn|js�|j�|_n|j|�}	x|	|kr�|	|j}	q�W|jdks�|jjd�r|jrtj|	�d}
||
kr|sd}nd}|	|7}	qn|	|_dS(	sx
        do a rollover; in this case, a date/time stamp is appended to the filename
        when the rollover happens.  However, you want the file to be named for the
        start of the interval, not the current time.  If there is a backup count,
        then we have to get a list of matching filenames, sort them and remove
        the one with the oldest suffix.
        i����ii��RXiR4R5N(RRRR@RERJRGR;R:RIRtstrftimeR<R R!R"R#R$RReR
R%RFR9R>(RRLRURHt	timeTupletdstThenRWR(tsRTRV((s(/usr/lib64/python2.7/logging/handlers.pyR?sH	
	
	 	+	N(
RRRRtFalseRRFRReR(((s(/usr/lib64/python2.7/logging/handlers.pyR.�s5	<	
	tWatchedFileHandlercBs2eZdZdddd�Zd�Zd�ZRS(s�
    A handler for logging to a file, which watches the file
    to see if it has changed while in use. This can happen because of
    usage of programs such as newsyslog and logrotate which perform
    log file rotation. This handler, intended for use under Unix,
    watches the file to see if it has changed since the last emit.
    (A file has changed if its device or inode have changed.)
    If it has changed, the old file stream is closed, and the file
    opened to get a new stream.

    This handler is not appropriate for use under Windows, because
    under Windows open files cannot be moved or renamed - logging
    opens the files with exclusive locks - and so there is no need
    for such a handler. Furthermore, ST_INO is not supported under
    Windows; stat always returns zero for this value.

    This handler is based on a suggestion and patch by Chad J.
    Schroeder.
    RicCs<tjj|||||�d\|_|_|j�dS(Ni����(i����i����(RRRtdevtinot_statstream(RRR	R
R
((s(/usr/lib64/python2.7/logging/handlers.pyR�scCsC|jr?tj|jj��}|t|t|_|_ndS(N(RR tfstattfilenoRRRlRm(Rtsres((s(/usr/lib64/python2.7/logging/handlers.pyRn�s	cCs�ytj|j�}Wn1tk
rI}|jtjkrCd}qJ�nX|sw|t|jksw|t	|j
kr�|jdk	r�|jj�|jj
�d|_|j�|_|j�q�ntjj||�dS(s�
        Emit a record.

        First check if the underlying file has changed, and if it
        has, close the old stream and reopen the file to get the
        current stream.
        N(R RDRtOSErrorterrnotENOENTRRRlRRmRtflushRR%RnRRR(RRRqterr((s(/usr/lib64/python2.7/logging/handlers.pyR�s	-

	N(RRRRRRnR(((s(/usr/lib64/python2.7/logging/handlers.pyRkrs	t
SocketHandlercBsYeZdZd�Zdd�Zd�Zd�Zd�Zd�Zd�Z	d	�Z
RS(
s
    A handler class which writes logging records, in pickle format, to
    a streaming socket. The socket is kept open across logging calls.
    If the peer resets it, an attempt is made to reconnect on the next call.
    The pickle which is sent is that of the LogRecord's attribute dictionary
    (__dict__), so that the receiver does not need to have the logging module
    installed in order to process the logging event.

    To unpickle the record at the receiving end into a LogRecord, use the
    makeLogRecord function.
    cCs\tjj|�||_||_d|_d|_d|_d|_	d|_
d|_dS(s	
        Initializes the handler with a specific host address and port.

        The attribute 'closeOnError' is set to 1 - which means that if
        a socket error occurs, the socket is silently closed and then
        reopened on the next logging call.
        ig�?g>@g@N(RtHandlerRthosttportRtsocktcloseOnErrort	retryTimet
retryStarttretryMaxtretryFactor(RRyRz((s(/usr/lib64/python2.7/logging/handlers.pyR�s							icCsTtjtjtj�}t|d�r7|j|�n|j|j|jf�|S(sr
        A factory method which allows subclasses to define the precise
        type of socket they want.
        t
settimeout(tsockettAF_INETtSOCK_STREAMthasattrR�tconnectRyRz(RttimeoutRi((s(/usr/lib64/python2.7/logging/handlers.pyt
makeSocket�s
cCs�tj�}|jdkr$d}n||jk}|r�y|j�|_d|_Wq�tjk
r�|jdkr�|j|_n4|j|j	|_|j|j
kr�|j
|_n||j|_q�XndS(s�
        Try to create a socket, using an exponential backoff with
        a max retry time. Thanks to Robert Olson for the original patch
        (SF #815911) which has been slightly refactored.
        iN(RER}RR�R{R�terrorR~tretryPeriodR�R(Rtnowtattempt((s(/usr/lib64/python2.7/logging/handlers.pytcreateSocket�s	
cCs�|jdkr|j�n|jr�yxt|jd�rM|jj|�nOd}t|�}x:|dkr�|jj||�}||}||}qbWWq�tjk
r�|jj	�d|_q�XndS(s�
        Send a pickled string to the socket.

        This function allows for partial sends which can happen when the
        network is busy.
        tsendalliN(
R{RR�R�R�R,tsendR�R�R(RRit	sentsofartlefttsent((s(/usr/lib64/python2.7/logging/handlers.pyR��s
	

cCs�|j}|r*|j|�}d|_nt|j�}|j�|d<d|d<tj|d�}|rw||_ntj	dt
|��}||S(s�
        Pickles the record in binary format with a length prefix, and
        returns it ready for transmission across the socket.
        R-targsis>LN(texc_infoR)Rtdictt__dict__t
getMessagetcPickletdumpststructtpackR,(RRteitdummytdRitslen((s(/usr/lib64/python2.7/logging/handlers.pyt
makePickles	
cCsB|jr+|jr+|jj�d|_ntjj||�dS(s�
        Handle an error during logging.

        An error has occurred during logging. Most likely cause -
        connection lost. Close the socket so that we can retry on the
        next event.
        N(R|R{RRRRxR(RR((s(/usr/lib64/python2.7/logging/handlers.pyR*s
cCsTy |j|�}|j|�Wn-ttfk
r<�n|j|�nXdS(s
        Emit a record.

        Pickles the record and writes it to the socket in binary format.
        If there is an error with the socket, silently drop the packet.
        If there was a problem with the socket, re-establishes the
        socket.
        N(R�R�RRR(RRRi((s(/usr/lib64/python2.7/logging/handlers.pyR8s	cCsU|j�z)|j}|r2d|_|j�nWd|j�Xtjj|�dS(s$
        Closes the socket.
        N(tacquireR{RRtreleaseRRx(RR{((s(/usr/lib64/python2.7/logging/handlers.pyRIs
		(RRRRR�R�R�R�RRR(((s(/usr/lib64/python2.7/logging/handlers.pyRw�s						tDatagramHandlercBs)eZdZd�Zd�Zd�ZRS(s�
    A handler class which writes logging records, in pickle format, to
    a datagram socket.  The pickle which is sent is that of the LogRecord's
    attribute dictionary (__dict__), so that the receiver does not need to
    have the logging module installed in order to process the logging event.

    To unpickle the record at the receiving end into a LogRecord, use the
    makeLogRecord function.

    cCs tj|||�d|_dS(sP
        Initializes the handler with a specific host address and port.
        iN(RwRR|(RRyRz((s(/usr/lib64/python2.7/logging/handlers.pyRbscCstjtjtj�}|S(su
        The factory method of SocketHandler is here overridden to create
        a UDP socket (SOCK_DGRAM).
        (R�R�t
SOCK_DGRAM(RRi((s(/usr/lib64/python2.7/logging/handlers.pyR�iscCs?|jdkr|j�n|jj||j|jf�dS(s�
        Send a pickled string to a socket.

        This function no longer allows for partial sends which can happen
        when the network is busy - UDP does not guarantee delivery and
        can deliver packets out of sequence.
        N(R{RR�tsendtoRyRz(RRi((s(/usr/lib64/python2.7/logging/handlers.pyR�qs
(RRRRR�R�(((s(/usr/lib64/python2.7/logging/handlers.pyR�Ws
		t
SysLogHandlercBseZdZdZdZdZdZdZdZdZ	dZ
dZdZdZ
dZdZdZdZdZd	Zd
ZdZdZd
ZdZdZdZdZdZdZdZied6ed6ed6e
d6ed6ed6ed6e	d6ed6ed6ed6ed 6Zied!6ed"6ed#6ed$6ed%6ed&6ed'6e
d(6ed)6ed*6ed+6ed,6ed-6ed.6ed/6ed06ed16ed26ed36ed46ed56Z idd66dd76d d86dd96dd:6Z!d;e"fedCd<�Z$d=�Z%d>Z&d?�Z'd@�Z(dA�Z)dB�Z*RS(Ds
    A handler class which sends formatted logging records to a syslog
    server. Based on Sam Rushing's syslog module:
    http://www.nightmare.com/squirl/python-ext/misc/syslog.py
    Contributed by Nicolas Untz (after which minor refactoring changes
    have been made).
    iiiiiiiiii	i
iiiiiiiiitalerttcrittcriticaltdebugtemergRvR�tinfotnoticetpanictwarntwarningtauthtauthprivtcrontdaemontftptkerntlprtmailtnewstsecuritytsyslogtusertuucptlocal0tlocal1tlocal2tlocal3tlocal4tlocal5tlocal6tlocal7tDEBUGtINFOtWARNINGtERRORtCRITICALt	localhostcCs|tjj|�||_||_||_t|t�rSd|_|j	|�n%t
|_|dkrttj
}n|\}}tj||d|�}|s�tjd��nx�|D]�}|\}}}	}
}d}}
y9tj|||	�}
|tjkr|
j|�nPWq�tjk
rL}|}|
dk	rM|
j�qMq�Xq�W|dk	rf|�n|
|_||_dS(s
        Initialize a handler.

        If address is specified as a string, a UNIX socket is used. To log to a
        local syslogd, "SysLogHandler(address="/dev/log")" can be used.
        If facility is not specified, LOG_USER is used. If socktype is
        specified as socket.SOCK_DGRAM or socket.SOCK_STREAM, that specific
        socket type will be used. For Unix sockets, you can also specify a
        socktype of None, in which case socket.SOCK_DGRAM will be used, falling
        back to socket.SOCK_STREAM.
        iis!getaddrinfo returns an empty listN(RRxRtaddresstfacilitytsocktypet
isinstancet
basestringt
unixsockett_connect_unixsocketRjRR�R�tgetaddrinfoR�R�R�R(RR�R�R�RyRztresstrestaftprotot_tsaRvR{texc((s(/usr/lib64/python2.7/logging/handlers.pyR�s<
					

		cCs�|j}|dkr!tj}ntjtj|�|_y|jj|�||_Wn�tjk
r�|jj�|jdk	r��ntj}tjtj|�|_y|jj|�||_Wq�tjk
r�|jj��q�XnXdS(N(	R�RR�R�tAF_UNIXR�R�RR�(RR�tuse_socktype((s(/usr/lib64/python2.7/logging/handlers.pyR�s&	

	

s<%d>%scCsJt|t�r|j|}nt|t�r>|j|}n|d>|BS(s�
        Encode the facility and priority. You can pass in strings or
        integers - if strings are passed, the facility_names and
        priority_names mapping dictionaries are used to convert them to
        integers.
        i(R�R�tfacility_namestpriority_names(RR�tpriority((s(/usr/lib64/python2.7/logging/handlers.pytencodePriority1s
cCsI|j�z|jr&|jj�nWd|j�Xtjj|�dS(s$
        Closes the socket.
        N(R�R�R�RR�RRx(R((s(/usr/lib64/python2.7/logging/handlers.pyR>s
	cCs|jj|d�S(sK
        Map a logging level name to a key in the priority_names map.
        This is useful in two scenarios: when custom levels are being
        used, and in the case where you can't do a straightforward
        mapping by lowercasing the logging level name because of locale-
        specific issues (see SF #1524081).
        R�(tpriority_maptget(Rt	levelName((s(/usr/lib64/python2.7/logging/handlers.pytmapPriorityJscCs=y	|j|�d}d|j|j|j|j��}t|�tkr_|jd�}n||}|jr�y|j	j
|�Wqt	jk
r�|j	j�|j
|j�|j	j
|�qXn;|jt	jkr�|j	j||j�n|j	j|�Wn-ttfk
r%�n|j|�nXdS(s�
        Emit a record.

        The record is formatted, and then sent to the syslog server. If
        exception information is present, it is NOT sent to the server.
        ss<%d>sutf-8N(R)R�R�R�t	levelnamettypetunicodetencodeR�R�R�R�RR�R�R�R�R�R�RRR(RRR-tprio((s(/usr/lib64/python2.7/logging/handlers.pyRTs*
	
N(+RRRt	LOG_EMERGt	LOG_ALERTtLOG_CRITtLOG_ERRtLOG_WARNINGt
LOG_NOTICEtLOG_INFOt	LOG_DEBUGtLOG_KERNtLOG_USERtLOG_MAILt
LOG_DAEMONtLOG_AUTHt
LOG_SYSLOGtLOG_LPRtLOG_NEWStLOG_UUCPtLOG_CRONtLOG_AUTHPRIVtLOG_FTPt
LOG_LOCAL0t
LOG_LOCAL1t
LOG_LOCAL2t
LOG_LOCAL3t
LOG_LOCAL4t
LOG_LOCAL5t
LOG_LOCAL6t
LOG_LOCAL7R�R�R�tSYSLOG_UDP_PORTRRR�tlog_format_stringR�RR�R(((s(/usr/lib64/python2.7/logging/handlers.pyR�}s�


	.		
		
tSMTPHandlercBs/eZdZddd�Zd�Zd�ZRS(sK
    A handler class which sends an SMTP email for each logging event.
    cCs�tjj|�t|ttf�r:|\|_|_n|d|_|_t|ttf�rw|\|_	|_
n	d|_	||_t|t�r�|g}n||_
||_||_d|_dS(s

        Initialize the handler.

        Initialize the instance with the from and to addresses and subject
        line of the email. To specify a non-standard SMTP port, use the
        (host, port) tuple format for the mailhost argument. To specify
        authentication credentials, supply a (username, password) tuple
        for the credentials argument. To specify the use of a secure
        protocol (TLS), pass in a tuple for the secure argument. This will
        only be used when authentication credentials are supplied. The tuple
        will be either an empty tuple, or a single-value tuple with the name
        of a keyfile, or a 2-value tuple with the names of the keyfile and
        certificate file. (This tuple is passed to the `starttls` method).
        g@N(RRxRR�tlistttupletmailhosttmailportRtusernametpasswordtfromaddrR�ttoaddrstsubjecttsecuret_timeout(RRRRRtcredentialsR((s(/usr/lib64/python2.7/logging/handlers.pyR{s					cCs|jS(s�
        Determine the subject for the email.

        If you want to specify a subject line which is record-dependent,
        override this method.
        (R(RR((s(/usr/lib64/python2.7/logging/handlers.pyt
getSubject�scCsKyddl}ddlm}|j}|s:|j}n|j|j|d|j�}|j|�}d|j	dj
|j�|j|�|�|f}|j
r�|jdk	r�|j�|j|j�|j�n|j|j
|j�n|j|j	|j|�|j�Wn-ttfk
r3�n|j|�nXdS(sd
        Emit a record.

        Format the record and send it to the specified addressees.
        i����N(t
formatdateR�s-From: %s
To: %s
Subject: %s
Date: %s

%st,(tsmtplibtemail.utilsRRt	SMTP_PORTtSMTPRRR)RR]RRR
RRtehlotstarttlstloginRtsendmailtquitRRR(RRRRRztsmtpR-((s(/usr/lib64/python2.7/logging/handlers.pyR�s2		

N(RRRRRRR(((s(/usr/lib64/python2.7/logging/handlers.pyRws 		tNTEventLogHandlercBsJeZdZddd�Zd�Zd�Zd�Zd�Zd�Z	RS(	s�
    A handler class which sends events to the NT Event Log. Adds a
    registry entry for the specified application name. If no dllname is
    provided, win32service.pyd (which contains some basic message
    placeholders) is used. Note that use of these placeholders will make
    your event logs big, as the entire message source is held in the log.
    If you want slimmer logs, you have to pass in the name of your own DLL
    which contains the message definitions you want to use in the event log.
    tApplicationcCs2tjj|�y�ddl}ddl}||_||_|s�tjj	|jj
�}tjj	|d�}tjj|dd�}n||_||_
|jj|||�|j|_i|jtj6|jtj6|jtj6|jtj6|jtj6|_Wntk
r-dGHd|_nXdS(Ni����iswin32service.pydsWThe Python Win32 extensions for NT (service, event logging) appear not to be available.(RRxRtwin32evtlogutiltwin32evtlogtappnamet_weluR R!RYt__file__R]tdllnametlogtypetAddSourceToRegistrytEVENTLOG_ERROR_TYPEtdeftypetEVENTLOG_INFORMATION_TYPER�R�tEVENTLOG_WARNING_TYPER�R�R�ttypemaptImportErrorR(RR&R)R*R$R%((s(/usr/lib64/python2.7/logging/handlers.pyR�s,				




cCsdS(sy
        Return the message ID for the event record. If you are using your
        own messages, you could do this by having the msg passed to the
        logger being an ID rather than a formatting string. Then, in here,
        you could use a dictionary lookup to get the message ID. This
        version returns 1, which is the base message ID in win32service.pyd.
        i((RR((s(/usr/lib64/python2.7/logging/handlers.pytgetMessageID�scCsdS(s�
        Return the event category for the record.

        Override this if you want to specify your own categories. This version
        returns 0.
        i((RR((s(/usr/lib64/python2.7/logging/handlers.pytgetEventCategory�scCs|jj|j|j�S(s�
        Return the event type for the record.

        Override this if you want to specify your own types. This version does
        a mapping using the handler's typemap attribute, which is set up in
        __init__() to a dictionary which contains mappings for DEBUG, INFO,
        WARNING, ERROR and CRITICAL. If you are using your own levels you will
        either need to override this method or place a suitable dictionary in
        the handler's typemap attribute.
        (R0R�tlevelnoR-(RR((s(/usr/lib64/python2.7/logging/handlers.pytgetEventType�scCs�|jr�yb|j|�}|j|�}|j|�}|j|�}|jj|j||||g�Wq�ttfk
r��q�|j	|�q�XndS(s�
        Emit a record.

        Determine the message ID, event category and event type. Then
        log the message in the NT event log.
        N(
R'R2R3R5R)tReportEventR&RRR(RRtidtcatR�R-((s(/usr/lib64/python2.7/logging/handlers.pyR	s	&cCstjj|�dS(sS
        Clean up this handler.

        You can remove the application name from the registry as a
        source of event log entries. However, if you do this, you will
        not be able to see the events as you intended in the Event Log
        Viewer - it needs to be able to access the registry to get the
        DLL name.
        N(RRxR(R((s(/usr/lib64/python2.7/logging/handlers.pyRsN(
RRRRRR2R3R5RR(((s(/usr/lib64/python2.7/logging/handlers.pyR"�s		
			
	tHTTPHandlercBs,eZdZdd�Zd�Zd�ZRS(s^
    A class which sends records to a Web server, using either GET or
    POST semantics.
    tGETcCsVtjj|�|j�}|dkr7td��n||_||_||_dS(sr
        Initialize the instance with the host, the request URL, and the method
        ("GET" or "POST")
        R:tPOSTsmethod must be GET or POSTN(R:R;(RRxRR8R?Ryturltmethod(RRyR<R=((s(/usr/lib64/python2.7/logging/handlers.pyR.s		cCs|jS(s�
        Default implementation of mapping the log record into a dict
        that is sent as the CGI data. Overwrite in your class.
        Contributed by Franz Glasner.
        (R�(RR((s(/usr/lib64/python2.7/logging/handlers.pytmapLogRecord;sc
Cs�yTddl}ddl}|j}|j|�}|j}|j|j|��}|jdkr�|jd�dkr�d}nd}|d||f}n|j	|j|�|jd�}	|	dkr�||	 }n|j
d	|�|jd
kr'|j
dd�|j
d
tt|���n|j
|jd
krB|nd�|j�Wn-ttfk
rp�n|j|�nXdS(sk
        Emit a record.

        Send the record to the Web server as a percent-encoded dictionary
        i����NR:t?it&s%c%st:tHostR;sContent-types!application/x-www-form-urlencodedsContent-length(thttplibturllibRytHTTPR<t	urlencodeR>R=tfindt
putrequestt	putheadertstrR,t
endheadersRtgetreplyRRR(
RRRCRDRyR/R<tdatatsepR&((s(/usr/lib64/python2.7/logging/handlers.pyRCs4			
	"(RRRRR>R(((s(/usr/lib64/python2.7/logging/handlers.pyR9)s
	tBufferingHandlercBs;eZdZd�Zd�Zd�Zd�Zd�ZRS(s�
  A handler class which buffers logging records in memory. Whenever each
  record is added to the buffer, a check is made to see if the buffer should
  be flushed. If it should, then flush() is expected to do what's needed.
    cCs&tjj|�||_g|_dS(s>
        Initialize the handler with the buffer size.
        N(RRxRtcapacitytbuffer(RRP((s(/usr/lib64/python2.7/logging/handlers.pyRms	cCst|j�|jkS(s�
        Should the handler flush its buffer?

        Returns true if the buffer is up to capacity. This method can be
        overridden to implement custom flushing strategies.
        (R,RQRP(RR((s(/usr/lib64/python2.7/logging/handlers.pytshouldFlushuscCs0|jj|�|j|�r,|j�ndS(s�
        Emit a record.

        Append the record. If shouldFlush() tells us to, call flush() to process
        the buffer.
        N(RQR\RRRu(RR((s(/usr/lib64/python2.7/logging/handlers.pyR~scCs)|j�z
g|_Wd|j�XdS(sw
        Override to implement custom flushing behaviour.

        This version just zaps the buffer to empty.
        N(R�RQR�(R((s(/usr/lib64/python2.7/logging/handlers.pyRu�s

cCs&z|j�Wdtjj|�XdS(sp
        Close the handler.

        This version just flushes and chains to the parent class' close().
        N(RuRRxR(R((s(/usr/lib64/python2.7/logging/handlers.pyR�s(RRRRRRRRuR(((s(/usr/lib64/python2.7/logging/handlers.pyROgs					t
MemoryHandlercBsDeZdZejdd�Zd�Zd�Zd�Z	d�Z
RS(s�
    A handler class which buffers logging records in memory, periodically
    flushing them to a target handler. Flushing occurs whenever the buffer
    is full, or when an event of a certain severity or greater is seen.
    cCs&tj||�||_||_dS(s
        Initialize the handler with the buffer size, the level at which
        flushing should occur and an optional target.

        Note that without a target being set either here or via setTarget(),
        a MemoryHandler is no use to anyone!
        N(RORt
flushLevelttarget(RRPRTRU((s(/usr/lib64/python2.7/logging/handlers.pyR�s	cCs(t|j�|jkp'|j|jkS(sP
        Check for buffer full or a record at the flushLevel or higher.
        (R,RQRPR4RT(RR((s(/usr/lib64/python2.7/logging/handlers.pyRR�scCs
||_dS(s:
        Set the target handler for this handler.
        N(RU(RRU((s(/usr/lib64/python2.7/logging/handlers.pyt	setTarget�scCsY|j�z=|jrFx!|jD]}|jj|�q Wg|_nWd|j�XdS(s�
        For a MemoryHandler, flushing means just sending the buffered
        records to the target, if there is one. Override if you want
        different behaviour.
        N(R�RURQthandleR�(RR((s(/usr/lib64/python2.7/logging/handlers.pyRu�s
	cCsHz|j�Wd|j�zd|_tj|�Wd|j�XXdS(sD
        Flush, set the target to None and lose the buffer.
        N(RuR�RRURORR�(R((s(/usr/lib64/python2.7/logging/handlers.pyR�s
	N(RRRRR�RRRRRVRuR(((s(/usr/lib64/python2.7/logging/handlers.pyRS�s			i�i�Q(*RRsRR�R R�R�RERBRDRRRRR1RR�tTruet_unicodet	NameErrorRjtDEFAULT_TCP_LOGGING_PORTtDEFAULT_UDP_LOGGING_PORTtDEFAULT_HTTP_LOGGING_PORTtDEFAULT_SOAP_LOGGING_PORTRtSYSLOG_TCP_PORTRKRRRR.RkRxRwR�R�RR"R9RORS(((s(/usr/lib64/python2.7/logging/handlers.pyt<module>s<`




 N�>�&�Nd>9__init__.pyc000064400000160352150327210520007024 0ustar00�
{fc%@sdZddlZddlZddlZddlZddlZddlZddlZddlZddddddd	d
ddd
ddddddddddddddddddd d!d"d#d$d%d&d'g%Z	yddl
Z
Wnek
reZ
nXyddl
Z
ddlZWnek
r:eZ
nXd(Zd)Zd*Zd+ZyeeZWnek
rzeZnXd,�Zeed-�r�d.�Znejjejj�Zej�Zd/Z d/Z!d/Z"d/Z#d0Z$e$Z%d1Z&d2Z'e'Z(d3Z)d4Z*d5Z+i
de$6de&6de'6d
e)6de*6de+6e$d6e&d6e'd6e'd6e)d
6e*d6e+d6Z,d6�Z-d7�Z.d8�Z/e
r�ej0�Z1neZ1d9�Z2d:�Z3de4fd;��YZ5d<�Z6de4fd=��YZ7e7�Z8de4fd>��YZ9d
e4fd?��YZ:d@e4fdA��YZ;ej<�Z=gZ>dB�Z?dC�Z@de;fdD��YZAdeAfdE��YZBd	eBfdF��YZCdGe4fdH��YZDeaEdI�ZFdJ�ZGdKe4fdL��YZHde;fdM��YZIdNeIfdO��YZJeIaEde4fdP��YZKeJe'�ZLeLeI_LeHeIjL�eI_MdQZNdR�ZOedS�ZPdT�ZQeQZRdU�ZSdV�ZTdW�ZUeUZVdX�ZWdY�ZXdZ�ZYd[�ZZe>d\�Z[ddl\Z\e\j]e[�deAfd]��YZ^ea_eed^�Z`d_�ZadS(`s�
Logging package for Python. Based on PEP 282 and comments thereto in
comp.lang.python.

Copyright (C) 2001-2014 Vinay Sajip. All Rights Reserved.

To use, simply 'import logging' and log away!
i����NtBASIC_FORMATtBufferingFormattertCRITICALtDEBUGtERRORtFATALtFileHandlertFiltert	FormattertHandlertINFOt	LogRecordtLoggert
LoggerAdaptertNOTSETtNullHandlert
StreamHandlertWARNtWARNINGtaddLevelNametbasicConfigtcaptureWarningstcriticaltdebugtdisableterrort	exceptiontfataltgetLevelNamet	getLoggertgetLoggerClasstinfotlogt
makeLogRecordtsetLoggerClasstwarntwarnings&Vinay Sajip <vinay_sajip@red-dove.com>t
productions0.5.1.2s07 February 2010cCs)y
t�Wntj�djjSXdS(s5Return the frame object for the caller's stack frame.iN(t	Exceptiontsystexc_infottb_frametf_back(((s(/usr/lib64/python2.7/logging/__init__.pytcurrentframe?s
t	_getframecCs
tjd�S(Ni(R'R,(((s(/usr/lib64/python2.7/logging/__init__.pyt<lambda>Ftii2i(iii
icCstj|d|�S(s
    Return the textual representation of logging level 'level'.

    If the level is one of the predefined levels (CRITICAL, ERROR, WARNING,
    INFO, DEBUG) then you get the corresponding string. If you have
    associated levels with names using addLevelName then the name you have
    associated with 'level' is returned.

    If a numeric value corresponding to one of the defined levels is passed
    in, the corresponding string representation is returned.

    Otherwise, the string "Level %s" % level is returned.
    sLevel %s(t_levelNamestget(tlevel((s(/usr/lib64/python2.7/logging/__init__.pyR�scCs.t�z|t|<|t|<Wdt�XdS(sy
    Associate 'levelName' with 'level'.

    This is used when converting levels to text during message formatting.
    N(t_acquireLockR/t_releaseLock(R1t	levelName((s(/usr/lib64/python2.7/logging/__init__.pyR�s

cCspt|ttf�r|}nNt|�|kr\|tkrOtd|��nt|}ntd|��|S(NsUnknown level: %rs*Level not an integer or a valid string: %r(t
isinstancetinttlongtstrR/t
ValueErrort	TypeError(R1trv((s(/usr/lib64/python2.7/logging/__init__.pyt_checkLevel�s	
cCstrtj�ndS(s�
    Acquire the module-level lock for serializing access to shared data.

    This should be released with _releaseLock().
    N(t_locktacquire(((s(/usr/lib64/python2.7/logging/__init__.pyR2�scCstrtj�ndS(sK
    Release the module-level lock acquired by calling _acquireLock().
    N(R=trelease(((s(/usr/lib64/python2.7/logging/__init__.pyR3�scBs,eZdZdd�Zd�Zd�ZRS(s
    A LogRecord instance represents an event being logged.

    LogRecord instances are created every time something is logged. They
    contain all the information pertinent to the event being logged. The
    main information passed in is in msg and args, which are combined
    using str(msg) % args to create the message field of the record. The
    record also includes information such as when the record was created,
    the source line where the logging call was made, and any exception
    information to be logged.
    c	Cs%tj�}	||_||_|rct|�dkrct|dtj�rc|drc|d}n||_t|�|_	||_
||_y5tj
j|�|_tj
j|j�d|_Wn,tttfk
r�||_d|_nX||_d|_||_||_|	|_|	t|	�d|_|jtd|_tryt ryt j!�|_ t"j#�j|_$nd|_ d|_$t%s�d|_&nTd|_&t'j(j)d�}
|
dk	r�y|
j*�j|_&Wq�t+k
r�q�Xnt,rt-td�rtj.�|_/n	d|_/dS(	sK
        Initialize a logging record with interesting information.
        iisUnknown modulei�tMainProcesstmultiprocessingtgetpidN(0ttimetnametmsgtlenR5tcollectionstMappingtargsRt	levelnametlevelnotpathnametostpathtbasenametfilenametsplitexttmoduleR:R9tAttributeErrorR(tNonetexc_texttlinenotfuncNametcreatedR7tmsecst
_startTimetrelativeCreatedt
logThreadstthreadt	get_identt	threadingtcurrent_threadt
threadNametlogMultiprocessingtprocessNameR'tmodulesR0tcurrent_processt
StandardErrortlogProcessesthasattrRBtprocess(tselfRDR1RLRVRERIR(tfunctcttmp((s(/usr/lib64/python2.7/logging/__init__.pyt__init__�sP		.

			 	
								
cCs&d|j|j|j|j|jfS(Ns!<LogRecord: %s, %s, %s, %s, "%s">(RDRKRLRVRE(Rj((s(/usr/lib64/python2.7/logging/__init__.pyt__str__4scCs�tst|j�}nK|j}t|t�scyt|j�}Wqctk
r_|j}qcXn|jr|||j}n|S(s�
        Return the message for this LogRecord.

        Return the message for this LogRecord after merging any user-supplied
        arguments with the message.
        (t_unicodeR8RER5t
basestringtUnicodeErrorRI(RjRE((s(/usr/lib64/python2.7/logging/__init__.pyt
getMessage8s	
	N(t__name__t
__module__t__doc__RTRnRoRs(((s(/usr/lib64/python2.7/logging/__init__.pyR�sF	c	Cs5tdddddddd�}|jj|�|S(s�
    Make a LogRecord whose attributes are defined by the specified dictionary,
    This function is useful for converting a logging event received over
    a socket connection (which is sent as a dictionary) into a LogRecord
    instance.
    R.iN((RRTt__dict__tupdate(tdictR;((s(/usr/lib64/python2.7/logging/__init__.pyR!Ls!cBsMeZdZejZddd�Zdd�Zd�Z	d�Z
d�ZRS(s�
    Formatter instances are used to convert a LogRecord to text.

    Formatters need to know how a LogRecord is constructed. They are
    responsible for converting a LogRecord to (usually) a string which can
    be interpreted by either a human or an external system. The base Formatter
    allows a formatting string to be specified. If none is supplied, the
    default value of "%s(message)\n" is used.

    The Formatter can be initialized with a format string which makes use of
    knowledge of the LogRecord attributes - e.g. the default value mentioned
    above makes use of the fact that the user's message and arguments are pre-
    formatted into a LogRecord's message attribute. Currently, the useful
    attributes in a LogRecord are described by:

    %(name)s            Name of the logger (logging channel)
    %(levelno)s         Numeric logging level for the message (DEBUG, INFO,
                        WARNING, ERROR, CRITICAL)
    %(levelname)s       Text logging level for the message ("DEBUG", "INFO",
                        "WARNING", "ERROR", "CRITICAL")
    %(pathname)s        Full pathname of the source file where the logging
                        call was issued (if available)
    %(filename)s        Filename portion of pathname
    %(module)s          Module (name portion of filename)
    %(lineno)d          Source line number where the logging call was issued
                        (if available)
    %(funcName)s        Function name
    %(created)f         Time when the LogRecord was created (time.time()
                        return value)
    %(asctime)s         Textual time when the LogRecord was created
    %(msecs)d           Millisecond portion of the creation time
    %(relativeCreated)d Time in milliseconds when the LogRecord was created,
                        relative to the time the logging module was loaded
                        (typically at application startup time)
    %(thread)d          Thread ID (if available)
    %(threadName)s      Thread name (if available)
    %(process)d         Process ID (if available)
    %(message)s         The result of record.getMessage(), computed just as
                        the record is emitted
    cCs(|r||_n	d|_||_dS(s8
        Initialize the formatter with specified format strings.

        Initialize the formatter either with the specified format string, or a
        default as described above. Allow for specialized date formatting with
        the optional datefmt argument (if omitted, you get the ISO8601 format).
        s%(message)sN(t_fmttdatefmt(RjtfmtR{((s(/usr/lib64/python2.7/logging/__init__.pyRn�s	cCsV|j|j�}|r-tj||�}n%tjd|�}d||jf}|S(s
        Return the creation time of the specified LogRecord as formatted text.

        This method should be called from format() by a formatter which
        wants to make use of a formatted time. This method can be overridden
        in formatters to provide for any specific requirement, but the
        basic behaviour is as follows: if datefmt (a string) is specified,
        it is used with time.strftime() to format the creation time of the
        record. Otherwise, the ISO8601 format is used. The resulting
        string is returned. This function uses a user-configurable function
        to convert the creation time to a tuple. By default, time.localtime()
        is used; to change this for a particular formatter instance, set the
        'converter' attribute to a function with the same signature as
        time.localtime() or time.gmtime(). To change it for all formatters,
        for example if you want all logging times to be shown in GMT,
        set the 'converter' attribute in the Formatter class.
        s%Y-%m-%d %H:%M:%Ss%s,%03d(t	converterRXRCtstrftimeRY(RjtrecordR{Rltstt((s(/usr/lib64/python2.7/logging/__init__.pyt
formatTime�scCshtj�}tj|d|d|dd|�|j�}|j�|ddkrd|d }n|S(s�
        Format and return the specified exception information as a string.

        This default implementation just uses
        traceback.print_exception()
        iiii����s
N(t	cStringIOtStringIOt	tracebacktprint_exceptionRTtgetvaluetclose(RjteitsioR�((s(/usr/lib64/python2.7/logging/__init__.pytformatException�s%

cCs|jjd�dkS(sK
        Check if the format uses the creation time of the record.
        s
%(asctime)i(Rztfind(Rj((s(/usr/lib64/python2.7/logging/__init__.pytusesTime�scCsA|j�|_|j�r6|j||j�|_ny|j|j}WnVtk
r�}y)|j	j
d�|_	|j|j}Wq�tk
r�|�q�XnX|jr�|js�|j
|j�|_q�n|jr=|ddkr�|d}ny||j}Wq=tk
r9||jj
tj�d�}q=Xn|S(sz
        Format the specified record as text.

        The record's attribute dictionary is used as the operand to a
        string formatting operation which yields the returned string.
        Before formatting the dictionary, a couple of preparatory steps
        are carried out. The message attribute of the record is computed
        using LogRecord.getMessage(). If the formatting string uses the
        time (as determined by a call to usesTime(), formatTime() is
        called to format the event time. If there is exception information,
        it is formatted using formatException() and appended to the message.
        sutf-8i����s
treplace(RstmessageR�R�R{tasctimeRzRwtUnicodeDecodeErrorRDtdecodeR(RUR�RrR'tgetfilesystemencoding(RjRR�te((s(/usr/lib64/python2.7/logging/__init__.pytformat�s.

			

N(RtRuRvRCt	localtimeR}RTRnR�R�R�R�(((s(/usr/lib64/python2.7/logging/__init__.pyR[s(			cBs5eZdZdd�Zd�Zd�Zd�ZRS(sB
    A formatter suitable for formatting a number of records.
    cCs|r||_n	t|_dS(sm
        Optionally specify a formatter which will be used to format each
        individual record.
        N(tlinefmtt_defaultFormatter(RjR�((s(/usr/lib64/python2.7/logging/__init__.pyRn�scCsdS(sE
        Return the header string for the specified records.
        R.((Rjtrecords((s(/usr/lib64/python2.7/logging/__init__.pytformatHeaderscCsdS(sE
        Return the footer string for the specified records.
        R.((RjR�((s(/usr/lib64/python2.7/logging/__init__.pytformatFooterscCsld}t|�dkrh||j|�}x$|D]}||jj|�}q2W||j|�}n|S(sQ
        Format the specified records and return the result as a string.
        R.i(RFR�R�R�R�(RjR�R;R((s(/usr/lib64/python2.7/logging/__init__.pyR�s
N(RtRuRvRTRnR�R�R�(((s(/usr/lib64/python2.7/logging/__init__.pyR�s

		cBs#eZdZdd�Zd�ZRS(s�
    Filter instances are used to perform arbitrary filtering of LogRecords.

    Loggers and Handlers can optionally use Filter instances to filter
    records as desired. The base filter class only allows events which are
    below a certain point in the logger hierarchy. For example, a filter
    initialized with "A.B" will allow events logged by loggers "A.B",
    "A.B.C", "A.B.C.D", "A.B.D" etc. but not "A.BB", "B.A.B" etc. If
    initialized with the empty string, all events are passed.
    R.cCs||_t|�|_dS(s�
        Initialize a filter.

        Initialize with the name of the logger which, together with its
        children, will have its events allowed through the filter. If no
        name is specified, allow every event.
        N(RDRFtnlen(RjRD((s(/usr/lib64/python2.7/logging/__init__.pyRn,s	cCse|jdkrdS|j|jkr)dS|jj|jd|j�dkrQdS|j|jdkS(s�
        Determine if the specified record is to be logged.

        Is the specified record to be logged? Returns 0 for no, nonzero for
        yes. If deemed appropriate, the record may be modified in-place.
        iit.(R�RDR�(RjR((s(/usr/lib64/python2.7/logging/__init__.pytfilter7s$(RtRuRvRnR�(((s(/usr/lib64/python2.7/logging/__init__.pyR!s
tFilterercBs2eZdZd�Zd�Zd�Zd�ZRS(s[
    A base class for loggers and handlers which allows them to share
    common code.
    cCs
g|_dS(sE
        Initialize the list of filters to be an empty list.
        N(tfilters(Rj((s(/usr/lib64/python2.7/logging/__init__.pyRnKscCs&||jkr"|jj|�ndS(s;
        Add the specified filter to this handler.
        N(R�tappend(RjR�((s(/usr/lib64/python2.7/logging/__init__.pyt	addFilterQscCs&||jkr"|jj|�ndS(s@
        Remove the specified filter from this handler.
        N(R�tremove(RjR�((s(/usr/lib64/python2.7/logging/__init__.pytremoveFilterXscCs7d}x*|jD]}|j|�sd}PqqW|S(s
        Determine if a record is loggable by consulting all the filters.

        The default is to allow the record to be logged; any filter can veto
        this and the record is then dropped. Returns a zero value if a record
        is to be dropped, else non-zero.
        ii(R�R�(RjRR;tf((s(/usr/lib64/python2.7/logging/__init__.pyR�_s(RtRuRvRnR�R�R�(((s(/usr/lib64/python2.7/logging/__init__.pyR�Fs
			cCswttt}}}|rs|rs|rsy6|�z ||krO|j|�nWd|�XWqstk
roqsXndS(sD
    Remove a handler reference from the internal cleanup list.
    N(R2R3t_handlerListR�R:(twrR>R?thandlers((s(/usr/lib64/python2.7/logging/__init__.pyt_removeHandlerRefus
cCs3t�ztjtj|t��Wdt�XdS(sL
    Add a handler to the internal cleanup list using a weak reference.
    N(R2R�R�tweakreftrefR�R3(thandler((s(/usr/lib64/python2.7/logging/__init__.pyt_addHandlerRef�scBs�eZdZed�Zd�Zd�Zeee�Zd�Z	d�Z
d�Zd�Zd�Z
d	�Zd
�Zd�Zd�Zd
�Zd�ZRS(sq
    Handler instances dispatch logging events to specific destinations.

    The base handler class. Acts as a placeholder which defines the Handler
    interface. Handlers can optionally use Formatter instances to format
    records as desired. By default, no formatter is specified; in this case,
    the 'raw' message as determined by record.message is logged.
    cCsFtj|�d|_t|�|_d|_t|�|j�dS(sz
        Initializes the instance - basically setting the formatter to None
        and the filter list to empty.
        N(	R�RnRTt_nameR<R1t	formatterR�t
createLock(RjR1((s(/usr/lib64/python2.7/logging/__init__.pyRn�s
		
cCs|jS(N(R�(Rj((s(/usr/lib64/python2.7/logging/__init__.pytget_name�scCsRt�z<|jtkr&t|j=n||_|rB|t|<nWdt�XdS(N(R2R�t	_handlersR3(RjRD((s(/usr/lib64/python2.7/logging/__init__.pytset_name�s
	cCs%trtj�|_n	d|_dS(sU
        Acquire a thread lock for serializing access to the underlying I/O.
        N(R]R_tRLocktlockRT(Rj((s(/usr/lib64/python2.7/logging/__init__.pyR��scCs|jr|jj�ndS(s.
        Acquire the I/O thread lock.
        N(R�R>(Rj((s(/usr/lib64/python2.7/logging/__init__.pyR>�s	cCs|jr|jj�ndS(s.
        Release the I/O thread lock.
        N(R�R?(Rj((s(/usr/lib64/python2.7/logging/__init__.pyR?�s	cCst|�|_dS(s8
        Set the logging level of this handler.
        N(R<R1(RjR1((s(/usr/lib64/python2.7/logging/__init__.pytsetLevel�scCs(|jr|j}nt}|j|�S(s�
        Format the specified record.

        If a formatter is set, use it. Otherwise, use the default formatter
        for the module.
        (R�R�R�(RjRR|((s(/usr/lib64/python2.7/logging/__init__.pyR��s	cCstd��dS(s�
        Do whatever it takes to actually log the specified logging record.

        This version is intended to be implemented by subclasses and so
        raises a NotImplementedError.
        s.emit must be implemented by Handler subclassesN(tNotImplementedError(RjR((s(/usr/lib64/python2.7/logging/__init__.pytemit�scCsE|j|�}|rA|j�z|j|�Wd|j�Xn|S(s<
        Conditionally emit the specified logging record.

        Emission depends on filters which may have been added to the handler.
        Wrap the actual emission of the record with acquisition/release of
        the I/O thread lock. Returns whether the filter passed the record for
        emission.
        N(R�R>R�R?(RjRR;((s(/usr/lib64/python2.7/logging/__init__.pythandle�s	
cCs
||_dS(s5
        Set the formatter for this handler.
        N(R�(RjR|((s(/usr/lib64/python2.7/logging/__init__.pytsetFormatterscCsdS(s�
        Ensure all logging output has been flushed.

        This version does nothing and is intended to be implemented by
        subclasses.
        N((Rj((s(/usr/lib64/python2.7/logging/__init__.pytflush	scCs?t�z)|jr/|jtkr/t|j=nWdt�XdS(s%
        Tidy up any resources used by the handler.

        This version removes the handler from an internal map of handlers,
        _handlers, which is used for handler lookup by name. Subclasses
        should ensure that this gets called from overridden close()
        methods.
        N(R2R�R�R3(Rj((s(/usr/lib64/python2.7/logging/__init__.pyR�s

cCs�tr�tjr�tj�}zdyLtj|d|d|ddtj�tjjd|j|j	f�Wnt
k
r}nXWd~XndS(sD
        Handle errors which occur during an emit() call.

        This method should be called from handlers when an exception is
        encountered during an emit() call. If raiseExceptions is false,
        exceptions get silently ignored. This is what is mostly wanted
        for a logging system - most users will not care about errors in
        the logging system, they are more interested in application errors.
        You could, however, replace this with a custom handler if you wish.
        The record which was being processed is passed in to this method.
        iiisLogged from file %s, line %s
N(traiseExceptionsR'tstderrR(R�R�RTtwriteRPRVtIOError(RjRR�((s(/usr/lib64/python2.7/logging/__init__.pythandleError#s

(RtRuRvRRnR�R�tpropertyRDR�R>R?R�R�R�R�R�R�R�R�(((s(/usr/lib64/python2.7/logging/__init__.pyR	�s 
								
	
					cBs,eZdZdd�Zd�Zd�ZRS(s�
    A handler class which writes logging records, appropriately formatted,
    to a stream. Note that this class does not close the stream, as
    sys.stdout or sys.stderr may be used.
    cCs2tj|�|dkr%tj}n||_dS(sb
        Initialize the handler.

        If stream is not specified, sys.stderr is used.
        N(R	RnRTR'R�tstream(RjR�((s(/usr/lib64/python2.7/logging/__init__.pyRnBs
cCsK|j�z/|jr8t|jd�r8|jj�nWd|j�XdS(s%
        Flushes the stream.
        R�N(R>R�RhR�R?(Rj((s(/usr/lib64/python2.7/logging/__init__.pyR�Ms

cCs-y�|j|�}|j}d}ts;|j||�n�y�t|t�r�t|dd�r�d}y|j||�Wq�tk
r�|j||j	|j
��q�Xn|j||�Wn+tk
r�|j||j	d��nX|j�Wn-t
tfk
r�n|j|�nXdS(s�
        Emit a record.

        If a formatter is specified, it is used to format the record.
        The record is then written to the stream with a trailing newline.  If
        exception information is present, it is formatted using
        traceback.print_exception and appended to the stream.  If the stream
        has an 'encoding' attribute, it is used to determine how to do the
        output to the stream.
        s%s
tencodingu%s
sUTF-8N(R�R�RpR�R5tunicodetgetattrRTtUnicodeEncodeErrortencodeR�RrR�tKeyboardInterruptt
SystemExitR�(RjRRER�tfstufs((s(/usr/lib64/python2.7/logging/__init__.pyR�Xs,	
$
N(RtRuRvRTRnR�R�(((s(/usr/lib64/python2.7/logging/__init__.pyR;s	cBs;eZdZdddd�Zd�Zd�Zd�ZRS(sO
    A handler class which writes formatted logging records to disk files.
    taicCs~tdkrd}ntjj|�|_||_||_||_|rdt	j
|�d|_ntj
||j
��dS(sO
        Open the specified file and use it as the stream for logging.
        N(tcodecsRTRMRNtabspathtbaseFilenametmodeR�tdelayR	RnR�Rt_open(RjRPR�R�R�((s(/usr/lib64/python2.7/logging/__init__.pyRn�s				
cCs�|j�zezP|jr\z|j�Wd|j}d|_t|d�rX|j�nXnWdtj|�XWd|j�XdS(s$
        Closes the stream.
        NR�(R>R�R�RTRhR�RR?(RjR�((s(/usr/lib64/python2.7/logging/__init__.pyR��s
			cCsI|jdkr't|j|j�}ntj|j|j|j�}|S(sx
        Open the current base file with the (original) mode and encoding.
        Return the resulting stream.
        N(R�RTtopenR�R�R�(RjR�((s(/usr/lib64/python2.7/logging/__init__.pyR��scCs5|jdkr!|j�|_ntj||�dS(s�
        Emit a record.

        If the stream was not opened because 'delay' was specified in the
        constructor, open it before calling the superclass's emit.
        N(R�RTR�RR�(RjR((s(/usr/lib64/python2.7/logging/__init__.pyR��sN(RtRuRvRTRnR�R�R�(((s(/usr/lib64/python2.7/logging/__init__.pyR�s
		tPlaceHoldercBs eZdZd�Zd�ZRS(s�
    PlaceHolder instances are used in the Manager logger hierarchy to take
    the place of nodes for which no loggers have been defined. This class is
    intended for internal use only and not as part of the public API.
    cCsid|6|_dS(sY
        Initialize with the specified logger being a child of this placeholder.
        N(RTt	loggerMap(Rjtalogger((s(/usr/lib64/python2.7/logging/__init__.pyRn�scCs#||jkrd|j|<ndS(sJ
        Add the specified logger as a child of this placeholder.
        N(R�RT(RjR�((s(/usr/lib64/python2.7/logging/__init__.pyR��s(RtRuRvRnR�(((s(/usr/lib64/python2.7/logging/__init__.pyR��s	cCs>|tkr4t|t�s4td|j��q4n|adS(s�
    Set the class to be used when instantiating a logger. The class should
    define __init__() such that only a name argument is required, and the
    __init__() should call Logger.__init__()
    s(logger not derived from logging.Logger: N(Rt
issubclassR:Rtt_loggerClass(tklass((s(/usr/lib64/python2.7/logging/__init__.pyR"�s
cCstS(sB
    Return the class to be used when instantiating a logger.
    (R�(((s(/usr/lib64/python2.7/logging/__init__.pyR�stManagercBs;eZdZd�Zd�Zd�Zd�Zd�ZRS(st
    There is [under normal circumstances] just one Manager instance, which
    holds the hierarchy of loggers.
    cCs1||_d|_d|_i|_d|_dS(sT
        Initialize the manager with the root node of the logger hierarchy.
        iN(trootRtemittedNoHandlerWarningt
loggerDictRTtloggerClass(Rjtrootnode((s(/usr/lib64/python2.7/logging/__init__.pyRn�s
				cCsd}t|t�s$td��nt|t�rE|jd�}nt�z�||jkr�|j|}t|t�r|}|j	p�t
|�}||_||j|<|j||�|j
|�qn8|j	p�t
|�}||_||j|<|j
|�Wdt�X|S(s�
        Get a logger with the specified name (channel name), creating it
        if it doesn't yet exist. This name is a dot-separated hierarchical
        name, such as "a", "a.b", "a.b.c" or similar.

        If a PlaceHolder existed for the specified name [i.e. the logger
        didn't exist but a child of it did], replace it with the created
        logger and fix up the parent/child references which pointed to the
        placeholder to now point to the logger.
        s'A logger name must be string or Unicodesutf-8N(RTR5RqR:R�R�R2R�R�R�R�tmanagert_fixupChildrent
_fixupParentsR3(RjRDR;tph((s(/usr/lib64/python2.7/logging/__init__.pyRs,
	
	
cCsA|tkr4t|t�s4td|j��q4n||_dS(sY
        Set the class to be used when instantiating a logger with this Manager.
        s(logger not derived from logging.Logger: N(RR�R:RtR�(RjR�((s(/usr/lib64/python2.7/logging/__init__.pyR",s
cCs�|j}|jd�}d}x�|dkr�|r�|| }||jkrct|�|j|<nG|j|}t|t�r�|}n"t|t�s�t�|j|�|jdd|d�}q!W|s�|j	}n||_
dS(s�
        Ensure that there are either loggers or placeholders all the way
        from the specified logger to the root of the logger hierarchy.
        R�iiN(RDtrfindRTR�R�R5RtAssertionErrorR�R�tparent(RjR�RDtiR;tsubstrtobj((s(/usr/lib64/python2.7/logging/__init__.pyR�6s 	

	
cCsa|j}t|�}xE|jj�D]4}|jj| |kr%|j|_||_q%q%WdS(sk
        Ensure that children of the placeholder ph are connected to the
        specified logger.
        N(RDRFR�tkeysR�(RjR�R�RDtnamelentc((s(/usr/lib64/python2.7/logging/__init__.pyR�Ns	(RtRuRvRnRR"R�R�(((s(/usr/lib64/python2.7/logging/__init__.pyR��s	
	$	
	cBs�eZdZed�Zd�Zd�Zd�Zd�ZeZ	d�Z
d�Zd�ZeZ
d	�Zd
�Zddd�Zddd�Zd
�Zd�Zd�Zd�Zd�Zd�Zd�ZRS(sr
    Instances of the Logger class represent a single logging channel. A
    "logging channel" indicates an area of an application. Exactly how an
    "area" is defined is up to the application developer. Since an
    application can have any number of areas, logging channels are identified
    by a unique string. Application areas can be nested (e.g. an area
    of "input processing" might include sub-areas "read CSV files", "read
    XLS files" and "read Gnumeric files"). To cater for this natural nesting,
    channel names are organized into a namespace hierarchy where levels are
    separated by periods, much like the Java or Python package namespace. So
    in the instance given above, channel names might be "input" for the upper
    level, and "input.csv", "input.xls" and "input.gnu" for the sub-levels.
    There is no arbitrary limit to the depth of nesting.
    cCsMtj|�||_t|�|_d|_d|_g|_d|_	dS(sJ
        Initialize the logger with a name and an optional level.
        iiN(
R�RnRDR<R1RTR�t	propagateR�tdisabled(RjRDR1((s(/usr/lib64/python2.7/logging/__init__.pyRnns
				cCst|�|_dS(s7
        Set the logging level of this logger.
        N(R<R1(RjR1((s(/usr/lib64/python2.7/logging/__init__.pyR�zscOs,|jt�r(|jt|||�ndS(s�
        Log 'msg % args' with severity 'DEBUG'.

        To pass exception information, use the keyword argument exc_info with
        a true value, e.g.

        logger.debug("Houston, we have a %s", "thorny problem", exc_info=1)
        N(tisEnabledForRt_log(RjRERItkwargs((s(/usr/lib64/python2.7/logging/__init__.pyR�s	cOs,|jt�r(|jt|||�ndS(s�
        Log 'msg % args' with severity 'INFO'.

        To pass exception information, use the keyword argument exc_info with
        a true value, e.g.

        logger.info("Houston, we have a %s", "interesting problem", exc_info=1)
        N(R�R
R�(RjRERIR�((s(/usr/lib64/python2.7/logging/__init__.pyR�s	cOs,|jt�r(|jt|||�ndS(s�
        Log 'msg % args' with severity 'WARNING'.

        To pass exception information, use the keyword argument exc_info with
        a true value, e.g.

        logger.warning("Houston, we have a %s", "bit of a problem", exc_info=1)
        N(R�RR�(RjRERIR�((s(/usr/lib64/python2.7/logging/__init__.pyR$�s	cOs,|jt�r(|jt|||�ndS(s�
        Log 'msg % args' with severity 'ERROR'.

        To pass exception information, use the keyword argument exc_info with
        a true value, e.g.

        logger.error("Houston, we have a %s", "major problem", exc_info=1)
        N(R�RR�(RjRERIR�((s(/usr/lib64/python2.7/logging/__init__.pyR�s	cOs!d|d<|j|||�dS(sU
        Convenience method for logging an ERROR with exception information.
        iR(N(R(RjRERIR�((s(/usr/lib64/python2.7/logging/__init__.pyR�s
cOs,|jt�r(|jt|||�ndS(s�
        Log 'msg % args' with severity 'CRITICAL'.

        To pass exception information, use the keyword argument exc_info with
        a true value, e.g.

        logger.critical("Houston, we have a %s", "major disaster", exc_info=1)
        N(R�RR�(RjRERIR�((s(/usr/lib64/python2.7/logging/__init__.pyR�s	cOs]t|ttf�s1tr*td��q1dSn|j|�rY|j||||�ndS(s�
        Log 'msg % args' with the integer severity 'level'.

        To pass exception information, use the keyword argument exc_info with
        a true value, e.g.

        logger.log(level, "We have a %s", "mysterious problem", exc_info=1)
        slevel must be an integerN(R5R6R7R�R:R�R�(RjR1RERIR�((s(/usr/lib64/python2.7/logging/__init__.pyR �s	cCs�t�}|dk	r!|j}nd}xet|d�r�|j}tjj|j�}|t	krr|j}q*n|j|j
|jf}Pq*W|S(s�
        Find the stack frame of the caller so that we can note the source
        file name, line number and function name.
        s(unknown file)is(unknown function)tf_codeN(s(unknown file)is(unknown function)(R+RTR*RhR�RMRNtnormcasetco_filenamet_srcfiletf_linenotco_name(RjR�R;tcoRP((s(/usr/lib64/python2.7/logging/__init__.pyt
findCaller�s			c
	Cs�t||||||||�}
|	dk	r�xP|	D]E}|dksU||
jkrhtd|��n|	||
j|<q4Wn|
S(sr
        A factory method which can be overridden in subclasses to create
        specialized LogRecords.
        R�R�s$Attempt to overwrite %r in LogRecordN(R�R�(RRTRwtKeyError(RjRDR1tfntlnoRERIR(RktextraR;tkey((s(/usr/lib64/python2.7/logging/__init__.pyt
makeRecord�s!
c

Cs�trEy|j�\}}}WqTtk
rAd\}}}qTXnd\}}}|r{t|t�s{tj�}q{n|j|j||||||||�	}	|j	|	�dS(s�
        Low-level logging routine which creates a LogRecord and then calls
        all the handlers of this logger to handle the record.
        s(unknown file)is(unknown function)N(s(unknown file)is(unknown function)(s(unknown file)is(unknown function)(
R�R�R9R5ttupleR'R(R�RDR�(
RjR1RERIR(R�R�R�RkR((s(/usr/lib64/python2.7/logging/__init__.pyR��s
*cCs-|jr)|j|�r)|j|�ndS(s�
        Call the handlers for the specified record.

        This method is used for unpickled records received from a socket, as
        well as those created locally. Logger-level filtering is applied.
        N(R�R�tcallHandlers(RjR((s(/usr/lib64/python2.7/logging/__init__.pyR�scCs<t�z&||jkr,|jj|�nWdt�XdS(s;
        Add the specified handler to this logger.
        N(R2R�R�R3(Rjthdlr((s(/usr/lib64/python2.7/logging/__init__.pyt
addHandlers
cCs<t�z&||jkr,|jj|�nWdt�XdS(s@
        Remove the specified handler from this logger.
        N(R2R�R�R3(RjR((s(/usr/lib64/python2.7/logging/__init__.pyt
removeHandler$s
cCs�|}d}xe|rsx=|jD]2}|d}|j|jkr|j|�qqW|jsgd}q|j}qW|dkr�tr�|jj	r�t
jjd|j
�d|j_	ndS(s�
        Pass a record to all relevant handlers.

        Loop through all handlers for this logger and its parents in the
        logger hierarchy. If no handler was found, output a one-off error
        message to sys.stderr. Stop searching up the hierarchy whenever a
        logger with the "propagate" attribute set to zero is found - that
        will be the last logger whose handlers are called.
        iis+No handlers could be found for logger "%s"
N(R�RKR1R�R�RTR�R�R�R�R'R�R�RD(RjRR�tfoundR((s(/usr/lib64/python2.7/logging/__init__.pyR/s
	
		
cCs0|}x#|r+|jr|jS|j}q	WtS(s�
        Get the effective level for this logger.

        Loop through this logger and its parents in the logger hierarchy,
        looking for a non-zero logging level. Return the first one found.
        (R1R�R(Rjtlogger((s(/usr/lib64/python2.7/logging/__init__.pytgetEffectiveLevelIs		
cCs&|jj|krdS||j�kS(s;
        Is this logger enabled for level 'level'?
        i(R�RR(RjR1((s(/usr/lib64/python2.7/logging/__init__.pyR�WscCs:|j|k	r*dj|j|f�}n|jj|�S(sb
        Get a logger which is a descendant to this one.

        This is a convenience method, such that

        logging.getLogger('abc').getChild('def.ghi')

        is the same as

        logging.getLogger('abc.def.ghi')

        It's useful, for example, when the parent logger is named using
        __name__ rather than a literal string.
        R�(R�tjoinRDR�R(Rjtsuffix((s(/usr/lib64/python2.7/logging/__init__.pytgetChild_sN(RtRuRvRRnR�RRR$R#RRRRR R�RTR�R�R�RRRRR�R
(((s(/usr/lib64/python2.7/logging/__init__.pyR_s,									
	
					t
RootLoggercBseZdZd�ZRS(s�
    A root logger is not that different to any other logger, except that
    it must have a logging level and there is only one instance of it in
    the hierarchy.
    cCstj|d|�dS(s=
        Initialize the logger with the name "root".
        R�N(RRn(RjR1((s(/usr/lib64/python2.7/logging/__init__.pyRnxs(RtRuRvRn(((s(/usr/lib64/python2.7/logging/__init__.pyRrscBsheZdZd�Zd�Zd�Zd�Zd�Zd�Zd�Z	d�Z
d	�Zd
�ZRS(so
    An adapter for loggers which makes it easier to specify contextual
    information in logging output.
    cCs||_||_dS(sx
        Initialize the adapter with a logger and a dict-like object which
        provides contextual information. This constructor signature allows
        easy stacking of LoggerAdapters, if so desired.

        You can effectively pass keyword arguments as shown in the
        following example:

        adapter = LoggerAdapter(someLogger, dict(p1=v1, p2="v2"))
        N(RR�(RjRR�((s(/usr/lib64/python2.7/logging/__init__.pyRn�s	cCs|j|d<||fS(s�
        Process the logging message and keyword arguments passed in to
        a logging call to insert contextual information. You can either
        manipulate the message itself, the keyword args or both. Return
        the message and kwargs modified (or not) to suit your needs.

        Normally, you'll only need to override this one method in a
        LoggerAdapter subclass for your specific needs.
        R�(R�(RjRER�((s(/usr/lib64/python2.7/logging/__init__.pyRi�s

cOs2|j||�\}}|jj|||�dS(s�
        Delegate a debug call to the underlying logger, after adding
        contextual information from this adapter instance.
        N(RiRR(RjRERIR�((s(/usr/lib64/python2.7/logging/__init__.pyR�scOs2|j||�\}}|jj|||�dS(s�
        Delegate an info call to the underlying logger, after adding
        contextual information from this adapter instance.
        N(RiRR(RjRERIR�((s(/usr/lib64/python2.7/logging/__init__.pyR�scOs2|j||�\}}|jj|||�dS(s�
        Delegate a warning call to the underlying logger, after adding
        contextual information from this adapter instance.
        N(RiRR$(RjRERIR�((s(/usr/lib64/python2.7/logging/__init__.pyR$�scOs2|j||�\}}|jj|||�dS(s�
        Delegate an error call to the underlying logger, after adding
        contextual information from this adapter instance.
        N(RiRR(RjRERIR�((s(/usr/lib64/python2.7/logging/__init__.pyR�scOs<|j||�\}}d|d<|jj|||�dS(s�
        Delegate an exception call to the underlying logger, after adding
        contextual information from this adapter instance.
        iR(N(RiRR(RjRERIR�((s(/usr/lib64/python2.7/logging/__init__.pyR�s
cOs2|j||�\}}|jj|||�dS(s�
        Delegate a critical call to the underlying logger, after adding
        contextual information from this adapter instance.
        N(RiRR(RjRERIR�((s(/usr/lib64/python2.7/logging/__init__.pyR�scOs5|j||�\}}|jj||||�dS(s�
        Delegate a log call to the underlying logger, after adding
        contextual information from this adapter instance.
        N(RiRR (RjR1RERIR�((s(/usr/lib64/python2.7/logging/__init__.pyR �scCs|jj|�S(sR
        See if the underlying logger is enabled for the specified level.
        (RR�(RjR1((s(/usr/lib64/python2.7/logging/__init__.pyR��s(
RtRuRvRnRiRRR$RRRR R�(((s(/usr/lib64/python2.7/logging/__init__.pyR
�s		
								s"%(levelname)s:%(name)s:%(message)sc	Ks�t�z�ttj�dkr�|jd�}|rX|jdd�}t||�}n|jd�}t|�}|jdt�}|jdd	�}t	||�}|j
|�tj|�|jd�}|d	k	r�tj|�q�nWd	t
�Xd	S(
s�
    Do basic configuration for the logging system.

    This function does nothing if the root logger already has handlers
    configured. It is a convenience method intended for use by simple scripts
    to do one-shot configuration of the logging package.

    The default behaviour is to create a StreamHandler which writes to
    sys.stderr, set a formatter using the BASIC_FORMAT format string, and
    add the handler to the root logger.

    A number of optional keyword arguments may be specified, which can alter
    the default behaviour.

    filename  Specifies that a FileHandler be created, using the specified
              filename, rather than a StreamHandler.
    filemode  Specifies the mode to open the file, if filename is specified
              (if filemode is unspecified, it defaults to 'a').
    format    Use the specified format string for the handler.
    datefmt   Use the specified date/time format.
    level     Set the root logger level to the specified level.
    stream    Use the specified stream to initialize the StreamHandler. Note
              that this argument is incompatible with 'filename' - if both
              are present, 'stream' is ignored.

    Note that you could specify a stream created using open(filename, mode)
    rather than passing the filename and mode in. However, it should be
    remembered that StreamHandler does not close its stream (since it may be
    using sys.stdout or sys.stderr), whereas FileHandler closes its stream
    when the handler is closed.
    iRPtfilemodeR�R�R�R{R1N(R2RFR�R�R0RRRRTRR�RR�R3(	R�RPR�RR�R�tdfsR|R1((s(/usr/lib64/python2.7/logging/__init__.pyR�s$"

cCs|rtjj|�StSdS(s�
    Return a logger with the specified name, creating it if necessary.

    If no name is specified, return the root logger.
    N(RR�RR�(RD((s(/usr/lib64/python2.7/logging/__init__.pyR&scOs6ttj�dkrt�ntj|||�dS(sD
    Log a message with severity 'CRITICAL' on the root logger.
    iN(RFR�R�RR(RERIR�((s(/usr/lib64/python2.7/logging/__init__.pyR:s
cOs6ttj�dkrt�ntj|||�dS(sA
    Log a message with severity 'ERROR' on the root logger.
    iN(RFR�R�RR(RERIR�((s(/usr/lib64/python2.7/logging/__init__.pyRDs
cOsd|d<t|||�dS(sa
    Log a message with severity 'ERROR' on the root logger,
    with exception information.
    iR(N(R(RERIR�((s(/usr/lib64/python2.7/logging/__init__.pyRLs
cOs6ttj�dkrt�ntj|||�dS(sC
    Log a message with severity 'WARNING' on the root logger.
    iN(RFR�R�RR$(RERIR�((s(/usr/lib64/python2.7/logging/__init__.pyR$Ts
cOs6ttj�dkrt�ntj|||�dS(s@
    Log a message with severity 'INFO' on the root logger.
    iN(RFR�R�RR(RERIR�((s(/usr/lib64/python2.7/logging/__init__.pyR^s
cOs6ttj�dkrt�ntj|||�dS(sA
    Log a message with severity 'DEBUG' on the root logger.
    iN(RFR�R�RR(RERIR�((s(/usr/lib64/python2.7/logging/__init__.pyRfs
cOs9ttj�dkrt�ntj||||�dS(sP
    Log 'msg % args' with the integer severity 'level' on the root logger.
    iN(RFR�R�RR (R1RERIR�((s(/usr/lib64/python2.7/logging/__init__.pyR ns
cCs|tj_dS(sB
    Disable all logging calls of severity 'level' and below.
    N(R�R�R(R1((s(/usr/lib64/python2.7/logging/__init__.pyRvscCs�x�t|�D]�}yd|�}|rwz@y"|j�|j�|j�Wnttfk
rdnXWd|j�XnWqtr��q�qXqWdS(s�
    Perform any cleanup actions in the logging system (e.g. flushing
    buffers).

    Should be called at application exit.
    N(treversedR>R�R�R�R9R?R�(thandlerListR�th((s(/usr/lib64/python2.7/logging/__init__.pytshutdown|s	

cBs)eZdZd�Zd�Zd�ZRS(s�
    This handler does nothing. It's intended to be used to avoid the
    "No handlers could be found for logger XXX" one-off warning. This is
    important for library code, which may contain code to log events. If a user
    of the library does not configure logging, the one-off warning might be
    produced; to avoid this, the library developer simply needs to instantiate
    a NullHandler and add it to the top-level logger of the library module or
    package.
    cCsdS(N((RjR((s(/usr/lib64/python2.7/logging/__init__.pyR��scCsdS(N((RjR((s(/usr/lib64/python2.7/logging/__init__.pyR��scCs
d|_dS(N(RTR�(Rj((s(/usr/lib64/python2.7/logging/__init__.pyR��s(RtRuRvR�R�R�(((s(/usr/lib64/python2.7/logging/__init__.pyR�s			cCs�|dk	r7tdk	r�t||||||�q�nStj|||||�}td�}|jsz|jt��n|jd|�dS(s�
    Implementation of showwarnings which redirects to logging, which will first
    check to see if the file parameter is None. If a file is specified, it will
    delegate to the original warnings implementation of showwarning. Otherwise,
    it will call warnings.formatwarning and will log the resulting string to a
    warnings logger named "py.warnings" with level logging.WARNING.
    spy.warningss%sN(	RTt_warnings_showwarningtwarningst
formatwarningRR�RRR$(R�tcategoryRPRVtfiletlineR�R((s(/usr/lib64/python2.7/logging/__init__.pyt_showwarning�s	cCsL|r*tdkrHtjatt_qHntdk	rHtt_dandS(s�
    If capture is true, redirect all warnings to the logging package.
    If capture is False, ensure that warnings are not redirected to logging
    but to their original destinations.
    N(RRTRtshowwarningR(tcapture((s(/usr/lib64/python2.7/logging/__init__.pyR�s		(bRvR'RMRCR�R�RR�RGt__all__R�tImportErrorRTR]R_t
__author__t
__status__t__version__t__date__R�tTrueRpt	NameErrortFalseR+RhRNR�t__code__R�R�RZR�R\RbRgRRRRRR
RRR/RRR<R�R=R2R3tobjectRR!RR�RRR�tWeakValueDictionaryR�R�R�R�R	RRR�R�R"RR�RRR
R�R�RRRRRRRR$R#RRR RRtatexittregisterRRRR(((s(/usr/lib64/python2.7/logging/__init__.pyt<module>s�`






	

		
				k	�	*%,		
�GH	
	f�`		<								
__pycache__/__init__.cpython-36.opt-2.pyc000064400000077406150327210640014117 0ustar003


 \e�*@s�ddlZddlZddlZddlZddlZddlZddlZddlZddlm	Z	ddddddd	d
ddd
ddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,g*Z
yddlZWnek
r�dZYnXd-Z
d.Zd/Zd0Zej�Zd1Zd1Zd1Zd1Zd2ZeZd3Zd4ZeZd5Zd6ZdZedededed
edediZeeeeeeeed7�Zd8d�Z d9d�Z!e"ed:��rjd;d<�Z#nd=d>�Z#ej$j%e!j&j'�Z(d?d@�Z)e�r�ej*�Z+ndZ+dAdB�Z,dCdD�Z-GdEd�de.�Z/e/a0dFd*�Z1dGd)�Z2dHd$�Z3GdIdJ�dJe.�Z4GdKdL�dLe4�Z5GdMdN�dNe4�Z6dOZ7e4e7fe5dPfe6dQfdR�Z8GdSd�de.�Z9e9�Z:GdTd�de.�Z;GdUd
�d
e.�Z<GdVdW�dWe.�Z=ej>�Z?gZ@dXdY�ZAdZd[�ZBGd\d�de=�ZCGd]d�deC�ZDGd^d	�d	eD�ZEGd_d`�d`eD�ZFeFe�ZGeGZHGdadb�dbe.�ZIdcd%�ZJddd!�ZKGdedf�dfe.�ZLGdgd�de=�ZMGdhdi�dieM�ZNeMaOGdjd�de.�ZPeNe�ZQeQeM_QeLeMjQ�eM_Rdkd�ZSd|dld �ZTdmd�ZUeUZVdnd�ZWd1do�dpd�ZXdqd(�ZYdrd'�ZZdsd"�Z[dtd�Z\dud#�Z]dvd�Z^e@fdwd&�Z_ddl`Z`e`jae_�Gdxd�deC�Zbdacd}dydz�Zdd{d�ZedS)~�N)�Template�BASIC_FORMAT�BufferingFormatter�CRITICAL�DEBUG�ERROR�FATAL�FileHandler�Filter�	Formatter�Handler�INFO�	LogRecord�Logger�
LoggerAdapter�NOTSET�NullHandler�
StreamHandler�WARN�WARNING�addLevelName�basicConfig�captureWarnings�critical�debug�disable�error�	exception�fatal�getLevelName�	getLogger�getLoggerClass�info�log�
makeLogRecord�setLoggerClass�shutdown�warn�warning�getLogRecordFactory�setLogRecordFactory�
lastResort�raiseExceptionsz&Vinay Sajip <vinay_sajip@red-dove.com>Z
productionz0.5.1.2z07 February 2010T�2�(���
)rrrrrr
rrcCs4tj|�}|dk	r|Stj|�}|dk	r,|Sd|S)NzLevel %s)�_levelToName�get�_nameToLevel)�level�result�r7�(/usr/lib64/python3.6/logging/__init__.pyrxs

c
Cs(t�z|t|<|t|<Wdt�XdS)N)�_acquireLockr2r4�_releaseLock)r5Z	levelNamer7r7r8r�s
�	_getframecCs
tjd�S)N�)�sysr;r7r7r7r8�<lambda>�sr>cCs.yt�Wn tk
r(tj�djjSXdS)N�)�	Exceptionr=�exc_info�tb_frame�f_backr7r7r7r8�currentframe�srDcCsJt|t�r|}n6t|�|kr:|tkr0td|��t|}ntd|��|S)NzUnknown level: %rz*Level not an integer or a valid string: %r)�
isinstance�int�strr4�
ValueError�	TypeError)r5�rvr7r7r8�_checkLevel�s

rKcCstrtj�dS)N)�_lock�acquirer7r7r7r8r9�sr9cCstrtj�dS)N)rL�releaser7r7r7r8r:�sr:c@s*eZdZddd�Zdd�ZeZdd�ZdS)	rNc

Ks�tj�}||_||_|rDt|�dkrDt|dtj�rD|drD|d}||_t|�|_	||_
||_y&tj
j|�|_tj
j|j�d|_Wn&tttfk
r�||_d|_YnX||_d|_|	|_||_||_||_|t|�d|_|jtd|_to�t �rt j!�|_"t j#�j|_$nd|_"d|_$t%�s0d|_&nDd|_&t'j(j)d�}|dk	�rty|j*�j|_&Wnt+k
�rrYnXt,�r�t-td��r�tj.�|_/nd|_/dS)N�rzUnknown modulei�ZMainProcessZmultiprocessing�getpid)0�time�name�msg�lenrE�collections�Mapping�argsrZ	levelname�levelno�pathname�os�path�basename�filename�splitext�modulerIrH�AttributeErrorrA�exc_text�
stack_info�linenoZfuncName�createdrF�msecs�
_startTimeZrelativeCreated�
logThreads�	threading�	get_identZthreadZcurrent_threadZ
threadName�logMultiprocessingZprocessNamer=�modulesr3Zcurrent_processr@�logProcesses�hasattrrP�process)
�selfrRr5rYrcrSrWrA�func�sinfo�kwargs�ctZmpr7r7r8�__init__�sR 



zLogRecord.__init__cCsd|j|j|j|j|jfS)Nz!<LogRecord: %s, %s, %s, %s, "%s">)rRrXrYrcrS)ror7r7r8�__str__Cs
zLogRecord.__str__cCst|j�}|jr||j}|S)N)rGrSrW)rorSr7r7r8�
getMessageIs

zLogRecord.getMessage)NN)�__name__�
__module__�__qualname__rtru�__repr__rvr7r7r7r8r�s
GcCs|adS)N)�_logRecordFactory)�factoryr7r7r8r*ZscCstS)N)r{r7r7r7r8r)dsc	Cs&tdddddfdd�}|jj|�|S)N�r)r{�__dict__�update)�dictrJr7r7r8r$ksc@s0eZdZdZdZdZdd�Zdd�Zdd	�Zd
S)�PercentStylez%(message)sz%(asctime)sz
%(asctime)cCs|p|j|_dS)N)�default_format�_fmt)ro�fmtr7r7r8rt�szPercentStyle.__init__cCs|jj|j�dkS)Nr)r��find�asctime_search)ror7r7r8�usesTime�szPercentStyle.usesTimecCs|j|jS)N)r�r~)ro�recordr7r7r8�format�szPercentStyle.formatN)	rwrxryr��asctime_formatr�rtr�r�r7r7r7r8r�zsr�c@s eZdZdZdZdZdd�ZdS)�StrFormatStylez	{message}z	{asctime}z{asctimecCs|jjf|j�S)N)r�r�r~)ror�r7r7r8r��szStrFormatStyle.formatN)rwrxryr�r�r�r�r7r7r7r8r��sr�c@s0eZdZdZdZdZdd�Zdd�Zdd�Zd	S)
�StringTemplateStylez
${message}z
${asctime}cCs|p|j|_t|j�|_dS)N)r�r�r�_tpl)ror�r7r7r8rt�szStringTemplateStyle.__init__cCs$|j}|jd�dkp"|j|j�dkS)Nz$asctimer)r�r�r�)ror�r7r7r8r��szStringTemplateStyle.usesTimecCs|jjf|j�S)N)r�Z
substituter~)ror�r7r7r8r��szStringTemplateStyle.formatN)	rwrxryr�r�r�rtr�r�r7r7r7r8r��sr�z"%(levelname)s:%(name)s:%(message)sz{levelname}:{name}:{message}z${levelname}:${name}:${message})�%�{�$c@sVeZdZejZddd�ZdZdZddd�Z	d	d
�Z
dd�Zd
d�Zdd�Z
dd�ZdS)rNr�cCsD|tkrtddjtj����t|d|�|_|jj|_||_dS)NzStyle must be one of: %s�,r)�_STYLESrH�join�keys�_styler��datefmt)ror�r��styler7r7r8rt�s
zFormatter.__init__z%Y-%m-%d %H:%M:%Sz%s,%03dcCs@|j|j�}|rtj||�}ntj|j|�}|j||jf}|S)N)�	converterrdrQZstrftime�default_time_format�default_msec_formatre)ror�r�rs�s�tr7r7r8�
formatTime�szFormatter.formatTimecCsZtj�}|d}tj|d|d|d|�|j�}|j�|dd�dkrV|dd�}|S)Nr?rrO�
���r�)�io�StringIO�	traceback�print_exception�getvalue�close)roZei�sio�tbr�r7r7r8�formatExceptionszFormatter.formatExceptioncCs
|jj�S)N)r�r�)ror7r7r8r�szFormatter.usesTimecCs|jj|�S)N)r�r�)ror�r7r7r8�
formatMessage$szFormatter.formatMessagecCs|S)Nr7)rorbr7r7r8�formatStack'szFormatter.formatStackcCs�|j�|_|j�r"|j||j�|_|j|�}|jrF|jsF|j	|j�|_|jrn|dd�dkrd|d}||j}|j
r�|dd�dkr�|d}||j|j
�}|S)NrOr�r�r�)rv�messager�r�r��asctimer�rArar�rbr�)ror�r�r7r7r8r�4s 


zFormatter.format)NNr�)N)rwrxryrQZ	localtimer�rtr�r�r�r�r�r�r�r�r7r7r7r8r�s+


c@s.eZdZd
dd�Zdd�Zdd�Zdd	�ZdS)rNcCs|r||_nt|_dS)N)�linefmt�_defaultFormatter)ror�r7r7r8rt]szBufferingFormatter.__init__cCsdS)Nr}r7)ro�recordsr7r7r8�formatHeadergszBufferingFormatter.formatHeadercCsdS)Nr}r7)ror�r7r7r8�formatFootermszBufferingFormatter.formatFootercCsNd}t|�dkrJ||j|�}x|D]}||jj|�}q$W||j|�}|S)Nr}r)rTr�r�r�r�)ror�rJr�r7r7r8r�ss
zBufferingFormatter.format)N)rwrxryrtr�r�r�r7r7r7r8rYs

c@seZdZddd�Zdd�ZdS)r
r}cCs||_t|�|_dS)N)rRrT�nlen)rorRr7r7r8rt�szFilter.__init__cCsJ|jdkrdS|j|jkrdS|jj|jd|j�dkr:dS|j|jdkS)NrTF�.)r�rRr�)ror�r7r7r8�filter�s
z
Filter.filterN)r})rwrxryrtr�r7r7r7r8r
�s
c@s,eZdZdd�Zdd�Zdd�Zdd�Zd	S)
�FilterercCs
g|_dS)N)�filters)ror7r7r8rt�szFilterer.__init__cCs||jkr|jj|�dS)N)r��append)ror�r7r7r8�	addFilter�s
zFilterer.addFiltercCs||jkr|jj|�dS)N)r��remove)ror�r7r7r8�removeFilter�s
zFilterer.removeFiltercCs@d}x6|jD],}t|d�r&|j|�}n||�}|sd}PqW|S)NTr�F)r�rmr�)ror�rJ�fr6r7r7r8r��s
zFilterer.filterN)rwrxryrtr�r�r�r7r7r7r8r��sr�c
CsFttt}}}|rB|rB|rB|�z||kr6|j|�Wd|�XdS)N)r9r:�_handlerListr�)�wrrMrN�handlersr7r7r8�_removeHandlerRef�sr�c
Cs*t�ztjtj|t��Wdt�XdS)N)r9r�r��weakref�refr�r:)Zhandlerr7r7r8�_addHandlerRef�sr�c@s�eZdZefdd�Zdd�Zdd�Zeee�Zdd�Z	d	d
�Z
dd�Zd
d�Zdd�Z
dd�Zdd�Zdd�Zdd�Zdd�Zdd�Zdd�ZdS) rcCs4tj|�d|_t|�|_d|_t|�|j�dS)N)r�rt�_namerKr5�	formatterr��
createLock)ror5r7r7r8rts

zHandler.__init__cCs|jS)N)r�)ror7r7r8�get_nameszHandler.get_namec
Cs<t�z(|jtkrt|j=||_|r,|t|<Wdt�XdS)N)r9r��	_handlersr:)rorRr7r7r8�set_names
zHandler.set_namecCstrtj�|_nd|_dS)N)rh�RLock�lock)ror7r7r8r� szHandler.createLockcCs|jr|jj�dS)N)r�rM)ror7r7r8rM)szHandler.acquirecCs|jr|jj�dS)N)r�rN)ror7r7r8rN0szHandler.releasecCst|�|_dS)N)rKr5)ror5r7r7r8�setLevel7szHandler.setLevelcCs|jr|j}nt}|j|�S)N)r�r�r�)ror�r�r7r7r8r�=szHandler.formatcCstd��dS)Nz.emit must be implemented by Handler subclasses)�NotImplementedError)ror�r7r7r8�emitJszHandler.emitc
Cs4|j|�}|r0|j�z|j|�Wd|j�X|S)N)r�rMr�rN)ror�rJr7r7r8�handleTs	

zHandler.handlecCs
||_dS)N)r�)ror�r7r7r8�setFormatterfszHandler.setFormattercCsdS)Nr7)ror7r7r8�flushlsz
Handler.flushc
Cs0t�z|jr |jtkr t|j=Wdt�XdS)N)r9r�r�r:)ror7r7r8r�us

z
Handler.closecCstotj�rtj�\}}}z�y�tjjd�tj|||dtj�tjjd�|j}x&|rvtj	j
|jj�t
dkrv|j}qRW|r�tj|tjd�ntjjd|j|jf�ytjjd|j|jf�Wn tk
r�tjjd�YnXWntk
r�YnXWd~~~XdS)Nz--- Logging error ---
zCall stack:
r)�filezLogged from file %s, line %s
zMessage: %r
Arguments: %s
zwUnable to print the message and arguments - possible formatting error.
Use the traceback above to help find the error.
)r,r=�stderrrA�writer�r�rBrZr[�dirname�f_code�co_filename�__path__rC�print_stackr]rcrSrWr@�OSError)ror�r��vr��framer7r7r8�handleError�s.


zHandler.handleErrorcCst|j�}d|jj|fS)Nz	<%s (%s)>)rr5�	__class__rw)ror5r7r7r8rz�s
zHandler.__repr__N)rwrxryrrtr�r��propertyrRr�rMrNr�r�r�r�r�r�r�r�rzr7r7r7r8r�s 	

	

	-c@s2eZdZdZddd�Zdd�Zdd�Zd	d
�ZdS)rr�NcCs"tj|�|dkrtj}||_dS)N)rrtr=r��stream)ror�r7r7r8rt�s
zStreamHandler.__init__c
Cs8|j�z |jr&t|jd�r&|jj�Wd|j�XdS)Nr�)rMr�rmr�rN)ror7r7r8r��s
zStreamHandler.flushcCsVy2|j|�}|j}|j|�|j|j�|j�Wntk
rP|j|�YnXdS)N)r�r�r��
terminatorr�r@r�)ror�rSr�r7r7r8r��s

zStreamHandler.emitcCs6t|j�}t|jdd�}|r$|d7}d|jj||fS)NrRr}� z<%s %s(%s)>)rr5�getattrr�r�rw)ror5rRr7r7r8rz�s

zStreamHandler.__repr__)N)rwrxryr�rtr�r�rzr7r7r7r8r�s

c@s6eZdZddd�Zdd�Zdd	�Zd
d�Zdd
�ZdS)r	�aNFcCsTtj|�}tjj|�|_||_||_||_|r@tj	|�d|_
ntj	||j��dS)N)
rZ�fspathr[�abspath�baseFilename�mode�encoding�delayrrtr�r�_open)ror]r�r�r�r7r7r8rt�s

zFileHandler.__init__cCsb|j�zJz8|jr@z|j�Wd|j}d|_t|d�r>|j�XWdtj|�XWd|j�XdS)Nr�)rMr�r�rmr�rrN)ror�r7r7r8r�
s
zFileHandler.closecCst|j|j|jd�S)N)r�)�openr�r�r�)ror7r7r8r� szFileHandler._opencCs$|jdkr|j�|_tj||�dS)N)r�r�rr�)ror�r7r7r8r�'s

zFileHandler.emitcCst|j�}d|jj|j|fS)Nz<%s %s (%s)>)rr5r�rwr�)ror5r7r7r8rz2s
zFileHandler.__repr__)r�NF)rwrxryrtr�r�r�rzr7r7r7r8r	�s

c@s$eZdZefdd�Zedd��ZdS)�_StderrHandlercCstj||�dS)N)rrt)ror5r7r7r8rt=sz_StderrHandler.__init__cCstjS)N)r=r�)ror7r7r8r�Csz_StderrHandler.streamN)rwrxryrrtr�r�r7r7r7r8r�7sr�c@seZdZdd�Zdd�ZdS)�PlaceHoldercCs|di|_dS)N)�	loggerMap)ro�aloggerr7r7r8rtUszPlaceHolder.__init__cCs||jkrd|j|<dS)N)r�)ror�r7r7r8r�[s
zPlaceHolder.appendN)rwrxryrtr�r7r7r7r8r�Osr�cCs(|tkr t|t�s td|j��|adS)Nz(logger not derived from logging.Logger: )r�
issubclassrIrw�_loggerClass)�klassr7r7r8r%fs


cCstS)N)r�r7r7r7r8r!ssc@s<eZdZdd�Zdd�Zdd�Zdd�Zd	d
�Zdd�Zd
S)�ManagercCs(||_d|_d|_i|_d|_d|_dS)NrF)�rootr�emittedNoHandlerWarning�
loggerDict�loggerClass�logRecordFactory)roZrootnoder7r7r8rt~szManager.__init__c
Cs�d}t|t�std��t�z�||jkrv|j|}t|t�r�|}|jpHt|�}||_||j|<|j	||�|j
|�n(|jp~t|�}||_||j|<|j
|�Wdt�X|S)NzA logger name must be a string)rErGrIr9r�r�r�r��manager�_fixupChildren�
_fixupParentsr:)rorRrJ�phr7r7r8r �s(





zManager.getLoggercCs*|tkr t|t�s td|j��||_dS)Nz(logger not derived from logging.Logger: )rr�rIrwr�)ror�r7r7r8r%�s


zManager.setLoggerClasscCs
||_dS)N)r�)ror|r7r7r8r*�szManager.setLogRecordFactorycCs�|j}|jd�}d}xn|dkr�|r�|d|�}||jkrJt|�|j|<n$|j|}t|t�rd|}n
|j|�|jdd|d�}qW|s�|j}||_dS)Nr�rrO)	rR�rfindr�r�rErr�r��parent)ror�rR�irJZsubstr�objr7r7r8r��s




zManager._fixupParentscCsH|j}t|�}x4|jj�D]&}|jjd|�|kr|j|_||_qWdS)N)rRrTr�r�r�)ror�r�rRZnamelen�cr7r7r8r��szManager._fixupChildrenN)	rwrxryrtr r%r*r�r�r7r7r7r8r�ys"
r�c@s�eZdZefdd�Zdd�Zdd�Zdd�Zd	d
�Zdd�Z	d
d�Z
dd�dd�Zdd�ZeZ
dd�Zd1dd�Zd2dd�Zd3dd�Zdd �Zd!d"�Zd#d$�Zd%d&�Zd'd(�Zd)d*�Zd+d,�Zd-d.�Zd/d0�ZdS)4rcCs6tj|�||_t|�|_d|_d|_g|_d|_dS)NTF)	r�rtrRrKr5r��	propagater��disabled)rorRr5r7r7r8rt�s

zLogger.__init__cCst|�|_dS)N)rKr5)ror5r7r7r8r�szLogger.setLevelcOs |jt�r|jt||f|�dS)N)�isEnabledForr�_log)rorSrWrrr7r7r8rs	
zLogger.debugcOs |jt�r|jt||f|�dS)N)rr
r)rorSrWrrr7r7r8r"s	
zLogger.infocOs |jt�r|jt||f|�dS)N)rrr)rorSrWrrr7r7r8r(s	
zLogger.warningcOs$tjdtd�|j|f|�|�dS)Nz6The 'warn' method is deprecated, use 'warning' insteadr?)�warningsr'�DeprecationWarningr()rorSrWrrr7r7r8r'*szLogger.warncOs |jt�r|jt||f|�dS)N)rrr)rorSrWrrr7r7r8r/s	
zLogger.errorT)rAcOs|j|f|�d|i|��dS)NrA)r)rorSrArWrrr7r7r8r;szLogger.exceptioncOs |jt�r|jt||f|�dS)N)rrr)rorSrWrrr7r7r8rAs	
zLogger.criticalcOs<t|t�strtd��ndS|j|�r8|j|||f|�dS)Nzlevel must be an integer)rErFr,rIrr)ror5rSrWrrr7r7r8r#Os	


z
Logger.logFcCs�t�}|dk	r|j}d	}x�t|d�r�|j}tjj|j�}|tkrH|j}qd}|r�t	j
�}|jd�tj
||d�|j�}|d
dkr�|dd�}|j�|j|j|j|f}PqW|S)N�(unknown file)r�(unknown function)r�zStack (most recent call last):
)r�rOr�)rrr	Nr�r�)rDrCrmr�rZr[�normcaser��_srcfiler�r�r�r�r�r�r��f_lineno�co_name)rorbr�rJ�cor]rqr�r7r7r8�
findCaller`s,
zLogger.findCallerNc

Cs^t|||||||||
�	}|	dk	rZx8|	D]0}|dks<||jkrHtd|��|	||j|<q&W|S)Nr�r�z$Attempt to overwrite %r in LogRecord)r�r�)r{r~�KeyError)
rorRr5�fn�lnorSrWrArp�extrarqrJ�keyr7r7r8�
makeRecord~s
zLogger.makeRecordcCs�d}tr@y|j|�\}}	}
}WqJtk
r<d\}}	}
YqJXn
d\}}	}
|r|t|t�rjt|�||jf}nt|t�s|tj	�}|j
|j|||	||||
||�
}|j|�dS)N�(unknown file)r�(unknown function))rrr)rrr)
rrrHrE�
BaseException�type�
__traceback__�tupler=rArrRr�)ror5rSrWrArrbrqrrrpr�r7r7r8r�s


zLogger._logcCs |jr|j|�r|j|�dS)N)rr��callHandlers)ror�r7r7r8r��sz
Logger.handlec
Cs.t�z||jkr|jj|�Wdt�XdS)N)r9r�r�r:)ro�hdlrr7r7r8�
addHandler�s

zLogger.addHandlerc
Cs.t�z||jkr|jj|�Wdt�XdS)N)r9r�r�r:)rorr7r7r8�
removeHandler�s

zLogger.removeHandlercCs2|}d}x$|r,|jrd}P|js$Pq
|j}q
W|S)NFT)r�rr�)rorrJr7r7r8�hasHandlers�s

zLogger.hasHandlerscCs�|}d}xH|rPx,|jD]"}|d}|j|jkr|j|�qW|jsHd}q
|j}q
W|dkr�trv|jtjkr�tj|�n(tr�|jj	r�t
jjd|j
�d|j_	dS)NrrOz+No handlers could be found for logger "%s"
T)r�rXr5r�rr�r+r,r�r�r=r�r�rR)ror�r�foundrr7r7r8r�s$


zLogger.callHandlerscCs$|}x|r|jr|jS|j}qWtS)N)r5r�r)ro�loggerr7r7r8�getEffectiveLevel�s
zLogger.getEffectiveLevelcCs|jj|krdS||j�kS)NF)r�rr#)ror5r7r7r8rszLogger.isEnabledForcCs&|j|k	rdj|j|f�}|jj|�S)Nr�)r�r�rRr�r )ro�suffixr7r7r8�getChilds
zLogger.getChildcCs t|j��}d|jj|j|fS)Nz<%s %s (%s)>)rr#r�rwrR)ror5r7r7r8rz#szLogger.__repr__)F)NNN)NNF)rwrxryrrtr�rr"r(r'rrrrr#rrrr�rrr rr#rr%rzr7r7r7r8r�s.



c@seZdZdd�ZdS)�
RootLoggercCstj|d|�dS)Nr�)rrt)ror5r7r7r8rt.szRootLogger.__init__N)rwrxryrtr7r7r7r8r&(sr&c@s�eZdZdd�Zdd�Zdd�Zdd�Zd	d
�Zdd�Zd
d�Z	dd�dd�Z
dd�Zdd�Zdd�Z
dd�Zdd�Zdd�Zd*d!d"�Zed#d$��Zejd%d$��Zed&d'��Zd(d)�ZdS)+rcCs||_||_dS)N)r"r)ror"rr7r7r8rt<szLoggerAdapter.__init__cCs|j|d<||fS)Nr)r)rorSrrr7r7r8rnJs

zLoggerAdapter.processcOs|jt|f|�|�dS)N)r#r)rorSrWrrr7r7r8rZszLoggerAdapter.debugcOs|jt|f|�|�dS)N)r#r
)rorSrWrrr7r7r8r"`szLoggerAdapter.infocOs|jt|f|�|�dS)N)r#r)rorSrWrrr7r7r8r(fszLoggerAdapter.warningcOs$tjdtd�|j|f|�|�dS)Nz6The 'warn' method is deprecated, use 'warning' insteadr?)rr'rr()rorSrWrrr7r7r8r'lszLoggerAdapter.warncOs|jt|f|�|�dS)N)r#r)rorSrWrrr7r7r8rqszLoggerAdapter.errorT)rAcOs |jt|f|�d|i|��dS)NrA)r#r)rorSrArWrrr7r7r8rwszLoggerAdapter.exceptioncOs|jt|f|�|�dS)N)r#r)rorSrWrrr7r7r8r}szLoggerAdapter.criticalcOs4|j|�r0|j||�\}}|jj||f|�|�dS)N)rrnr"r#)ror5rSrWrrr7r7r8r#�s
zLoggerAdapter.logcCs|jjj|krdS||j�kS)NF)r"r�rr#)ror5r7r7r8r�szLoggerAdapter.isEnabledForcCs|jj|�dS)N)r"r�)ror5r7r7r8r��szLoggerAdapter.setLevelcCs
|jj�S)N)r"r#)ror7r7r8r#�szLoggerAdapter.getEffectiveLevelcCs
|jj�S)N)r"r )ror7r7r8r �szLoggerAdapter.hasHandlersNFcCs|jj||||||d�S)N)rArrb)r"r)ror5rSrWrArrbr7r7r8r�szLoggerAdapter._logcCs|jjS)N)r"r�)ror7r7r8r��szLoggerAdapter.managercCs||j_dS)N)r"r�)ro�valuer7r7r8r��scCs|jjS)N)r"rR)ror7r7r8rR�szLoggerAdapter.namecCs&|j}t|j��}d|jj|j|fS)Nz<%s %s (%s)>)r"rr#r�rwrR)ror"r5r7r7r8rz�szLoggerAdapter.__repr__)NNF)rwrxryrtrnrr"r(r'rrrr#rr�r#r rr�r��setterrRrzr7r7r7r8r6s&	

c
Ks�t��zjttj�dk�rp|jdd�}|dkrHd|kr`d|kr`td��nd|ksXd|kr`td��|dkr�|jdd�}|jdd�}|r�t||�}n|jdd�}t|�}|g}|jd	d�}|jd
d�}|tkr�tdd
j	tj
����|jdt|d�}t|||�}	x.|D]&}|jdk�r |j
|	�tj|��qW|jdd�}
|
dk	�rPtj|
�|�rpdj	|j
��}td|��Wdt�XdS)Nrr�r�r]z8'stream' and 'filename' should not be specified togetherzG'stream' or 'filename' should not be specified together with 'handlers'�filemoder�r�r�r�zStyle must be one of: %sr�r�rOr5z, zUnrecognised argument(s): %s)r9rTr�r��poprHr	rr�r�r�rr�r�rr�r:)rrr�r]r��hr�Zdfsr�Zfsr�r5r�r7r7r8r�sF4




cCs|rtjj|�StSdS)N)rr�r r�)rRr7r7r8r .scOs*ttj�dkrt�tj|f|�|�dS)Nr)rTr�r�rr)rSrWrrr7r7r8r9scOs*ttj�dkrt�tj|f|�|�dS)Nr)rTr�r�rr)rSrWrrr7r7r8rEs)rAcOst|f|�d|i|��dS)NrA)r)rSrArWrrr7r7r8rOscOs*ttj�dkrt�tj|f|�|�dS)Nr)rTr�r�rr()rSrWrrr7r7r8r(WscOs"tjdtd�t|f|�|�dS)Nz8The 'warn' function is deprecated, use 'warning' insteadr?)rr'rr()rSrWrrr7r7r8r'ascOs*ttj�dkrt�tj|f|�|�dS)Nr)rTr�r�rr")rSrWrrr7r7r8r"fscOs*ttj�dkrt�tj|f|�|�dS)Nr)rTr�r�rr)rSrWrrr7r7r8rpscOs,ttj�dkrt�tj||f|�|�dS)Nr)rTr�r�rr#)r5rSrWrrr7r7r8r#zscCs|tj_dS)N)r�r�r)r5r7r7r8r�scCs�x�t|dd��D]l}yT|�}|rhz:y|j�|j�|j�Wnttfk
rXYnXWd|j�XWqtrx�YqXqWdS)N)�reversedrMr�r�r�rHrNr,)ZhandlerListr�r+r7r7r8r&�s
c@s$eZdZdd�Zdd�Zdd�ZdS)rcCsdS)Nr7)ror�r7r7r8r��szNullHandler.handlecCsdS)Nr7)ror�r7r7r8r��szNullHandler.emitcCs
d|_dS)N)r�)ror7r7r8r��szNullHandler.createLockN)rwrxryr�r�r�r7r7r7r8r�s
cCs`|dk	r$tdk	r\t||||||�n8tj|||||�}td�}|jsP|jt��|jd|�dS)Nzpy.warningsz%s)�_warnings_showwarningr�
formatwarningr r�rrr()r��categoryr]rcr��liner�r"r7r7r8�_showwarning�sr1cCs0|rtdkr,tjatt_ntdk	r,tt_dadS)N)r-r�showwarningr1)Zcapturer7r7r8r�s)N)NN)fr=rZrQr�r�rr�rU�stringr�__all__rh�ImportError�
__author__Z
__status__�__version__Z__date__rfr,rgrjrlrrrrrr
rrr2r4rrrmrDr[r
�__code__r�rrKr�rLr9r:�objectrr{r*r)r$r�r�r�rr�rr�rr
r��WeakValueDictionaryr�r�r�r�rrr	r�Z_defaultLastResortr+r�r%r!r�rr&r�rr�r�rr rrrrr(r'r"rr#rr&�atexit�registerrr-r1rr7r7r7r8�<module>s�@






	



	i
	.*%4
>;E
lEb








__pycache__/config.cpython-36.opt-1.pyc000064400000055456150327210640013625 0ustar003


 \Ќ�
@stdZddlZddlZddlZddlZddlZddlZddlZddlZyddl	Z
ddlZWnek
rpdZ
YnXddl
mZmZdZejZdad+dd�Zdd	�Zd
d�Zdd
�Zdd�Zdd�Zdd�Zdd�Zejdej�Zdd�ZGdd�de �Z!Gdd�de"e!�Z#Gdd�de$e!�Z%Gdd �d e&e!�Z'Gd!d"�d"e �Z(Gd#d$�d$e(�Z)e)Z*d%d&�Z+edfd'd(�Z,d)d*�Z-dS),a
Configuration functions for the logging package for Python. The core package
is based on PEP 282 and comments thereto in comp.lang.python, and influenced
by Apache's log4j system.

Copyright (C) 2001-2014 Vinay Sajip. All Rights Reserved.

To use, simply 'import logging' and log away!
�N)�ThreadingTCPServer�StreamRequestHandleriF#Tc
Cs�ddl}t||j�r|}n*|j|�}t|d�r:|j|�n
|j|�t|�}tj	�z t
�t||�}t|||�Wdtj
�XdS)aD
    Read the logging configuration from a ConfigParser-format file.

    This can be called several times from an application, allowing an end user
    the ability to select from various pre-canned configurations (if the
    developer provides a mechanism to present the choices and load the chosen
    configuration).
    rN�readline)�configparser�
isinstanceZRawConfigParserZConfigParser�hasattrZ	read_file�read�_create_formatters�logging�_acquireLock�_clearExistingHandlers�_install_handlers�_install_loggers�_releaseLock)ZfnameZdefaults�disable_existing_loggersr�cp�
formatters�handlers�r�&/usr/lib64/python3.6/logging/config.py�
fileConfig8s	



rcCsp|jd�}|jd�}t|�}xN|D]F}|d|}yt||�}Wq"tk
rft|�t||�}Yq"Xq"W|S)z)Resolve a dotted name to a global object.�.r)�split�pop�
__import__�getattr�AttributeError)�name�used�found�nrrr�_resolveZs


r!cCstdd�|�S)NcSs|j�S)N)�strip)�xrrr�<lambda>isz_strip_spaces.<locals>.<lambda>)�map)Zalistrrr�
_strip_spaceshsr&cCs�|dd}t|�siS|jd�}t|�}i}x~|D]v}d|}|j|dddd�}|j|d	ddd�}|j|d
ddd�}tj}||jd�}	|	r�t|	�}||||�}
|
||<q4W|S)
zCreate and return formattersr�keys�,zformatter_%s�formatTN)�raw�fallback�datefmt�style�%�class)�lenrr&�getr
�	Formatterr!)rZflistrZformZsectnameZfsZdfsZstl�c�
class_name�frrrr	ks$

r	c
CsD|dd}t|�siS|jd�}t|�}i}g}x�|D]�}|d|}|d}|jdd�}yt|tt��}Wn ttfk
r�t	|�}YnX|d}	t|	tt��}	||	�}
d	|kr�|d	}|
j
|�t|�r�|
j||�t|tj
j��r|jd
d�}t|��r|j|
|f�|
||<q8Wx |D]\}
}
|
j||
��q$W|S)zInstall and return handlersrr'r(z
handler_%sr/�	formatter��args�level�target)r0rr&r1�eval�varsr
r�	NameErrorr!�setLevel�setFormatter�
issubclassr�
MemoryHandler�appendZ	setTarget)rr�hlistrZfixups�hand�section�klass�fmtr8�hr9r:�trrrr
�s>



r
cCsHtj}x<|D]4}|jj|}||kr:tj|_g|_d|_q||_qWdS)a�
    When (re)configuring logging, handle loggers which were in the previous
    configuration but are not in the new configuration. There's no point
    deleting them as other threads may continue to hold references to them;
    and by disabling them, you stop them doing any logging.

    However, don't disable children of named loggers, as that's probably not
    what was intended by the user. Also, allow existing loggers to NOT be
    disabled if disable_existing is false.
    TN)	r
�root�manager�
loggerDictZNOTSETr9r�	propagate�disabled)�existing�
child_loggers�disable_existingrJ�log�loggerrrr�_handle_existing_loggers�s
rTcCs,|dd}|jd�}ttdd�|��}|jd�|d}tj}|}d|kr^|d}|j|�x |jd	d	�D]}|j|�qnW|d
}	t	|	�r�|	jd�}	t
|	�}	x|	D]}
|j||
�q�Wt|jj
j��}|j�g}�x>|D�]4}|d|}|d}
|jd
dd�}tj|
�}|
|k�r�|j|
�d}|
d}t	|�}t	|�}x<||k�r�||d	|�|k�rt|j||�|d7}�qFW|j|
�d|k�r�|d}|j|�x"|jd	d	�D]}|j|��q�W||_d|_|d
}	t	|	�r�|	jd�}	t
|	�}	x|	D]}
|j||
��qWq�Wt|||�d	S)zCreate and install loggers�loggersr'r(cSs|j�S)N)r")r#rrrr$�sz"_install_loggers.<locals>.<lambda>rJZlogger_rootr9Nrz	logger_%s�qualnamerM�)r+rr)r�listr%�remover
rJr>r�
removeHandlerr0r&�
addHandlerrKrLr'�sortZgetint�	getLogger�indexrBrMrNrT)rrrQZllistrErJrRr9rHrCrDrOrPZqnrMrS�i�prefixed�pflen�num_existingrrrr�sd











rcCs.tjj�tjtjdd��tjdd�=dS)z!Clear and close existing handlersN)r
�	_handlers�clearZshutdownZ_handlerListrrrrrs
rz^[a-z_][a-z0-9_]*$cCstj|�}|std|��dS)Nz!Not a valid Python identifier: %rT)�
IDENTIFIER�match�
ValueError)�s�mrrr�valid_idents
rjc@s"eZdZdZddd�Zdd�ZdS)	�ConvertingMixinz?For ConvertingXXX's, this mixin class provides common functionsTcCsB|jj|�}||k	r>|r |||<t|�tttfkr>||_||_|S)N)�configurator�convert�type�ConvertingDict�ConvertingList�ConvertingTuple�parent�key)�selfrs�value�replace�resultrrr�convert_with_key$s
z ConvertingMixin.convert_with_keycCs0|jj|�}||k	r,t|�tttfkr,||_|S)N)rlrmrnrorprqrr)rtrurwrrrrm0s
zConvertingMixin.convertN)T)�__name__�
__module__�__qualname__�__doc__rxrmrrrrrk!s
rkc@s,eZdZdZdd�Zd	dd�Zd
dd�ZdS)roz A converting dictionary wrapper.cCstj||�}|j||�S)N)�dict�__getitem__rx)rtrsrurrrr~EszConvertingDict.__getitem__NcCstj|||�}|j||�S)N)r}r1rx)rtrs�defaultrurrrr1IszConvertingDict.getcCstj|||�}|j||dd�S)NF)rv)r}rrx)rtrsrrurrrrMszConvertingDict.pop)N)N)ryrzr{r|r~r1rrrrrroBs
roc@s"eZdZdZdd�Zd	dd�ZdS)
rpzA converting list wrapper.cCstj||�}|j||�S)N)rXr~rx)rtrsrurrrr~SszConvertingList.__getitem__rWcCstj||�}|j|�S)N)rXrrm)rt�idxrurrrrWszConvertingList.popN���)r�)ryrzr{r|r~rrrrrrpQsrpc@seZdZdZdd�ZdS)rqzA converting tuple wrapper.cCstj||�}|j||dd�S)NF)rv)�tupler~rx)rtrsrurrrr~]szConvertingTuple.__getitem__N)ryrzr{r|r~rrrrrq[srqc@s�eZdZdZejd�Zejd�Zejd�Zejd�Z	ejd�Z
ddd	�Zee
�Zd
d�Zdd
�Zdd�Zdd�Zdd�Zdd�Zdd�ZdS)�BaseConfiguratorzI
    The configurator base class which defines some useful defaults.
    z%^(?P<prefix>[a-z]+)://(?P<suffix>.*)$z^\s*(\w+)\s*z^\.\s*(\w+)\s*z^\[\s*(\w+)\s*\]\s*z^\d+$�ext_convert�cfg_convert)ZextZcfgcCst|�|_||j_dS)N)ro�configrl)rtr�rrr�__init__vs
zBaseConfigurator.__init__c	Cs�|jd�}|jd�}y`|j|�}xP|D]H}|d|7}yt||�}Wq&tk
rl|j|�t||�}Yq&Xq&W|Stk
r�tj�dd�\}}td||f�}|||_	|_
|�YnXdS)z`
        Resolve strings to objects using standard import and attribute
        syntax.
        rrrWNzCannot resolve %r: %s)rr�importerrr�ImportError�sys�exc_inforg�	__cause__�
__traceback__)	rtrhrrrZfrag�e�tb�vrrr�resolvezs"




zBaseConfigurator.resolvecCs
|j|�S)z*Default converter for the ext:// protocol.)r�)rtrurrrr��szBaseConfigurator.ext_convertcCs|}|jj|�}|dkr&td|��n�||j�d�}|j|j�d}x�|r�|jj|�}|rp||j�d}nd|jj|�}|r�|j�d}|jj|�s�||}n2yt	|�}||}Wnt
k
r�||}YnX|r�||j�d�}qJtd||f��qJW|S)z*Default converter for the cfg:// protocol.NzUnable to convert %rrzUnable to convert %r at %r)�WORD_PATTERNrfrg�endr��groups�DOT_PATTERN�
INDEX_PATTERN�
DIGIT_PATTERN�int�	TypeError)rtru�restri�dr�r rrrr��s2
zBaseConfigurator.cfg_convertcCs�t|t�r&t|t�r&t|�}||_n�t|t�rLt|t�rLt|�}||_n|t|t�rrt|t�rrt|�}||_nVt|t�r�|j	j
|�}|r�|j�}|d}|jj
|d�}|r�|d}t||�}||�}|S)z�
        Convert values to an appropriate type. dicts, lists and tuples are
        replaced by their converting alternatives. Strings are checked to
        see if they have a conversion format and are converted if they do.
        �prefixN�suffix)rror}rlrprXrqr��str�CONVERT_PATTERNrf�	groupdict�value_convertersr1r)rtrurir�r�Z	converterr�rrrrm�s*


zBaseConfigurator.convertcsr�jd�}t|�s|j|�}�jdd�}t�fdd��D��}|f|�}|rnx |j�D]\}}t|||�qVW|S)z1Configure an object with a user-supplied factory.z()rNcs g|]}t|�r|�|f�qSr)rj)�.0�k)r�rr�
<listcomp>�sz5BaseConfigurator.configure_custom.<locals>.<listcomp>)r�callabler�r}�items�setattr)rtr�r3�props�kwargsrwrrur)r�r�configure_custom�s


z!BaseConfigurator.configure_customcCst|t�rt|�}|S)z0Utility function which converts lists to tuples.)rrXr�)rtrurrr�as_tuple�s
zBaseConfigurator.as_tupleN)ryrzr{r|�re�compiler�r�r�r�r�r��staticmethodrr�r�r�r�r�rmr�r�rrrrr�bs 




"r�c@s^eZdZdZdd�Zdd�Zdd�Zdd	�Zd
d�Zdd
�Z	ddd�Z
ddd�Zddd�ZdS)�DictConfiguratorz]
    Configure logging using a dictionary-like object to describe the
    configuration.
    cCs�|j}d|krtd��|ddkr2td|d��|jdd�}i}tj��z�|�r�|jd|�}x�|D]�}|tjkr�td|��qfy6tj|}||}|jd	d
�}|r�|jtj|��Wqft	k
r�}	ztd||	f��WYd
d
}	~	XqfXqfW|jd|�}
xZ|
D]R}y|j
||
|d
�Wn4t	k
�rP}	ztd||	f��WYd
d
}	~	XnX�qW|jdd
�}|�r�y|j|d
�Wn0t	k
�r�}	ztd|	��WYd
d
}	~	XnX�n:|jdd
�}t�|jd|�}
xZ|
D]R}y|j
|
|�|
|<Wn4t	k
�r"}	ztd||	f��WYd
d
}	~	XnX�q�W|jd|�}xZ|D]R}y|j||�||<Wn4t	k
�r�}	ztd||	f��WYd
d
}	~	XnX�q<W|jd|�}g}x�t|�D]v}y |j||�}||_|||<WnNt	k
�r}	z0dt|	�k�r�|j|�ntd||	f��WYd
d
}	~	XnX�q�Wxd|D]\}y |j||�}||_|||<Wn4t	k
�r�}	ztd||	f��WYd
d
}	~	XnX�q,Wtj}t|jjj��}|j�g}|jd|�}
x�|
D]�}||k�r<|j|�d}|d}t|�}t|�}x<||k�r0||d
|�|k�r$|j||�|d7}�q�W|j|�y|j
||
|�Wn4t	k
�r�}	ztd||	f��WYd
d
}	~	XnX�q�Wt|||�|jdd
�}|�r�y|j|�Wn0t	k
�r�}	ztd|	��WYd
d
}	~	XnXWd
tj�Xd
S)zDo the configuration.�versionz$dictionary doesn't specify a versionrWzUnsupported version: %s�incrementalFrzNo handler found with name %rr9Nz"Unable to configure handler %r: %srUTz!Unable to configure logger %r: %srJz#Unable to configure root logger: %srrz$Unable to configure formatter %r: %s�filtersz!Unable to configure filter %r: %sztarget not configured yetr)r�rgrr
rr1rcr>�_checkLevel�	Exception�configure_logger�configure_rootr�configure_formatter�configure_filter�sorted�configure_handlerrr�rBrJrXrKrLr'r\r^r0rYrTr)rtr�r�Z
EMPTY_DICTrr�handlerZhandler_configr9r�rUrJrQrr�ZdeferredrOrPr_r`rarbrrr�	configure�s�



"
$
$
$$
$


$zDictConfigurator.configurec
Cs�d|krr|d}y|j|�}Wq�tk
rn}z4dt|�kr>�|jd�|d<||d<|j|�}WYdd}~Xq�XnP|jdd�}|jdd�}|jdd�}|jd	d�}|s�tj}	nt|�}	|	|||�}|S)
z(Configure a formatter from a dictionary.z()z'format'r)rGNr,r-r.r/)r�r�r�rr1r
r2r!)
rtr��factoryrw�terGZdfmtr-�cnamer3rrrr��s&z$DictConfigurator.configure_formattercCs.d|kr|j|�}n|jdd�}tj|�}|S)z%Configure a filter from a dictionary.z()rr7)r�r1r
ZFilter)rtr�rwrrrrr��s

z!DictConfigurator.configure_filtercCs^xX|D]P}y|j|jd|�Wqtk
rT}ztd||f��WYdd}~XqXqWdS)z/Add filters to a filterer from a list of names.r�zUnable to add filter %r: %sN)Z	addFilterr�r�rg)rtZfiltererr�r5r�rrr�add_filters�s

zDictConfigurator.add_filtersc/s�t��}�jdd�}|r^y|jd|}Wn2tk
r\}ztd||f��WYdd}~XnX�jdd�}�jdd�}d�kr��jd�}t|�s�|j|�}|}�n�jd�}	|j|	�}
t|
tj	j
�o�d	�k�rHy>|jd
�d	}t|tj��s�j
|�td��|�d	<Wn8tk
�rD}ztd�d	|f��WYdd}~XnXnZt|
tj	j��rvd
�k�rv|j�d
��d
<n,t|
tj	j��r�d�k�r�|j�d��d<|
}�jdd�}t�fdd��D��}
y|f|
�}WnLtk
�r"}z.dt|�k�r��|
jd�|
d<|f|
�}WYdd}~XnX|�r4|j|�|dk	�rN|jtj|��|�r`|j||�|�r�x"|j�D]\}}t|||��qpW|S)z&Configure a handler from a dictionary.r6NrzUnable to set formatter %r: %sr9r�z()r/r:rztarget not configured yetz#Unable to set target handler %r: %sZmailhostZaddressrcs g|]}t|�r|�|f�qSr)rj)r�r�)r�rrr��sz6DictConfigurator.configure_handler.<locals>.<listcomp>z'stream'�streamZstrm)r}rr�r�rgr�r�r@r
rrArZHandler�updater�ZSMTPHandlerr�Z
SysLogHandlerr�r?r>r�r�r�r�)rtr�Zconfig_copyr6r�r9r�r3r�r�rFZthr�r�rwr�rrur)r�rr��sl





$



z"DictConfigurator.configure_handlercCs^xX|D]P}y|j|jd|�Wqtk
rT}ztd||f��WYdd}~XqXqWdS)z.Add handlers to a logger from a list of names.rzUnable to add handler %r: %sN)r[r�r�rg)rtrSrrHr�rrr�add_handlers�s

zDictConfigurator.add_handlersFcCs�|jdd�}|dk	r$|jtj|��|s�x |jdd�D]}|j|�q8W|jdd�}|rf|j||�|jdd�}|r�|j||�dS)zU
        Perform configuration which is common to root and non-root loggers.
        r9Nrr�)r1r>r
r�rrZr�r�)rtrSr�r�r9rHrr�rrr�common_logger_config�sz%DictConfigurator.common_logger_configcCs6tj|�}|j|||�|jdd�}|dk	r2||_dS)z.Configure a non-root logger from a dictionary.rMN)r
r]r�r1rM)rtrr�r�rSrMrrrr�s

z!DictConfigurator.configure_loggercCstj�}|j|||�dS)z*Configure a root logger from a dictionary.N)r
r]r�)rtr�r�rJrrrr�szDictConfigurator.configure_rootN)F)F)F)
ryrzr{r|r�r�r�r�r�r�r�r�r�rrrrr��s	?

r�cCst|�j�dS)z%Configure logging using a dictionary.N)�dictConfigClassr�)r�rrr�
dictConfig sr�csPtstd��Gdd�dt�}Gdd�dt�}G�fdd�dtj���||||�S)au
    Start up a socket server on the specified port, and listen for new
    configurations.

    These will be sent as a file suitable for processing by fileConfig().
    Returns a Thread object on which you can call start() to start the server,
    and which you can join() when appropriate. To stop the server, call
    stopListening().

    Use the ``verify`` argument to verify any bytes received across the wire
    from a client. If specified, it should be a callable which receives a
    single argument - the bytes of configuration data received across the
    network - and it should return either ``None``, to indicate that the
    passed in bytes could not be verified and should be discarded, or a
    byte string which is then passed to the configuration machinery as
    normal. Note that you can return transformed bytes, e.g. by decrypting
    the bytes passed in.
    z listen() needs threading to workc@seZdZdZdd�ZdS)z#listen.<locals>.ConfigStreamHandlerz�
        Handler for a logging configuration request.

        It expects a completely new logging configuration and uses fileConfig
        to install it.
        cSsH�y|j}|jd�}t|�dk�rtjd|�d}|jj|�}x&t|�|krd||j|t|��}q@W|jjdk	r~|jj|�}|dk	r�|jd�}yddl}|j	|�}t
|�WnHtk
r�tj
|�}yt|�Wntk
r�tj�YnXYnX|jj�r|jjj�Wn2tk
�rB}z|jtk�r2�WYdd}~XnXdS)z�
            Handle a request.

            Each request is expected to be a 4-byte length, packed using
            struct.pack(">L", n), followed by the config file.
            Uses fileConfig() to do the grunt work.
            �z>LrNzutf-8)Z
connectionZrecvr0�structZunpack�server�verify�decode�json�loadsr�r��io�StringIOr�	traceback�	print_exc�ready�set�OSError�errno�RESET_ERROR)rtZconn�chunkZslenr�r��filer�rrr�handleBs6




z*listen.<locals>.ConfigStreamHandler.handleN)ryrzr{r|r�rrrr�ConfigStreamHandler;sr�c@s0eZdZdZdZdedddfdd�Zdd�ZdS)	z$listen.<locals>.ConfigSocketReceiverzD
        A simple TCP socket-based logging config receiver.
        rWZ	localhostNcSs>tj|||f|�tj�d|_tj�d|_||_||_dS)NrrW)	rr�r
r�abortr�timeoutr�r�)rt�host�portr�r�r�rrrr�psz-listen.<locals>.ConfigSocketReceiver.__init__cSsfddl}d}xJ|sV|j|jj�ggg|j�\}}}|r>|j�tj�|j}tj�qW|jj	�dS)Nr)
�selectZsocket�filenor�Zhandle_requestr
rr�r�close)rtr�r�Zrd�wrZexrrr�serve_until_stoppedzsz8listen.<locals>.ConfigSocketReceiver.serve_until_stopped)ryrzr{r|Zallow_reuse_address�DEFAULT_LOGGING_CONFIG_PORTr�r�rrrr�ConfigSocketReceiveris
	r�cs&eZdZ��fdd�Zdd�Z�ZS)zlisten.<locals>.Servercs4t�|�j�||_||_||_||_tj�|_dS)N)	�superr��rcvr�hdlrr�r��	threadingZEventr�)rtr�r�r�r�)�Server�	__class__rrr��szlisten.<locals>.Server.__init__cSsZ|j|j|j|j|jd�}|jdkr0|jd|_|jj�tj�|a	tj
�|j�dS)N)r�r�r�r�rrW)r�r�r�r�r�Zserver_addressr�r
r�	_listenerrr�)rtr�rrr�run�s


zlisten.<locals>.Server.run)ryrzr{r�r��
__classcell__r)r�)r�rr��sr�)�thread�NotImplementedErrorrrr�ZThread)r�r�r�r�r)r�r�listen%s.r�c
Cs*tj�ztrdt_daWdtj�XdS)zN
    Stop the listening server which was created with a call to listen().
    rWN)r
rr�r�rrrrr�
stopListening�sr�)NT).r|r�r�r
Zlogging.handlersr�r�r�r��_threadr�r�r�Zsocketserverrrr�Z
ECONNRESETr�r�rr!r&r	r
rTrrr��Irerj�objectrkr}rorXrpr�rqr�r�r�r�r�r�rrrr�<module>sP

"#W!
9|__pycache__/config.cpython-36.opt-2.pyc000064400000045426150327210640013622 0ustar003


 \Ќ�
@spddlZddlZddlZddlZddlZddlZddlZddlZyddlZ	ddl
Z
Wnek
rldZ	YnXddlm
Z
mZdZejZdad*dd�Zdd�Zd	d
�Zdd�Zd
d�Zdd�Zdd�Zdd�Zejdej�Zdd�ZGdd�de�Z Gdd�de!e �Z"Gdd�de#e �Z$Gdd�de%e �Z&Gd d!�d!e�Z'Gd"d#�d#e'�Z(e(Z)d$d%�Z*edfd&d'�Z+d(d)�Z,dS)+�N)�ThreadingTCPServer�StreamRequestHandleriF#Tc
Cs�ddl}t||j�r|}n*|j|�}t|d�r:|j|�n
|j|�t|�}tj	�z t
�t||�}t|||�Wdtj
�XdS)Nr�readline)�configparser�
isinstanceZRawConfigParserZConfigParser�hasattrZ	read_file�read�_create_formatters�logging�_acquireLock�_clearExistingHandlers�_install_handlers�_install_loggers�_releaseLock)ZfnameZdefaults�disable_existing_loggersr�cp�
formatters�handlers�r�&/usr/lib64/python3.6/logging/config.py�
fileConfig8s	



rcCsp|jd�}|jd�}t|�}xN|D]F}|d|}yt||�}Wq"tk
rft|�t||�}Yq"Xq"W|S)N�.r)�split�pop�
__import__�getattr�AttributeError)�name�used�found�nrrr�_resolveZs


r!cCstdd�|�S)NcSs|j�S)N)�strip)�xrrr�<lambda>isz_strip_spaces.<locals>.<lambda>)�map)Zalistrrr�
_strip_spaceshsr&cCs�|dd}t|�siS|jd�}t|�}i}x~|D]v}d|}|j|dddd�}|j|dddd�}|j|d	dd
d�}tj}||jd�}	|	r�t|	�}||||�}
|
||<q4W|S)Nr�keys�,zformatter_%s�formatT)�raw�fallback�datefmt�style�%�class)�lenrr&�getr
�	Formatterr!)rZflistrZformZsectnameZfsZdfsZstl�c�
class_name�frrrr	ks$

r	c
CsD|dd}t|�siS|jd�}t|�}i}g}x�|D]�}|d|}|d}|jdd�}yt|tt��}Wn ttfk
r�t	|�}YnX|d}	t|	tt��}	||	�}
d	|kr�|d	}|
j
|�t|�r�|
j||�t|tj
j��r|jd
d�}t|��r|j|
|f�|
||<q8Wx |D]\}
}
|
j||
��q$W|S)Nrr'r(z
handler_%sr/�	formatter��args�level�target)r0rr&r1�eval�varsr
r�	NameErrorr!�setLevel�setFormatter�
issubclassr�
MemoryHandler�appendZ	setTarget)rr�hlistrZfixups�hand�section�klass�fmtr8�hr9r:�trrrr
�s>



r
cCsHtj}x<|D]4}|jj|}||kr:tj|_g|_d|_q||_qWdS)NT)	r
�root�manager�
loggerDictZNOTSETr9r�	propagate�disabled)�existing�
child_loggers�disable_existingrJ�log�loggerrrr�_handle_existing_loggers�s
rTcCs,|dd}|jd�}ttdd�|��}|jd�|d}tj}|}d|kr^|d}|j|�x |jdd�D]}|j|�qnW|d	}	t	|	�r�|	jd�}	t
|	�}	x|	D]}
|j||
�q�Wt|jj
j��}|j�g}�x>|D�]4}|d
|}|d}
|jdd
d�}tj|
�}|
|k�r�|j|
�d
}|
d}t	|�}t	|�}x<||k�r�||d|�|k�rt|j||�|d
7}�qFW|j|
�d|k�r�|d}|j|�x"|jdd�D]}|j|��q�W||_d|_|d	}	t	|	�r�|	jd�}	t
|	�}	x|	D]}
|j||
��qWq�Wt|||�dS)N�loggersr'r(cSs|j�S)N)r")r#rrrr$�sz"_install_loggers.<locals>.<lambda>rJZlogger_rootr9rz	logger_%s�qualnamerM�)r+rr)r�listr%�remover
rJr>r�
removeHandlerr0r&�
addHandlerrKrLr'�sortZgetint�	getLogger�indexrBrMrNrT)rrrQZllistrErJrRr9rHrCrDrOrPZqnrMrS�i�prefixed�pflen�num_existingrrrr�sd











rcCs.tjj�tjtjdd��tjdd�=dS)N)r
�	_handlers�clearZshutdownZ_handlerListrrrrrs
rz^[a-z_][a-z0-9_]*$cCstj|�}|std|��dS)Nz!Not a valid Python identifier: %rT)�
IDENTIFIER�match�
ValueError)�s�mrrr�valid_idents
rjc@seZdZddd�Zdd�ZdS)�ConvertingMixinTcCsB|jj|�}||k	r>|r |||<t|�tttfkr>||_||_|S)N)�configurator�convert�type�ConvertingDict�ConvertingList�ConvertingTuple�parent�key)�selfrs�value�replace�resultrrr�convert_with_key$s
z ConvertingMixin.convert_with_keycCs0|jj|�}||k	r,t|�tttfkr,||_|S)N)rlrmrnrorprqrr)rtrurwrrrrm0s
zConvertingMixin.convertN)T)�__name__�
__module__�__qualname__rxrmrrrrrk!s
rkc@s(eZdZdd�Zddd�Zd	dd�ZdS)
rocCstj||�}|j||�S)N)�dict�__getitem__rx)rtrsrurrrr}EszConvertingDict.__getitem__NcCstj|||�}|j||�S)N)r|r1rx)rtrs�defaultrurrrr1IszConvertingDict.getcCstj|||�}|j||dd�S)NF)rv)r|rrx)rtrsr~rurrrrMszConvertingDict.pop)N)N)ryrzr{r}r1rrrrrroBs
roc@seZdZdd�Zddd�ZdS)	rpcCstj||�}|j||�S)N)rXr}rx)rtrsrurrrr}SszConvertingList.__getitem__rWcCstj||�}|j|�S)N)rXrrm)rt�idxrurrrrWszConvertingList.popN���)r�)ryrzr{r}rrrrrrpQsrpc@seZdZdd�ZdS)rqcCstj||�}|j||dd�S)NF)rv)�tupler}rx)rtrsrurrrr}]szConvertingTuple.__getitem__N)ryrzr{r}rrrrrq[srqc@s�eZdZejd�Zejd�Zejd�Zejd�Zejd�Z	ddd�Z
ee�Z
d	d
�Zdd�Zd
d�Zdd�Zdd�Zdd�Zdd�ZdS)�BaseConfiguratorz%^(?P<prefix>[a-z]+)://(?P<suffix>.*)$z^\s*(\w+)\s*z^\.\s*(\w+)\s*z^\[\s*(\w+)\s*\]\s*z^\d+$�ext_convert�cfg_convert)ZextZcfgcCst|�|_||j_dS)N)ro�configrl)rtr�rrr�__init__vs
zBaseConfigurator.__init__c	Cs�|jd�}|jd�}y`|j|�}xP|D]H}|d|7}yt||�}Wq&tk
rl|j|�t||�}Yq&Xq&W|Stk
r�tj�dd�\}}td||f�}|||_	|_
|�YnXdS)NrrrWzCannot resolve %r: %s)rr�importerrr�ImportError�sys�exc_inforg�	__cause__�
__traceback__)	rtrhrrrZfrag�e�tb�vrrr�resolvezs"




zBaseConfigurator.resolvecCs
|j|�S)N)r�)rtrurrrr��szBaseConfigurator.ext_convertcCs|}|jj|�}|dkr&td|��n�||j�d�}|j|j�d}x�|r�|jj|�}|rp||j�d}nd|jj|�}|r�|j�d}|jj|�s�||}n2yt	|�}||}Wnt
k
r�||}YnX|r�||j�d�}qJtd||f��qJW|S)NzUnable to convert %rrzUnable to convert %r at %r)�WORD_PATTERNrfrg�endr��groups�DOT_PATTERN�
INDEX_PATTERN�
DIGIT_PATTERN�int�	TypeError)rtru�restri�drr rrrr��s2
zBaseConfigurator.cfg_convertcCs�t|t�r&t|t�r&t|�}||_n�t|t�rLt|t�rLt|�}||_n|t|t�rrt|t�rrt|�}||_nVt|t�r�|j	j
|�}|r�|j�}|d}|jj
|d�}|r�|d}t||�}||�}|S)N�prefix�suffix)rror|rlrprXrqr��str�CONVERT_PATTERNrf�	groupdict�value_convertersr1r)rtrurir�r�Z	converterr�rrrrm�s*


zBaseConfigurator.convertcsr�jd�}t|�s|j|�}�jdd�}t�fdd��D��}|f|�}|rnx |j�D]\}}t|||�qVW|S)Nz()rcs g|]}t|�r|�|f�qSr)rj)�.0�k)r�rr�
<listcomp>�sz5BaseConfigurator.configure_custom.<locals>.<listcomp>)r�callabler�r|�items�setattr)rtr�r3�props�kwargsrwrrur)r�r�configure_custom�s


z!BaseConfigurator.configure_customcCst|t�rt|�}|S)N)rrXr�)rtrurrr�as_tuple�s
zBaseConfigurator.as_tupleN)ryrzr{�re�compiler�r�r�r�r�r��staticmethodrr�r�r�r�r�rmr�r�rrrrr�bs




"r�c@sZeZdZdd�Zdd�Zdd�Zdd�Zd	d
�Zdd�Zddd�Z	ddd�Z
ddd�ZdS)�DictConfiguratorcCs�|j}d|krtd��|ddkr2td|d��|jdd�}i}tj��z�|�r�|jd|�}x�|D]�}|tjkr�td|��qfy6tj|}||}|jd	d�}|r�|jtj|��Wqft	k
r�}	ztd
||	f��WYdd}	~	XqfXqfW|jd|�}
xZ|
D]R}y|j
||
|d�Wn4t	k
�rP}	ztd
||	f��WYdd}	~	XnX�qW|jdd�}|�r�y|j|d�Wn0t	k
�r�}	ztd|	��WYdd}	~	XnX�n:|jdd�}t�|jd|�}
xZ|
D]R}y|j
|
|�|
|<Wn4t	k
�r"}	ztd||	f��WYdd}	~	XnX�q�W|jd|�}xZ|D]R}y|j||�||<Wn4t	k
�r�}	ztd||	f��WYdd}	~	XnX�q<W|jd|�}g}x�t|�D]v}y |j||�}||_|||<WnNt	k
�r}	z0dt|	�k�r�|j|�ntd
||	f��WYdd}	~	XnX�q�Wxd|D]\}y |j||�}||_|||<Wn4t	k
�r�}	ztd
||	f��WYdd}	~	XnX�q,Wtj}t|jjj��}|j�g}|jd|�}
x�|
D]�}||k�r<|j|�d}|d}t|�}t|�}x<||k�r0||d|�|k�r$|j||�|d7}�q�W|j|�y|j
||
|�Wn4t	k
�r�}	ztd
||	f��WYdd}	~	XnX�q�Wt|||�|jdd�}|�r�y|j|�Wn0t	k
�r�}	ztd|	��WYdd}	~	XnXWdtj�XdS)N�versionz$dictionary doesn't specify a versionrWzUnsupported version: %s�incrementalFrzNo handler found with name %rr9z"Unable to configure handler %r: %srUTz!Unable to configure logger %r: %srJz#Unable to configure root logger: %srrz$Unable to configure formatter %r: %s�filtersz!Unable to configure filter %r: %sztarget not configured yetr)r�rgrr
rr1rcr>�_checkLevel�	Exception�configure_logger�configure_rootr�configure_formatter�configure_filter�sorted�configure_handlerrr�rBrJrXrKrLr'r\r^r0rYrTr)rtr�r�Z
EMPTY_DICTrr�handlerZhandler_configr9r�rUrJrQrr�ZdeferredrOrPr_r`rarbrrr�	configure�s�



"
$
$
$$
$


$zDictConfigurator.configurec
Cs�d|krr|d}y|j|�}Wq�tk
rn}z4dt|�kr>�|jd�|d<||d<|j|�}WYdd}~Xq�XnP|jdd�}|jdd�}|jdd�}|jdd�}|s�tj}	nt|�}	|	|||�}|S)	Nz()z'format'r)rGr,r-r.r/)r�r�r�rr1r
r2r!)
rtr��factoryrw�terGZdfmtr-�cnamer3rrrr��s&z$DictConfigurator.configure_formattercCs.d|kr|j|�}n|jdd�}tj|�}|S)Nz()rr7)r�r1r
ZFilter)rtr�rwrrrrr��s

z!DictConfigurator.configure_filtercCs^xX|D]P}y|j|jd|�Wqtk
rT}ztd||f��WYdd}~XqXqWdS)Nr�zUnable to add filter %r: %s)Z	addFilterr�r�rg)rtZfiltererr�r5r�rrr�add_filters�s

zDictConfigurator.add_filtersc/s�t��}�jdd�}|r^y|jd|}Wn2tk
r\}ztd||f��WYdd}~XnX�jdd�}�jdd�}d�kr��jd�}t|�s�|j|�}|}�n�jd�}	|j|	�}
t|
tj	j
�o�d�k�rHy>|jd	�d}t|tj��s�j
|�td
��|�d<Wn8tk
�rD}ztd�d|f��WYdd}~XnXnZt|
tj	j��rvd�k�rv|j�d��d<n,t|
tj	j��r�d
�k�r�|j�d
��d
<|
}�jdd�}t�fdd��D��}
y|f|
�}WnLtk
�r"}z.dt|�k�r��|
jd�|
d<|f|
�}WYdd}~XnX|�r4|j|�|dk	�rN|jtj|��|�r`|j||�|�r�x"|j�D]\}}t|||��qpW|S)Nr6rzUnable to set formatter %r: %sr9r�z()r/r:rztarget not configured yetz#Unable to set target handler %r: %sZmailhostZaddressrcs g|]}t|�r|�|f�qSr)rj)r�r�)r�rrr��sz6DictConfigurator.configure_handler.<locals>.<listcomp>z'stream'�streamZstrm)r|rr�r�rgr�r�r@r
rrArZHandler�updater�ZSMTPHandlerr�Z
SysLogHandlerr�r?r>r�r�r�r�)rtr�Zconfig_copyr6r�r9r�r3r�r�rFZthr�r�rwr�rrur)r�rr��sl





$



z"DictConfigurator.configure_handlercCs^xX|D]P}y|j|jd|�Wqtk
rT}ztd||f��WYdd}~XqXqWdS)NrzUnable to add handler %r: %s)r[r�r�rg)rtrSrrHr�rrr�add_handlers�s

zDictConfigurator.add_handlersFcCs�|jdd�}|dk	r$|jtj|��|s�x |jdd�D]}|j|�q8W|jdd�}|rf|j||�|jdd�}|r�|j||�dS)Nr9rr�)r1r>r
r�rrZr�r�)rtrSr�r�r9rHrr�rrr�common_logger_config�sz%DictConfigurator.common_logger_configcCs6tj|�}|j|||�|jdd�}|dk	r2||_dS)NrM)r
r]r�r1rM)rtrr�r�rSrMrrrr�s

z!DictConfigurator.configure_loggercCstj�}|j|||�dS)N)r
r]r�)rtr�r�rJrrrr�szDictConfigurator.configure_rootN)F)F)F)ryrzr{r�r�r�r�r�r�r�r�r�rrrrr��s	?

r�cCst|�j�dS)N)�dictConfigClassr�)r�rrr�
dictConfig sr�csPtstd��Gdd�dt�}Gdd�dt�}G�fdd�dtj���||||�S)Nz listen() needs threading to workc@seZdZdd�ZdS)z#listen.<locals>.ConfigStreamHandlercSsH�y|j}|jd�}t|�dk�rtjd|�d}|jj|�}x&t|�|krd||j|t|��}q@W|jjdk	r~|jj|�}|dk	r�|jd�}yddl}|j	|�}t
|�WnHtk
r�tj
|�}yt|�Wntk
r�tj�YnXYnX|jj�r|jjj�Wn2tk
�rB}z|jtk�r2�WYdd}~XnXdS)N�z>Lrzutf-8)Z
connectionZrecvr0�structZunpack�server�verify�decode�json�loadsr�r��io�StringIOr�	traceback�	print_exc�ready�set�OSError�errno�RESET_ERROR)rtZconn�chunkZslenr�r��filer�rrr�handleBs6




z*listen.<locals>.ConfigStreamHandler.handleN)ryrzr{r�rrrr�ConfigStreamHandler;sr�c@s,eZdZdZdedddfdd�Zdd�ZdS)z$listen.<locals>.ConfigSocketReceiverrWZ	localhostNcSs>tj|||f|�tj�d|_tj�d|_||_||_dS)NrrW)	rr�r
r�abortr�timeoutr�r�)rt�host�portr�r�r�rrrr�psz-listen.<locals>.ConfigSocketReceiver.__init__cSsfddl}d}xJ|sV|j|jj�ggg|j�\}}}|r>|j�tj�|j}tj�qW|jj	�dS)Nr)
�selectZsocket�filenor�Zhandle_requestr
rr�r�close)rtr�r�Zrd�wrZexrrr�serve_until_stoppedzsz8listen.<locals>.ConfigSocketReceiver.serve_until_stopped)ryrzr{Zallow_reuse_address�DEFAULT_LOGGING_CONFIG_PORTr�r�rrrr�ConfigSocketReceiveris	r�cs&eZdZ��fdd�Zdd�Z�ZS)zlisten.<locals>.Servercs4t�|�j�||_||_||_||_tj�|_dS)N)	�superr��rcvr�hdlrr�r��	threadingZEventr�)rtr�r�r�r�)�Server�	__class__rrr��szlisten.<locals>.Server.__init__cSsZ|j|j|j|j|jd�}|jdkr0|jd|_|jj�tj�|a	tj
�|j�dS)N)r�r�r�r�rrW)r�r�r�r�r�Zserver_addressr�r
r�	_listenerrr�)rtr�rrr�run�s


zlisten.<locals>.Server.run)ryrzr{r�r��
__classcell__r)r�)r�rr��sr�)�thread�NotImplementedErrorrrr�ZThread)r�r�r�r�r)r�r�listen%s.r�c
Cs*tj�ztrdt_daWdtj�XdS)NrW)r
rr�r�rrrrr�
stopListening�sr�)NT)-r�r�r
Zlogging.handlersr�r�r�r��_threadr�r�r�Zsocketserverrrr�Z
ECONNRESETr�r�rr!r&r	r
rTrrr��Irerj�objectrkr|rorXrpr�rqr�r�r�r�r�r�rrrr�<module>sN

"#W!
9|__pycache__/config.cpython-36.pyc000064400000055536150327210640012665 0ustar003


 \Ќ�
@stdZddlZddlZddlZddlZddlZddlZddlZddlZyddl	Z
ddlZWnek
rpdZ
YnXddl
mZmZdZejZdad+dd�Zdd	�Zd
d�Zdd
�Zdd�Zdd�Zdd�Zdd�Zejdej�Zdd�ZGdd�de �Z!Gdd�de"e!�Z#Gdd�de$e!�Z%Gdd �d e&e!�Z'Gd!d"�d"e �Z(Gd#d$�d$e(�Z)e)Z*d%d&�Z+edfd'd(�Z,d)d*�Z-dS),a
Configuration functions for the logging package for Python. The core package
is based on PEP 282 and comments thereto in comp.lang.python, and influenced
by Apache's log4j system.

Copyright (C) 2001-2014 Vinay Sajip. All Rights Reserved.

To use, simply 'import logging' and log away!
�N)�ThreadingTCPServer�StreamRequestHandleriF#Tc
Cs�ddl}t||j�r|}n*|j|�}t|d�r:|j|�n
|j|�t|�}tj	�z t
�t||�}t|||�Wdtj
�XdS)aD
    Read the logging configuration from a ConfigParser-format file.

    This can be called several times from an application, allowing an end user
    the ability to select from various pre-canned configurations (if the
    developer provides a mechanism to present the choices and load the chosen
    configuration).
    rN�readline)�configparser�
isinstanceZRawConfigParserZConfigParser�hasattrZ	read_file�read�_create_formatters�logging�_acquireLock�_clearExistingHandlers�_install_handlers�_install_loggers�_releaseLock)ZfnameZdefaults�disable_existing_loggersr�cp�
formatters�handlers�r�&/usr/lib64/python3.6/logging/config.py�
fileConfig8s	



rcCsp|jd�}|jd�}t|�}xN|D]F}|d|}yt||�}Wq"tk
rft|�t||�}Yq"Xq"W|S)z)Resolve a dotted name to a global object.�.r)�split�pop�
__import__�getattr�AttributeError)�name�used�found�nrrr�_resolveZs


r!cCstdd�|�S)NcSs|j�S)N)�strip)�xrrr�<lambda>isz_strip_spaces.<locals>.<lambda>)�map)Zalistrrr�
_strip_spaceshsr&cCs�|dd}t|�siS|jd�}t|�}i}x~|D]v}d|}|j|dddd�}|j|d	ddd�}|j|d
ddd�}tj}||jd�}	|	r�t|	�}||||�}
|
||<q4W|S)
zCreate and return formattersr�keys�,zformatter_%s�formatTN)�raw�fallback�datefmt�style�%�class)�lenrr&�getr
�	Formatterr!)rZflistrZformZsectnameZfsZdfsZstl�c�
class_name�frrrr	ks$

r	c
CsD|dd}t|�siS|jd�}t|�}i}g}x�|D]�}|d|}|d}|jdd�}yt|tt��}Wn ttfk
r�t	|�}YnX|d}	t|	tt��}	||	�}
d	|kr�|d	}|
j
|�t|�r�|
j||�t|tj
j��r|jd
d�}t|��r|j|
|f�|
||<q8Wx |D]\}
}
|
j||
��q$W|S)zInstall and return handlersrr'r(z
handler_%sr/�	formatter��args�level�target)r0rr&r1�eval�varsr
r�	NameErrorr!�setLevel�setFormatter�
issubclassr�
MemoryHandler�appendZ	setTarget)rr�hlistrZfixups�hand�section�klass�fmtr8�hr9r:�trrrr
�s>



r
cCsHtj}x<|D]4}|jj|}||kr:tj|_g|_d|_q||_qWdS)a�
    When (re)configuring logging, handle loggers which were in the previous
    configuration but are not in the new configuration. There's no point
    deleting them as other threads may continue to hold references to them;
    and by disabling them, you stop them doing any logging.

    However, don't disable children of named loggers, as that's probably not
    what was intended by the user. Also, allow existing loggers to NOT be
    disabled if disable_existing is false.
    TN)	r
�root�manager�
loggerDictZNOTSETr9r�	propagate�disabled)�existing�
child_loggers�disable_existingrJ�log�loggerrrr�_handle_existing_loggers�s
rTcCs,|dd}|jd�}ttdd�|��}|jd�|d}tj}|}d|kr^|d}|j|�x |jd	d	�D]}|j|�qnW|d
}	t	|	�r�|	jd�}	t
|	�}	x|	D]}
|j||
�q�Wt|jj
j��}|j�g}�x>|D�]4}|d|}|d}
|jd
dd�}tj|
�}|
|k�r�|j|
�d}|
d}t	|�}t	|�}x<||k�r�||d	|�|k�rt|j||�|d7}�qFW|j|
�d|k�r�|d}|j|�x"|jd	d	�D]}|j|��q�W||_d|_|d
}	t	|	�r�|	jd�}	t
|	�}	x|	D]}
|j||
��qWq�Wt|||�d	S)zCreate and install loggers�loggersr'r(cSs|j�S)N)r")r#rrrr$�sz"_install_loggers.<locals>.<lambda>rJZlogger_rootr9Nrz	logger_%s�qualnamerM�)r+rr)r�listr%�remover
rJr>r�
removeHandlerr0r&�
addHandlerrKrLr'�sortZgetint�	getLogger�indexrBrMrNrT)rrrQZllistrErJrRr9rHrCrDrOrPZqnrMrS�i�prefixed�pflen�num_existingrrrr�sd











rcCs.tjj�tjtjdd��tjdd�=dS)z!Clear and close existing handlersN)r
�	_handlers�clearZshutdownZ_handlerListrrrrrs
rz^[a-z_][a-z0-9_]*$cCstj|�}|std|��dS)Nz!Not a valid Python identifier: %rT)�
IDENTIFIER�match�
ValueError)�s�mrrr�valid_idents
rjc@s"eZdZdZddd�Zdd�ZdS)	�ConvertingMixinz?For ConvertingXXX's, this mixin class provides common functionsTcCsB|jj|�}||k	r>|r |||<t|�tttfkr>||_||_|S)N)�configurator�convert�type�ConvertingDict�ConvertingList�ConvertingTuple�parent�key)�selfrs�value�replace�resultrrr�convert_with_key$s
z ConvertingMixin.convert_with_keycCs0|jj|�}||k	r,t|�tttfkr,||_|S)N)rlrmrnrorprqrr)rtrurwrrrrm0s
zConvertingMixin.convertN)T)�__name__�
__module__�__qualname__�__doc__rxrmrrrrrk!s
rkc@s,eZdZdZdd�Zd	dd�Zd
dd�ZdS)roz A converting dictionary wrapper.cCstj||�}|j||�S)N)�dict�__getitem__rx)rtrsrurrrr~EszConvertingDict.__getitem__NcCstj|||�}|j||�S)N)r}r1rx)rtrs�defaultrurrrr1IszConvertingDict.getcCstj|||�}|j||dd�S)NF)rv)r}rrx)rtrsrrurrrrMszConvertingDict.pop)N)N)ryrzr{r|r~r1rrrrrroBs
roc@s"eZdZdZdd�Zd	dd�ZdS)
rpzA converting list wrapper.cCstj||�}|j||�S)N)rXr~rx)rtrsrurrrr~SszConvertingList.__getitem__rWcCstj||�}|j|�S)N)rXrrm)rt�idxrurrrrWszConvertingList.popN���)r�)ryrzr{r|r~rrrrrrpQsrpc@seZdZdZdd�ZdS)rqzA converting tuple wrapper.cCstj||�}|j||dd�S)NF)rv)�tupler~rx)rtrsrurrrr~]szConvertingTuple.__getitem__N)ryrzr{r|r~rrrrrq[srqc@s�eZdZdZejd�Zejd�Zejd�Zejd�Z	ejd�Z
ddd	�Zee
�Zd
d�Zdd
�Zdd�Zdd�Zdd�Zdd�Zdd�ZdS)�BaseConfiguratorzI
    The configurator base class which defines some useful defaults.
    z%^(?P<prefix>[a-z]+)://(?P<suffix>.*)$z^\s*(\w+)\s*z^\.\s*(\w+)\s*z^\[\s*(\w+)\s*\]\s*z^\d+$�ext_convert�cfg_convert)ZextZcfgcCst|�|_||j_dS)N)ro�configrl)rtr�rrr�__init__vs
zBaseConfigurator.__init__c	Cs�|jd�}|jd�}y`|j|�}xP|D]H}|d|7}yt||�}Wq&tk
rl|j|�t||�}Yq&Xq&W|Stk
r�tj�dd�\}}td||f�}|||_	|_
|�YnXdS)z`
        Resolve strings to objects using standard import and attribute
        syntax.
        rrrWNzCannot resolve %r: %s)rr�importerrr�ImportError�sys�exc_inforg�	__cause__�
__traceback__)	rtrhrrrZfrag�e�tb�vrrr�resolvezs"




zBaseConfigurator.resolvecCs
|j|�S)z*Default converter for the ext:// protocol.)r�)rtrurrrr��szBaseConfigurator.ext_convertcCs|}|jj|�}|dkr&td|��n�||j�d�}|j|j�d}x�|r�|jj|�}|rp||j�d}nd|jj|�}|r�|j�d}|jj|�s�||}n2yt	|�}||}Wnt
k
r�||}YnX|r�||j�d�}qJtd||f��qJW|S)z*Default converter for the cfg:// protocol.NzUnable to convert %rrzUnable to convert %r at %r)�WORD_PATTERNrfrg�endr��groups�DOT_PATTERN�
INDEX_PATTERN�
DIGIT_PATTERN�int�	TypeError)rtru�restri�dr�r rrrr��s2
zBaseConfigurator.cfg_convertcCs�t|t�r&t|t�r&t|�}||_n�t|t�rLt|t�rLt|�}||_n|t|t�rrt|t�rrt|�}||_nVt|t�r�|j	j
|�}|r�|j�}|d}|jj
|d�}|r�|d}t||�}||�}|S)z�
        Convert values to an appropriate type. dicts, lists and tuples are
        replaced by their converting alternatives. Strings are checked to
        see if they have a conversion format and are converted if they do.
        �prefixN�suffix)rror}rlrprXrqr��str�CONVERT_PATTERNrf�	groupdict�value_convertersr1r)rtrurir�r�Z	converterr�rrrrm�s*


zBaseConfigurator.convertcsr�jd�}t|�s|j|�}�jdd�}t�fdd��D��}|f|�}|rnx |j�D]\}}t|||�qVW|S)z1Configure an object with a user-supplied factory.z()rNcs g|]}t|�r|�|f�qSr)rj)�.0�k)r�rr�
<listcomp>�sz5BaseConfigurator.configure_custom.<locals>.<listcomp>)r�callabler�r}�items�setattr)rtr�r3�props�kwargsrwrrur)r�r�configure_custom�s


z!BaseConfigurator.configure_customcCst|t�rt|�}|S)z0Utility function which converts lists to tuples.)rrXr�)rtrurrr�as_tuple�s
zBaseConfigurator.as_tupleN)ryrzr{r|�re�compiler�r�r�r�r�r��staticmethodrr�r�r�r�r�rmr�r�rrrrr�bs 




"r�c@s^eZdZdZdd�Zdd�Zdd�Zdd	�Zd
d�Zdd
�Z	ddd�Z
ddd�Zddd�ZdS)�DictConfiguratorz]
    Configure logging using a dictionary-like object to describe the
    configuration.
    cCs�|j}d|krtd��|ddkr2td|d��|jdd�}i}tj��z�|�r�|jd|�}x�|D]�}|tjkr�td|��qfy6tj|}||}|jd	d
�}|r�|jtj|��Wqft	k
r�}	ztd||	f��WYd
d
}	~	XqfXqfW|jd|�}
xZ|
D]R}y|j
||
|d
�Wn4t	k
�rP}	ztd||	f��WYd
d
}	~	XnX�qW|jdd
�}|�r�y|j|d
�Wn0t	k
�r�}	ztd|	��WYd
d
}	~	XnX�n:|jdd
�}t�|jd|�}
xZ|
D]R}y|j
|
|�|
|<Wn4t	k
�r"}	ztd||	f��WYd
d
}	~	XnX�q�W|jd|�}xZ|D]R}y|j||�||<Wn4t	k
�r�}	ztd||	f��WYd
d
}	~	XnX�q<W|jd|�}g}x�t|�D]v}y |j||�}||_|||<WnNt	k
�r}	z0dt|	�k�r�|j|�ntd||	f��WYd
d
}	~	XnX�q�Wxd|D]\}y |j||�}||_|||<Wn4t	k
�r�}	ztd||	f��WYd
d
}	~	XnX�q,Wtj}t|jjj��}|j�g}|jd|�}
x�|
D]�}||k�r<|j|�d}|d}t|�}t|�}x<||k�r0||d
|�|k�r$|j||�|d7}�q�W|j|�y|j
||
|�Wn4t	k
�r�}	ztd||	f��WYd
d
}	~	XnX�q�Wt|||�|jdd
�}|�r�y|j|�Wn0t	k
�r�}	ztd|	��WYd
d
}	~	XnXWd
tj�Xd
S)zDo the configuration.�versionz$dictionary doesn't specify a versionrWzUnsupported version: %s�incrementalFrzNo handler found with name %rr9Nz"Unable to configure handler %r: %srUTz!Unable to configure logger %r: %srJz#Unable to configure root logger: %srrz$Unable to configure formatter %r: %s�filtersz!Unable to configure filter %r: %sztarget not configured yetr)r�rgrr
rr1rcr>�_checkLevel�	Exception�configure_logger�configure_rootr�configure_formatter�configure_filter�sorted�configure_handlerrr�rBrJrXrKrLr'r\r^r0rYrTr)rtr�r�Z
EMPTY_DICTrr�handlerZhandler_configr9r�rUrJrQrr�ZdeferredrOrPr_r`rarbrrr�	configure�s�



"
$
$
$$
$


$zDictConfigurator.configurec
Cs�d|krr|d}y|j|�}Wq�tk
rn}z4dt|�kr>�|jd�|d<||d<|j|�}WYdd}~Xq�XnP|jdd�}|jdd�}|jdd�}|jd	d�}|s�tj}	nt|�}	|	|||�}|S)
z(Configure a formatter from a dictionary.z()z'format'r)rGNr,r-r.r/)r�r�r�rr1r
r2r!)
rtr��factoryrw�terGZdfmtr-�cnamer3rrrr��s&z$DictConfigurator.configure_formattercCs.d|kr|j|�}n|jdd�}tj|�}|S)z%Configure a filter from a dictionary.z()rr7)r�r1r
ZFilter)rtr�rwrrrrr��s

z!DictConfigurator.configure_filtercCs^xX|D]P}y|j|jd|�Wqtk
rT}ztd||f��WYdd}~XqXqWdS)z/Add filters to a filterer from a list of names.r�zUnable to add filter %r: %sN)Z	addFilterr�r�rg)rtZfiltererr�r5r�rrr�add_filters�s

zDictConfigurator.add_filtersc/s�t��}�jdd�}|r^y|jd|}Wn2tk
r\}ztd||f��WYdd}~XnX�jdd�}�jdd�}d�kr��jd�}t|�s�|j|�}|}�n�jd�}	|j|	�}
t|
tj	j
�o�d	�k�rHy>|jd
�d	}t|tj��s�j
|�td��|�d	<Wn8tk
�rD}ztd�d	|f��WYdd}~XnXnZt|
tj	j��rvd
�k�rv|j�d
��d
<n,t|
tj	j��r�d�k�r�|j�d��d<|
}�jdd�}t�fdd��D��}
y|f|
�}WnLtk
�r"}z.dt|�k�r��|
jd�|
d<|f|
�}WYdd}~XnX|�r4|j|�|dk	�rN|jtj|��|�r`|j||�|�r�x"|j�D]\}}t|||��qpW|S)z&Configure a handler from a dictionary.r6NrzUnable to set formatter %r: %sr9r�z()r/r:rztarget not configured yetz#Unable to set target handler %r: %sZmailhostZaddressrcs g|]}t|�r|�|f�qSr)rj)r�r�)r�rrr��sz6DictConfigurator.configure_handler.<locals>.<listcomp>z'stream'�streamZstrm)r}rr�r�rgr�r�r@r
rrArZHandler�updater�ZSMTPHandlerr�Z
SysLogHandlerr�r?r>r�r�r�r�)rtr�Zconfig_copyr6r�r9r�r3r�r�rFZthr�r�rwr�rrur)r�rr��sl





$



z"DictConfigurator.configure_handlercCs^xX|D]P}y|j|jd|�Wqtk
rT}ztd||f��WYdd}~XqXqWdS)z.Add handlers to a logger from a list of names.rzUnable to add handler %r: %sN)r[r�r�rg)rtrSrrHr�rrr�add_handlers�s

zDictConfigurator.add_handlersFcCs�|jdd�}|dk	r$|jtj|��|s�x |jdd�D]}|j|�q8W|jdd�}|rf|j||�|jdd�}|r�|j||�dS)zU
        Perform configuration which is common to root and non-root loggers.
        r9Nrr�)r1r>r
r�rrZr�r�)rtrSr�r�r9rHrr�rrr�common_logger_config�sz%DictConfigurator.common_logger_configcCs6tj|�}|j|||�|jdd�}|dk	r2||_dS)z.Configure a non-root logger from a dictionary.rMN)r
r]r�r1rM)rtrr�r�rSrMrrrr�s

z!DictConfigurator.configure_loggercCstj�}|j|||�dS)z*Configure a root logger from a dictionary.N)r
r]r�)rtr�r�rJrrrr�szDictConfigurator.configure_rootN)F)F)F)
ryrzr{r|r�r�r�r�r�r�r�r�r�rrrrr��s	?

r�cCst|�j�dS)z%Configure logging using a dictionary.N)�dictConfigClassr�)r�rrr�
dictConfig sr�csPtstd��Gdd�dt�}Gdd�dt�}G�fdd�dtj���||||�S)au
    Start up a socket server on the specified port, and listen for new
    configurations.

    These will be sent as a file suitable for processing by fileConfig().
    Returns a Thread object on which you can call start() to start the server,
    and which you can join() when appropriate. To stop the server, call
    stopListening().

    Use the ``verify`` argument to verify any bytes received across the wire
    from a client. If specified, it should be a callable which receives a
    single argument - the bytes of configuration data received across the
    network - and it should return either ``None``, to indicate that the
    passed in bytes could not be verified and should be discarded, or a
    byte string which is then passed to the configuration machinery as
    normal. Note that you can return transformed bytes, e.g. by decrypting
    the bytes passed in.
    z listen() needs threading to workc@seZdZdZdd�ZdS)z#listen.<locals>.ConfigStreamHandlerz�
        Handler for a logging configuration request.

        It expects a completely new logging configuration and uses fileConfig
        to install it.
        cSs\�y"|j}|jd�}t|�dk�r"tjd|�d}|jj|�}x&t|�|krd||j|t|��}q@W|jjdk	r~|jj|�}|dk	�r|jd�}y,ddl}|j	|�}t
|t�s�t�t
|�WnLtk
�r
tj|�}yt|�Wntk
�rtj�YnXYnX|jj�r"|jjj�Wn2tk
�rV}z|jtk�rF�WYdd}~XnXdS)z�
            Handle a request.

            Each request is expected to be a 4-byte length, packed using
            struct.pack(">L", n), followed by the config file.
            Uses fileConfig() to do the grunt work.
            �z>LrNzutf-8)Z
connectionZrecvr0�structZunpack�server�verify�decode�json�loadsrr}�AssertionErrorr�r��io�StringIOr�	traceback�	print_exc�ready�set�OSError�errno�RESET_ERROR)rtZconn�chunkZslenr�r��filer�rrr�handleBs8





z*listen.<locals>.ConfigStreamHandler.handleN)ryrzr{r|r�rrrr�ConfigStreamHandler;sr�c@s0eZdZdZdZdedddfdd�Zdd�ZdS)	z$listen.<locals>.ConfigSocketReceiverzD
        A simple TCP socket-based logging config receiver.
        rWZ	localhostNcSs>tj|||f|�tj�d|_tj�d|_||_||_dS)NrrW)	rr�r
r�abortr�timeoutr�r�)rt�host�portr�r�r�rrrr�psz-listen.<locals>.ConfigSocketReceiver.__init__cSsfddl}d}xJ|sV|j|jj�ggg|j�\}}}|r>|j�tj�|j}tj�qW|jj	�dS)Nr)
�selectZsocket�filenor�Zhandle_requestr
rr�r�close)rtr�r�Zrd�wrZexrrr�serve_until_stoppedzsz8listen.<locals>.ConfigSocketReceiver.serve_until_stopped)ryrzr{r|Zallow_reuse_address�DEFAULT_LOGGING_CONFIG_PORTr�r�rrrr�ConfigSocketReceiveris
	r�cs&eZdZ��fdd�Zdd�Z�ZS)zlisten.<locals>.Servercs4t�|�j�||_||_||_||_tj�|_dS)N)	�superr��rcvr�hdlrr�r��	threadingZEventr�)rtr�r�r�r�)�Server�	__class__rrr��szlisten.<locals>.Server.__init__cSsZ|j|j|j|j|jd�}|jdkr0|jd|_|jj�tj�|a	tj
�|j�dS)N)r�r�r�r�rrW)r�r�r�r�r�Zserver_addressr�r
r�	_listenerrr�)rtr�rrr�run�s


zlisten.<locals>.Server.run)ryrzr{r�r��
__classcell__r)r�)r�rr��sr�)�thread�NotImplementedErrorrrr�ZThread)r�r�r�r�r)r�r�listen%s.r�c
Cs*tj�ztrdt_daWdtj�XdS)zN
    Stop the listening server which was created with a call to listen().
    rWN)r
rr�r�rrrrr�
stopListening�sr�)NT).r|r�r�r
Zlogging.handlersr�r�r�r��_threadr�r�r�Zsocketserverrrr�Z
ECONNRESETr�r�rr!r&r	r
rTrrr��Irerj�objectrkr}rorXrpr�rqr�r�r�r�r�r�rrrr�<module>sP

"#W!
9|__pycache__/handlers.cpython-36.pyc000064400000124554150327210640013215 0ustar003

�\dhI��@s�dZddlZddlZddlZddlZddlZddlZddlZddlm	Z	m
Z
mZddlZyddl
Z
Wnek
r|dZ
YnXdZdZdZdZdZdZd(ZGdd�dej�ZGd
d�de�ZGdd�de�ZGdd�dej�ZGdd�dej�ZGdd�de�ZGdd�dej�ZGdd�dej�ZGdd�dej�Z Gdd�dej�Z!Gdd �d ej�Z"Gd!d"�d"e"�Z#Gd#d$�d$ej�Z$e
�r�Gd%d&�d&e%�Z&dS))z�
Additional handlers for the logging package for Python. The core package is
based on PEP 282 and comments thereto in comp.lang.python.

Copyright (C) 2001-2016 Vinay Sajip. All Rights Reserved.

To use, simply 'import logging.handlers' and log away!
�N)�ST_DEV�ST_INO�ST_MTIMEi<#i=#i>#i?#i��<c@s2eZdZdZddd�Zdd�Zdd	�Zd
d�ZdS)
�BaseRotatingHandlerz�
    Base class for handlers that rotate log files at a certain point.
    Not meant to be instantiated directly.  Instead, use RotatingFileHandler
    or TimedRotatingFileHandler.
    NFcCs0tjj|||||�||_||_d|_d|_dS)zA
        Use the specified filename for streamed logging
        N)�logging�FileHandler�__init__�mode�encoding�namer�rotator)�self�filenamerr�delay�r�(/usr/lib64/python3.6/logging/handlers.pyr
5s
zBaseRotatingHandler.__init__cCsHy$|j|�r|j�tjj||�Wntk
rB|j|�YnXdS)z�
        Emit a record.

        Output the record to the file, catering for rollover as described
        in doRollover().
        N)�shouldRollover�
doRolloverrr	�emit�	Exception�handleError)r�recordrrrr?s
zBaseRotatingHandler.emitcCst|j�s|}n
|j|�}|S)a�
        Modify the filename of a log file when rotating.

        This is provided so that a custom filename can be provided.

        The default implementation calls the 'namer' attribute of the
        handler, if it's callable, passing the default name to
        it. If the attribute isn't callable (the default is None), the name
        is returned unchanged.

        :param default_name: The default name for the log file.
        )�callabler
)rZdefault_name�resultrrr�rotation_filenameMs

z%BaseRotatingHandler.rotation_filenamecCs4t|j�s$tjj|�r0tj||�n|j||�dS)aL
        When rotating, rotate the current log.

        The default implementation calls the 'rotator' attribute of the
        handler, if it's callable, passing the source and dest arguments to
        it. If the attribute isn't callable (the default is None), the source
        is simply renamed to the destination.

        :param source: The source filename. This is normally the base
                       filename, e.g. 'test.log'
        :param dest:   The destination filename. This is normally
                       what the source is rotated to, e.g. 'test.log.1'.
        N)rr�os�path�exists�rename)r�source�destrrr�rotate`s
zBaseRotatingHandler.rotate)NF)�__name__�
__module__�__qualname__�__doc__r
rrr#rrrrr/s


rc@s*eZdZdZddd�Zdd	�Zd
d�ZdS)
�RotatingFileHandlerz�
    Handler for logging to a set of files, which switches from one file
    to the next when the current file reaches a certain size.
    �arNFcCs.|dkrd}tj|||||�||_||_dS)a�
        Open the specified file and use it as the stream for logging.

        By default, the file grows indefinitely. You can specify particular
        values of maxBytes and backupCount to allow the file to rollover at
        a predetermined size.

        Rollover occurs whenever the current log file is nearly maxBytes in
        length. If backupCount is >= 1, the system will successively create
        new files with the same pathname as the base file, but with extensions
        ".1", ".2" etc. appended to it. For example, with a backupCount of 5
        and a base file name of "app.log", you would get "app.log",
        "app.log.1", "app.log.2", ... through to "app.log.5". The file being
        written to is always "app.log" - when it gets filled up, it is closed
        and renamed to "app.log.1", and if files "app.log.1", "app.log.2" etc.
        exist, then they are renamed to "app.log.2", "app.log.3" etc.
        respectively.

        If maxBytes is zero, rollover never occurs.
        rr)N)rr
�maxBytes�backupCount)rrrr*r+rrrrrr
zs
zRotatingFileHandler.__init__cCs�|jr|jj�d|_|jdkr�xtt|jddd�D]^}|jd|j|f�}|jd|j|df�}tjj|�r4tjj|�r�tj	|�tj
||�q4W|j|jd�}tjj|�r�tj	|�|j|j|�|js�|j
�|_dS)z<
        Do a rollover, as described in __init__().
        Nr�z%s.%dz.1���)�stream�closer+�ranger�baseFilenamerrr�remover r#r�_open)r�iZsfn�dfnrrrr�s$




zRotatingFileHandler.doRollovercCs|tjj|j�r"tjj|j�r"dS|jdkr6|j�|_|jdkrxd|j|�}|jj	dd�|jj
�t|�|jkrxdSdS)z�
        Determine if rollover should occur.

        Basically, see if the supplied record would cause the file to exceed
        the size limit we have.
        FNrz%s
�T)rrrr1�isfiler.r3r*�format�seek�tell�len)rr�msgrrrr�s


z"RotatingFileHandler.shouldRollover)r)rrNF)r$r%r&r'r
rrrrrrr(us
 r(c@s:eZdZdZddd�Zd	d
�Zdd�Zd
d�Zdd�ZdS)�TimedRotatingFileHandlerz�
    Handler for logging to a file, rotating the log file at certain timed
    intervals.

    If backupCount is > 0, when rollover is done, no more than backupCount
    files are kept - the oldest ones are deleted.
    �hr,rNFc	
Cs�tj||d||�|j�|_||_||_||_|jdkrNd|_d|_d|_	�n�|jdkrld|_d|_d	|_	n�|jd
kr�d|_d|_d|_	n�|jd
ks�|jdkr�d|_d|_d|_	n�|jj
d��r.d|_t|j�dkr�td|j��|jddk�s|jddk�rtd|j��t
|jd�|_d|_d|_	ntd|j��tj|j	tj�|_	|j||_|j}tjj|��r~tj|�t}	nt
tj��}	|j|	�|_dS) Nr)�Sr,z%Y-%m-%d_%H-%M-%Sz-^\d{4}-\d{2}-\d{2}_\d{2}-\d{2}-\d{2}(\.\w+)?$�Mrz%Y-%m-%d_%H-%Mz'^\d{4}-\d{2}-\d{2}_\d{2}-\d{2}(\.\w+)?$�Hz%Y-%m-%d_%Hz!^\d{4}-\d{2}-\d{2}_\d{2}(\.\w+)?$�D�MIDNIGHTrz%Y-%m-%dz^\d{4}-\d{2}-\d{2}(\.\w+)?$�W�r6zHYou must specify a day for weekly rollover from 0 to 6 (0 is Monday): %s�0�6z-Invalid day specified for weekly rollover: %sz'Invalid rollover interval specified: %siii�Qii�Qi�:	)rr
�upper�whenr+�utc�atTime�interval�suffix�extMatch�
startswithr;�
ValueError�int�	dayOfWeek�re�compile�ASCIIr1rrr�statr�time�computeRollover�
rolloverAt)
rrrIrLr+rrrJrK�trrrr
�sL




 z!TimedRotatingFileHandler.__init__cCsd||j}|jdks"|jjd��r`|jr4tj|�}n
tj|�}|d}|d}|d}|d}|jdkrnt}n |jj	d|jj
d|jj}||d|d|}	|	d	kr�|	t7}	|d
d}||	}|jjd��r`|}
|
|jk�r`|
|jkr�|j|
}nd|
|jd
}||d}|j�s\|d}
tj|�d}|
|k�r\|
�sPd}nd
}||7}|}|S)zI
        Work out the rollover time based on the specified time.
        rCrD����Nrrr,rEriii�Qr-r-i��)
rLrIrOrJrW�gmtime�	localtimerK�	_MIDNIGHTZhourZminute�secondrR)r�currentTimerrZZcurrentHourZ
currentMinuteZ
currentSecondZ
currentDayZ	rotate_ts�rZdayZ
daysToWait�
newRolloverAt�dstNow�
dstAtRollover�addendrrrrXsH





z(TimedRotatingFileHandler.computeRollovercCs@tjj|j�r"tjj|j�r"dSttj��}||jkr<dSdS)z�
        Determine if rollover should occur.

        record is not used, as we are just comparing times, but it is needed so
        the method signatures are the same
        FT)rrrr1r7rQrWrY)rrrZrrrrNs
z'TimedRotatingFileHandler.shouldRolloverc	Cs�tjj|j�\}}tj|�}g}|d}t|�}xH|D]@}|d|�|kr6||d�}|jj|�r6|jtjj	||��q6Wt|�|j
kr�g}n|j�|dt|�|j
�}|S)z�
        Determine the files to delete when rolling over.

        More specific than the earlier method, which just used glob.glob().
        �.N)rr�splitr1�listdirr;rN�match�append�joinr+�sort)	rZdirNameZbaseNameZ	fileNamesr�prefixZplenZfileNamerMrrr�getFilesToDelete]s

z)TimedRotatingFileHandler.getFilesToDeletecCs�|jr|jj�d|_ttj��}tj|�d}|j|j}|jrNtj|�}n6tj|�}|d	}||kr�|rrd}nd
}tj||�}|j	|j
dtj|j|��}t
jj|�r�t
j|�|j|j
|�|jdkr�x|j�D]}t
j|�q�W|j�s�|j�|_|j|�}	x|	|k�r"|	|j}	�q
W|jdk�s>|jjd��rx|j�rxtj|	�d}
||
k�rx|�sld}nd}|	|7}	|	|_dS)
ax
        do a rollover; in this case, a date/time stamp is appended to the filename
        when the rollover happens.  However, you want the file to be named for the
        start of the interval, not the current time.  If there is a backup count,
        then we have to get a list of matching filenames, sort them and remove
        the one with the oldest suffix.
        Nr,irirrCrDr-r-i��r-i��)r.r/rQrWr`rYrLrJr_rr1ZstrftimerMrrrr2r#r+rqrr3rXrIrO)rrcrfrZZ	timeTupleZdstThenrhr5�srergrrrrtsH





$
z#TimedRotatingFileHandler.doRollover)r>r,rNFFN)	r$r%r&r'r
rXrrqrrrrrr=�s
9Ir=c@s2eZdZdZd
dd�Zdd�Zd	d
�Zdd�ZdS)�WatchedFileHandlera�
    A handler for logging to a file, which watches the file
    to see if it has changed while in use. This can happen because of
    usage of programs such as newsyslog and logrotate which perform
    log file rotation. This handler, intended for use under Unix,
    watches the file to see if it has changed since the last emit.
    (A file has changed if its device or inode have changed.)
    If it has changed, the old file stream is closed, and the file
    opened to get a new stream.

    This handler is not appropriate for use under Windows, because
    under Windows open files cannot be moved or renamed - logging
    opens the files with exclusive locks - and so there is no need
    for such a handler. Furthermore, ST_INO is not supported under
    Windows; stat always returns zero for this value.

    This handler is based on a suggestion and patch by Chad J.
    Schroeder.
    r)NFcCs,tjj|||||�d\|_|_|j�dS)Nr,r-r-)r-r-)rr	r
�dev�ino�_statstream)rrrrrrrrr
�szWatchedFileHandler.__init__cCs0|jr,tj|jj��}|t|t|_|_dS)N)r.r�fstat�filenorrrtru)r�sresrrrrv�szWatchedFileHandler._statstreamcCs�ytj|j�}Wntk
r(d}YnX|sL|t|jksL|t|jkr�|jdk	r�|jj	�|jj
�d|_|j�|_|j�dS)z�
        Reopen log file if needed.

        Checks if the underlying file has changed, and if it
        has, close the old stream and reopen the file to get the
        current stream.
        N)
rrVr1�FileNotFoundErrorrrtrrur.�flushr/r3rv)rryrrr�reopenIfNeeded�s
"



z!WatchedFileHandler.reopenIfNeededcCs|j�tjj||�dS)z�
        Emit a record.

        If underlying file has changed, reopen the file before emitting the
        record to it.
        N)r|rr	r)rrrrrr�szWatchedFileHandler.emit)r)NF)r$r%r&r'r
rvr|rrrrrrs�s

rsc@sReZdZdZdd�Zddd�Zdd�Zd	d
�Zdd�Zd
d�Z	dd�Z
dd�ZdS)�
SocketHandlera
    A handler class which writes logging records, in pickle format, to
    a streaming socket. The socket is kept open across logging calls.
    If the peer resets it, an attempt is made to reconnect on the next call.
    The pickle which is sent is that of the LogRecord's attribute dictionary
    (__dict__), so that the receiver does not need to have the logging module
    installed in order to process the logging event.

    To unpickle the record at the receiving end into a LogRecord, use the
    makeLogRecord function.
    cCsZtjj|�||_||_|dkr(||_n
||f|_d|_d|_d|_d|_	d|_
d|_dS)a
        Initializes the handler with a specific host address and port.

        When the attribute *closeOnError* is set to True - if a socket error
        occurs, the socket is silently closed and then reopened on the next
        logging call.
        NFg�?g>@g@)r�Handlerr
�host�port�address�sock�closeOnError�	retryTime�
retryStart�retryMax�retryFactor)rrr�rrrr
�s
zSocketHandler.__init__r,cCsj|jdk	rtj|j|d�}nJtjtjtj�}|j|�y|j|j�Wntk
rd|j	��YnX|S)zr
        A factory method which allows subclasses to define the precise
        type of socket they want.
        N)�timeout)
r��socketZcreate_connectionr��AF_UNIX�SOCK_STREAMZ
settimeout�connect�OSErrorr/)rr�rrrr�
makeSockets

zSocketHandler.makeSocketcCs�tj�}|jdkrd}n
||jk}|r�y|j�|_d|_WnVtk
r�|jdkr^|j|_n"|j|j|_|j|jkr�|j|_||j|_YnXdS)z�
        Try to create a socket, using an exponential backoff with
        a max retry time. Thanks to Robert Olson for the original patch
        (SF #815911) which has been slightly refactored.
        NT)	rWr�r�r�r�r�ZretryPeriodr�r�)rZnowZattemptrrr�createSocket"s





zSocketHandler.createSocketcCsR|jdkr|j�|jrNy|jj|�Wn$tk
rL|jj�d|_YnXdS)z�
        Send a pickled string to the socket.

        This function allows for partial sends which can happen when the
        network is busy.
        N)r�r��sendallr�r/)rrrrrr�send>s

zSocketHandler.sendcCsj|j}|r|j|�}t|j�}|j�|d<d|d<d|d<|jdd�tj|d�}tj	dt
|��}||S)z�
        Pickles the record in binary format with a length prefix, and
        returns it ready for transmission across the socket.
        r<N�args�exc_info�messager,z>L)r�r8�dict�__dict__Z
getMessage�pop�pickle�dumps�structZpackr;)rrZeiZdummy�drrZslenrrr�
makePickleQs

zSocketHandler.makePicklecCs0|jr|jr|jj�d|_ntjj||�dS)z�
        Handle an error during logging.

        An error has occurred during logging. Most likely cause -
        connection lost. Close the socket so that we can retry on the
        next event.
        N)r�r�r/rr~r)rrrrrrgs
zSocketHandler.handleErrorcCs<y|j|�}|j|�Wntk
r6|j|�YnXdS)a
        Emit a record.

        Pickles the record and writes it to the socket in binary format.
        If there is an error with the socket, silently drop the packet.
        If there was a problem with the socket, re-establishes the
        socket.
        N)r�r�rr)rrrrrrrrus
	
zSocketHandler.emitc
Cs@|j�z(|j}|r"d|_|j�tjj|�Wd|j�XdS)z$
        Closes the socket.
        N)�acquirer�r/rr~�release)rr�rrrr/�szSocketHandler.closeN)r,)r$r%r&r'r
r�r�r�r�rrr/rrrrr}�s
r}c@s(eZdZdZdd�Zdd�Zdd�ZdS)	�DatagramHandlera�
    A handler class which writes logging records, in pickle format, to
    a datagram socket.  The pickle which is sent is that of the LogRecord's
    attribute dictionary (__dict__), so that the receiver does not need to
    have the logging module installed in order to process the logging event.

    To unpickle the record at the receiving end into a LogRecord, use the
    makeLogRecord function.

    cCstj|||�d|_dS)zP
        Initializes the handler with a specific host address and port.
        FN)r}r
r�)rrr�rrrr
�szDatagramHandler.__init__cCs*|jdkrtj}ntj}tj|tj�}|S)zu
        The factory method of SocketHandler is here overridden to create
        a UDP socket (SOCK_DGRAM).
        N)r�r�r�ZAF_INET�
SOCK_DGRAM)rZfamilyrrrrrr��s

zDatagramHandler.makeSocketcCs&|jdkr|j�|jj||j�dS)z�
        Send a pickled string to a socket.

        This function no longer allows for partial sends which can happen
        when the network is busy - UDP does not guarantee delivery and
        can deliver packets out of sequence.
        N)r�r��sendtor�)rrrrrrr��s
zDatagramHandler.sendN)r$r%r&r'r
r�r�rrrrr��s
r�c@s"eZdZdZdZdZdZdZdZdZ	dZ
d	ZdZdZ
dZdZdZdZdZd	Zd
ZdZdZd
ZdZdZdZdZdZdZdZdZeeeeeeee
e	eeed�Z eeeeeeeeeeee
eeeeeeeeed�Z!dddddd�Z"de#fe
dfd d!�Z$d"d#�Z%d$d%�Z&d&d'�Z'd(d)�Z(d*Z)d+Z*d,d-�Z+dS).�
SysLogHandlera
    A handler class which sends formatted logging records to a syslog
    server. Based on Sam Rushing's syslog module:
    http://www.nightmare.com/squirl/python-ext/misc/syslog.py
    Contributed by Nicolas Untz (after which minor refactoring changes
    have been made).
    rr,r6r[r\r]r^rE��	�
���������)ZalertZcrit�critical�debugZemerg�err�error�infoZnoticeZpanic�warn�warning)ZauthZauthprivZcron�daemonZftpZkernZlprZmailZnewsZsecurityZsyslog�userZuucpZlocal0Zlocal1Zlocal2Zlocal3Zlocal4Zlocal5Zlocal6Zlocal7r�r�r�r�r�)�DEBUG�INFO�WARNING�ERROR�CRITICALZ	localhostNcCs0tjj|�||_||_||_t|t�rTd|_y|j	|�Wnt
k
rPYnXn�d|_|dkrhtj}|\}}tj
||d|�}|s�t
d��x�|D]|}|\}}}	}
}d}}
y(tj|||	�}
|tjkr�|
j|�PWq�t
k
�r}z|}|
dk	r�|
j�WYdd}~Xq�Xq�W|dk	�r |�|
|_||_dS)a
        Initialize a handler.

        If address is specified as a string, a UNIX socket is used. To log to a
        local syslogd, "SysLogHandler(address="/dev/log")" can be used.
        If facility is not specified, LOG_USER is used. If socktype is
        specified as socket.SOCK_DGRAM or socket.SOCK_STREAM, that specific
        socket type will be used. For Unix sockets, you can also specify a
        socktype of None, in which case socket.SOCK_DGRAM will be used, falling
        back to socket.SOCK_STREAM.
        TFNrz!getaddrinfo returns an empty list)rr~r
r��facility�socktype�
isinstance�str�
unixsocket�_connect_unixsocketr�r�r�Zgetaddrinfor�r�r/)rr�r�r�rr�Zress�resZaf�proto�_Zsar�r��excrrrr
#sB





zSysLogHandler.__init__cCs�|j}|dkrtj}tjtj|�|_y|jj|�||_Wnxtk
r�|jj�|jdk	r`�tj}tjtj|�|_y|jj|�||_Wn tk
r�|jj��YnXYnXdS)N)r�r�r�r�r�r�r/r�)rr�Zuse_socktyperrrr�Ys&




z!SysLogHandler._connect_unixsocketcCs4t|t�r|j|}t|t�r(|j|}|d>|BS)z�
        Encode the facility and priority. You can pass in strings or
        integers - if strings are passed, the facility_names and
        priority_names mapping dictionaries are used to convert them to
        integers.
        r[)r�r��facility_names�priority_names)rr�Zpriorityrrr�encodePriorityqs




zSysLogHandler.encodePriorityc
Cs2|j�z|jj�tjj|�Wd|j�XdS)z$
        Closes the socket.
        N)r�r�r/rr~r�)rrrrr/~s

zSysLogHandler.closecCs|jj|d�S)aK
        Map a logging level name to a key in the priority_names map.
        This is useful in two scenarios: when custom levels are being
        used, and in the case where you can't do a straightforward
        mapping by lowercasing the logging level name because of locale-
        specific issues (see SF #1524081).
        r�)�priority_map�get)rZ	levelNamerrr�mapPriority�szSysLogHandler.mapPriority�TcCsy�|j|�}|jr|j|}|jr*|d7}d|j|j|j|j��}|jd�}|jd�}||}|jr�y|j	j
|�Wq�tk
r�|j	j�|j
|j�|j	j
|�Yq�Xn*|jt	jkr�|j	j||j�n|j	j|�Wntk
r�|j|�YnXdS)z�
        Emit a record.

        The record is formatted, and then sent to the syslog server. If
        exception information is present, it is NOT sent to the server.
        �z<%d>zutf-8N)r8�ident�
append_nulr�r�r�Z	levelname�encoder�r�r�r�r/r�r�r�r�r�r�rr)rrr<Zpriorrrr�s.





zSysLogHandler.emit),r$r%r&r'Z	LOG_EMERGZ	LOG_ALERTZLOG_CRITZLOG_ERRZLOG_WARNINGZ
LOG_NOTICEZLOG_INFOZ	LOG_DEBUGZLOG_KERNZLOG_USERZLOG_MAILZ
LOG_DAEMONZLOG_AUTHZ
LOG_SYSLOGZLOG_LPRZLOG_NEWSZLOG_UUCPZLOG_CRONZLOG_AUTHPRIVZLOG_FTPZ
LOG_LOCAL0Z
LOG_LOCAL1Z
LOG_LOCAL2Z
LOG_LOCAL3Z
LOG_LOCAL4Z
LOG_LOCAL5Z
LOG_LOCAL6Z
LOG_LOCAL7r�r�r��SYSLOG_UDP_PORTr
r�r�r/r�r�r�rrrrrr��s�5

r�c@s*eZdZdZd
dd�Zdd�Zdd	�ZdS)�SMTPHandlerzK
    A handler class which sends an SMTP email for each logging event.
    N�@cCs�tjj|�t|ttf�r(|\|_|_n|d|_|_t|ttf�rR|\|_|_	nd|_||_
t|t�rn|g}||_||_
||_||_dS)ax
        Initialize the handler.

        Initialize the instance with the from and to addresses and subject
        line of the email. To specify a non-standard SMTP port, use the
        (host, port) tuple format for the mailhost argument. To specify
        authentication credentials, supply a (username, password) tuple
        for the credentials argument. To specify the use of a secure
        protocol (TLS), pass in a tuple for the secure argument. This will
        only be used when authentication credentials are supplied. The tuple
        will be either an empty tuple, or a single-value tuple with the name
        of a keyfile, or a 2-value tuple with the names of the keyfile and
        certificate file. (This tuple is passed to the `starttls` method).
        A timeout in seconds can be specified for the SMTP connection (the
        default is one second).
        N)rr~r
r��list�tuple�mailhost�mailport�username�password�fromaddrr��toaddrs�subject�securer�)rr�r�r�r��credentialsr�r�rrrr
�s
zSMTPHandler.__init__cCs|jS)z�
        Determine the subject for the email.

        If you want to specify a subject line which is record-dependent,
        override this method.
        )r�)rrrrr�
getSubject�szSMTPHandler.getSubjectcCsy�ddl}ddlm}ddl}|j}|s.|j}|j|j||jd�}|�}|j	|d<dj
|j�|d<|j|�|d<|j
j�|d	<|j|j|��|jr�|jdk	r�|j�|j|j�|j�|j|j|j�|j|�|j�Wntk
r�|j|�YnXdS)
zd
        Emit a record.

        Format the record and send it to the specified addressees.
        rN)�EmailMessage)r�ZFrom�,ZToZSubjectZDate)�smtplibZ
email.messager�Zemail.utilsr�Z	SMTP_PORTZSMTPr�r�r�rnr�r�Zutilsr`Zset_contentr8r�r�ZehloZstarttlsZloginr�Zsend_message�quitrr)rrr�r�Zemailr�Zsmtpr<rrrr�s0


zSMTPHandler.emit)NNr�)r$r%r&r'r
r�rrrrrr��s
"	r�c@sBeZdZdZddd�Zdd�Zdd	�Zd
d�Zdd
�Zdd�Z	dS)�NTEventLogHandlera�
    A handler class which sends events to the NT Event Log. Adds a
    registry entry for the specified application name. If no dllname is
    provided, win32service.pyd (which contains some basic message
    placeholders) is used. Note that use of these placeholders will make
    your event logs big, as the entire message source is held in the log.
    If you want slimmer logs, you have to pass in the name of your own DLL
    which contains the message definitions you want to use in the event log.
    N�ApplicationcCs�tjj|�y�ddl}ddl}||_||_|s`tjj	|jj
�}tjj	|d�}tjj|dd�}||_||_
|jj|||�|j|_tj|jtj|jtj|jtj|jtj|ji|_Wn"tk
r�td�d|_YnXdS)Nrzwin32service.pydzWThe Python Win32 extensions for NT (service, event logging) appear not to be available.)rr~r
�win32evtlogutil�win32evtlog�appname�_welurrrj�__file__rn�dllname�logtypeZAddSourceToRegistryZEVENTLOG_ERROR_TYPE�deftyper�ZEVENTLOG_INFORMATION_TYPEr�r�ZEVENTLOG_WARNING_TYPEr�r��typemap�ImportError�print)rr�r�r�r�r�rrrr
s*zNTEventLogHandler.__init__cCsdS)ay
        Return the message ID for the event record. If you are using your
        own messages, you could do this by having the msg passed to the
        logger being an ID rather than a formatting string. Then, in here,
        you could use a dictionary lookup to get the message ID. This
        version returns 1, which is the base message ID in win32service.pyd.
        r,r)rrrrr�getMessageID.szNTEventLogHandler.getMessageIDcCsdS)z�
        Return the event category for the record.

        Override this if you want to specify your own categories. This version
        returns 0.
        rr)rrrrr�getEventCategory8sz"NTEventLogHandler.getEventCategorycCs|jj|j|j�S)a�
        Return the event type for the record.

        Override this if you want to specify your own types. This version does
        a mapping using the handler's typemap attribute, which is set up in
        __init__() to a dictionary which contains mappings for DEBUG, INFO,
        WARNING, ERROR and CRITICAL. If you are using your own levels you will
        either need to override this method or place a suitable dictionary in
        the handler's typemap attribute.
        )r�r��levelnor�)rrrrr�getEventTypeAszNTEventLogHandler.getEventTypecCsn|jrjyD|j|�}|j|�}|j|�}|j|�}|jj|j||||g�Wntk
rh|j|�YnXdS)z�
        Emit a record.

        Determine the message ID, event category and event type. Then
        log the message in the NT event log.
        N)	r�r�r�r�r8ZReportEventr�rr)rr�id�cat�typer<rrrrNs



zNTEventLogHandler.emitcCstjj|�dS)aS
        Clean up this handler.

        You can remove the application name from the registry as a
        source of event log entries. However, if you do this, you will
        not be able to see the events as you intended in the Event Log
        Viewer - it needs to be able to access the registry to get the
        DLL name.
        N)rr~r/)rrrrr/_szNTEventLogHandler.close)Nr�)
r$r%r&r'r
r�r�r�rr/rrrrr�
s	

	
r�c@s*eZdZdZddd�Zdd�Zd	d
�ZdS)�HTTPHandlerz^
    A class which sends records to a Web server, using either GET or
    POST semantics.
    �GETFNcCsbtjj|�|j�}|dkr$td��|r:|dk	r:td��||_||_||_||_||_	||_
dS)zr
        Initialize the instance with the host, the request URL, and the method
        ("GET" or "POST")
        r��POSTzmethod must be GET or POSTNz3context parameter only makes sense with secure=True)r�r�)rr~r
rHrPr�url�methodr�r��context)rrr�r�r�r�r�rrrr
qszHTTPHandler.__init__cCs|jS)z�
        Default implementation of mapping the log record into a dict
        that is sent as the CGI data. Overwrite in your class.
        Contributed by Franz Glasner.
        )r�)rrrrr�mapLogRecord�szHTTPHandler.mapLogRecordcCsx�yPddl}ddl}|j}|jr4|jj||jd�}n|jj|�}|j}|j	j
|j|��}|jdkr�|j
d�dkrvd}nd}|d||f}|j|j|�|j
d�}	|	dkr�|d|	�}|jd	kr�|jd
d�|jdtt|���|j�r$ddl}
d
|jjd�}d|
j|�j�jd�}|jd|�|j�|jd	k�rH|j|jd��|j�Wn tk
�rr|j|�YnXdS)zk
        Emit a record.

        Send the record to the Web server as a percent-encoded dictionary
        rN)r�r��?�&z%c%s�:r�zContent-typez!application/x-www-form-urlencodedzContent-lengthz%s:%szutf-8zBasic �asciiZ
Authorization)Zhttp.clientZurllib.parserr�ZclientZHTTPSConnectionr�ZHTTPConnectionr��parseZ	urlencoder�r��findZ
putrequestZ	putheaderr�r;r��base64r�Z	b64encode�strip�decodeZ
endheadersr�Zgetresponserr)rrZhttpZurllibrr>r��data�sepr4rrrrrrr�s@


zHTTPHandler.emit)r�FNN)r$r%r&r'r
r�rrrrrr�ls

r�c@s8eZdZdZdd�Zdd�Zdd�Zdd	�Zd
d�ZdS)
�BufferingHandlerz�
  A handler class which buffers logging records in memory. Whenever each
  record is added to the buffer, a check is made to see if the buffer should
  be flushed. If it should, then flush() is expected to do what's needed.
    cCstjj|�||_g|_dS)z>
        Initialize the handler with the buffer size.
        N)rr~r
�capacity�buffer)rrrrrr
�szBufferingHandler.__init__cCst|j�|jkS)z�
        Should the handler flush its buffer?

        Returns true if the buffer is up to capacity. This method can be
        overridden to implement custom flushing strategies.
        )r;r
r)rrrrr�shouldFlush�szBufferingHandler.shouldFlushcCs"|jj|�|j|�r|j�dS)z�
        Emit a record.

        Append the record. If shouldFlush() tells us to, call flush() to process
        the buffer.
        N)r
rmrr{)rrrrrr�s
zBufferingHandler.emitc
Cs"|j�z
g|_Wd|j�XdS)zw
        Override to implement custom flushing behaviour.

        This version just zaps the buffer to empty.
        N)r�r
r�)rrrrr{�s
zBufferingHandler.flushcCs z|j�Wdtjj|�XdS)zp
        Close the handler.

        This version just flushes and chains to the parent class' close().
        N)r{rr~r/)rrrrr/�szBufferingHandler.closeN)	r$r%r&r'r
rrr{r/rrrrr�s	rc@sBeZdZdZejddfdd�Zdd�Zdd	�Zd
d�Z	dd
�Z
dS)�
MemoryHandlerz�
    A handler class which buffers logging records in memory, periodically
    flushing them to a target handler. Flushing occurs whenever the buffer
    is full, or when an event of a certain severity or greater is seen.
    NTcCs"tj||�||_||_||_dS)a;
        Initialize the handler with the buffer size, the level at which
        flushing should occur and an optional target.

        Note that without a target being set either here or via setTarget(),
        a MemoryHandler is no use to anyone!

        The ``flushOnClose`` argument is ``True`` for backward compatibility
        reasons - the old behaviour is that when the handler is closed, the
        buffer is flushed, even if the flush level hasn't been exceeded nor the
        capacity exceeded. To prevent this, set ``flushOnClose`` to ``False``.
        N)rr
�
flushLevel�target�flushOnClose)rrrrrrrrr
�szMemoryHandler.__init__cCst|j�|jkp|j|jkS)zP
        Check for buffer full or a record at the flushLevel or higher.
        )r;r
rr�r)rrrrrrszMemoryHandler.shouldFlushcCs
||_dS)z:
        Set the target handler for this handler.
        N)r)rrrrr�	setTargetszMemoryHandler.setTargetc
CsD|j�z,|jr2x|jD]}|jj|�qWg|_Wd|j�XdS)z�
        For a MemoryHandler, flushing means just sending the buffered
        records to the target, if there is one. Override if you want
        different behaviour.

        The record buffer is also cleared by this operation.
        N)r�rr
�handler�)rrrrrr{s
zMemoryHandler.flushcCsBz|jr|j�Wd|j�zd|_tj|�Wd|j�XXdS)zi
        Flush, if appropriately configured, set the target to None and lose the
        buffer.
        N)rr{r�rrr/r�)rrrrr/,szMemoryHandler.close)r$r%r&r'rr�r
rrr{r/rrrrr�src@s0eZdZdZdd�Zdd�Zdd�Zdd	�Zd
S)�QueueHandlera�
    This handler sends events to a queue. Typically, it would be used together
    with a multiprocessing Queue to centralise logging to file in one process
    (in a multi-process application), so as to avoid file write contention
    between processes.

    This code is new in Python 3.2, but this class can be copy pasted into
    user code for use with earlier Python versions.
    cCstjj|�||_dS)zA
        Initialise an instance, using the passed queue.
        N)rr~r
�queue)rrrrrr
HszQueueHandler.__init__cCs|jj|�dS)z�
        Enqueue a record.

        The base implementation uses put_nowait. You may want to override
        this method if you want to use blocking, timeouts or custom queue
        implementations.
        N)r�
put_nowait)rrrrr�enqueueOszQueueHandler.enqueuecCs"|j|�|j|_d|_d|_|S)a�
        Prepares a record for queuing. The object returned by this method is
        enqueued.

        The base implementation formats the record to merge the message
        and arguments, and removes unpickleable items from the record
        in-place.

        You might want to override this method if you want to convert
        the record to a dict or JSON string, or send a modified copy
        of the record while leaving the original intact.
        N)r8r�r<r�r�)rrrrr�prepareYs

zQueueHandler.preparecCs8y|j|j|��Wntk
r2|j|�YnXdS)zm
        Emit a record.

        Writes the LogRecord to the queue, preparing it for pickling first.
        N)rrrr)rrrrrrrszQueueHandler.emitN)r$r%r&r'r
rrrrrrrr=s
	
rc@sZeZdZdZdZdd�dd�Zdd�Zd	d
�Zdd�Zd
d�Z	dd�Z
dd�Zdd�ZdS)�
QueueListenerz�
        This class implements an internal threaded listener which watches for
        LogRecords being added to a queue, removes them and passes them to a
        list of handlers for processing.
        NF)�respect_handler_levelcGs||_||_d|_||_dS)zc
            Initialise an instance with the specified queue and
            handlers.
            N)r�handlers�_threadr)rrrrrrrr
�szQueueListener.__init__cCs|jj|�S)z�
            Dequeue a record and return it, optionally blocking.

            The base implementation uses get. You may want to override this method
            if you want to use timeouts or work with custom queue implementations.
            )rr�)r�blockrrr�dequeue�szQueueListener.dequeuecCs&tj|jd�|_}d|_|j�dS)z�
            Start the listener.

            This starts up a background thread to monitor the queue for
            LogRecords to process.
            )rTN)�	threadingZThread�_monitorrr��start)rrZrrrr"�szQueueListener.startcCs|S)a
            Prepare a record for handling.

            This method just returns the passed-in record. You may want to
            override this method if you need to do any custom marshalling or
            manipulation of the record before passing it to the handlers.
            r)rrrrrr�szQueueListener.preparecCsD|j|�}x4|jD]*}|js"d}n|j|jk}|r|j|�qWdS)z�
            Handle a record.

            This just loops through the handlers offering them the record
            to handle.
            TN)rrrr��levelr)rrZhandlerZprocessrrrr�s
zQueueListener.handlecCsd|j}t|d�}xNy0|jd�}||jkr*P|j|�|r@|j�Wqtjk
rZPYqXqWdS)z�
            Monitor the queue for records, and ask the handler
            to deal with them.

            This method runs on a separate, internal thread.
            The thread will terminate if it sees a sentinel object in the queue.
            �	task_doneTN)r�hasattrr�	_sentinelrr$ZEmpty)r�qZ
has_task_donerrrrr!�s



zQueueListener._monitorcCs|jj|j�dS)a
            This is used to enqueue the sentinel record.

            The base implementation uses put_nowait. You may want to override this
            method if you want to use timeouts or work with custom queue
            implementations.
            N)rrr&)rrrr�enqueue_sentinel�szQueueListener.enqueue_sentinelcCs|j�|jj�d|_dS)a!
            Stop the listener.

            This asks the thread to terminate, and then waits for it to do so.
            Note that if you don't call this before your application exits, there
            may be some records still left on the queue, which won't be processed.
            N)r(rrn)rrrr�stop�s
zQueueListener.stop)
r$r%r&r'r&r
rr"rrr!r(r)rrrrr~s
	

ri�i�Q)'r'rr�rr�r�rWrSrVrrrrr r�ZDEFAULT_TCP_LOGGING_PORTZDEFAULT_UDP_LOGGING_PORTZDEFAULT_HTTP_LOGGING_PORTZDEFAULT_SOAP_LOGGING_PORTr�ZSYSLOG_TCP_PORTrar	rr(r=rsr~r}r�r�r�r�r�rrr�objectrrrrr�<module>sB8
FOcE(*PbO9I@__pycache__/handlers.cpython-36.opt-2.pyc000064400000057511150327210640014153 0ustar003

�\dhI��@s�ddlZddlZddlZddlZddlZddlZddlZddlmZm	Z	m
Z
ddlZyddlZWne
k
rxdZYnXdZdZdZdZdZdZd'ZGd
d�dej�ZGdd
�d
e�ZGdd�de�ZGdd�dej�ZGdd�dej�ZGdd�de�ZGdd�dej�ZGdd�dej�ZGdd�dej�ZGdd�dej�Z Gdd�dej�Z!Gd d!�d!e!�Z"Gd"d#�d#ej�Z#e�r�Gd$d%�d%e$�Z%dS)(�N)�ST_DEV�ST_INO�ST_MTIMEi<#i=#i>#i?#i��<c@s.eZdZddd�Zdd�Zdd�Zd	d
�ZdS)�BaseRotatingHandlerNFcCs0tjj|||||�||_||_d|_d|_dS)N)�logging�FileHandler�__init__�mode�encoding�namer�rotator)�self�filenamerr�delay�r�(/usr/lib64/python3.6/logging/handlers.pyr
5s
zBaseRotatingHandler.__init__cCsHy$|j|�r|j�tjj||�Wntk
rB|j|�YnXdS)N)�shouldRollover�
doRolloverrr	�emit�	Exception�handleError)r�recordrrrr?s
zBaseRotatingHandler.emitcCst|j�s|}n
|j|�}|S)N)�callabler
)rZdefault_name�resultrrr�rotation_filenameMs

z%BaseRotatingHandler.rotation_filenamecCs4t|j�s$tjj|�r0tj||�n|j||�dS)N)rr�os�path�exists�rename)r�source�destrrr�rotate`s
zBaseRotatingHandler.rotate)NF)�__name__�
__module__�__qualname__r
rrr#rrrrr/s

rc@s&eZdZddd�Zdd�Zd	d
�ZdS)�RotatingFileHandler�arNFcCs.|dkrd}tj|||||�||_||_dS)Nrr()rr
�maxBytes�backupCount)rrrr)r*rrrrrr
zs
zRotatingFileHandler.__init__cCs�|jr|jj�d|_|jdkr�xtt|jddd�D]^}|jd|j|f�}|jd|j|df�}tjj|�r4tjj|�r�tj	|�tj
||�q4W|j|jd�}tjj|�r�tj	|�|j|j|�|js�|j
�|_dS)Nr�z%s.%dz.1���)�stream�closer*�ranger�baseFilenamerrr�remover r#r�_open)r�iZsfn�dfnrrrr�s$




zRotatingFileHandler.doRollovercCs|tjj|j�r"tjj|j�r"dS|jdkr6|j�|_|jdkrxd|j|�}|jj	dd�|jj
�t|�|jkrxdSdS)NFrz%s
�T)rrrr0�isfiler-r2r)�format�seek�tell�len)rr�msgrrrr�s


z"RotatingFileHandler.shouldRollover)r(rrNF)r$r%r&r
rrrrrrr'us
 r'c@s6eZdZddd�Zdd	�Zd
d�Zdd
�Zdd�ZdS)�TimedRotatingFileHandler�hr+rNFc	
Cs�tj||d||�|j�|_||_||_||_|jdkrNd|_d|_d|_	�n�|jdkrld|_d|_d	|_	n�|jd
kr�d|_d|_d|_	n�|jd
ks�|jdkr�d|_d|_d|_	n�|jj
d��r.d|_t|j�dkr�td|j��|jddk�s|jddk�rtd|j��t
|jd�|_d|_d|_	ntd|j��tj|j	tj�|_	|j||_|j}tjj|��r~tj|�t}	nt
tj��}	|j|	�|_dS) Nr(�Sr+z%Y-%m-%d_%H-%M-%Sz-^\d{4}-\d{2}-\d{2}_\d{2}-\d{2}-\d{2}(\.\w+)?$�Mrz%Y-%m-%d_%H-%Mz'^\d{4}-\d{2}-\d{2}_\d{2}-\d{2}(\.\w+)?$�Hz%Y-%m-%d_%Hz!^\d{4}-\d{2}-\d{2}_\d{2}(\.\w+)?$�D�MIDNIGHTrz%Y-%m-%dz^\d{4}-\d{2}-\d{2}(\.\w+)?$�W�r5zHYou must specify a day for weekly rollover from 0 to 6 (0 is Monday): %s�0�6z-Invalid day specified for weekly rollover: %sz'Invalid rollover interval specified: %siii�Qii�Qi�:	)rr
�upper�whenr*�utc�atTime�interval�suffix�extMatch�
startswithr:�
ValueError�int�	dayOfWeek�re�compile�ASCIIr0rrr�statr�time�computeRollover�
rolloverAt)
rrrHrKr*rrrIrJ�trrrr
�sL




 z!TimedRotatingFileHandler.__init__cCsd||j}|jdks"|jjd��r`|jr4tj|�}n
tj|�}|d}|d}|d}|d}|jdkrnt}n |jj	d|jj
d|jj}||d|d|}	|	dkr�|	t7}	|d	d
}||	}|jjd��r`|}
|
|jk�r`|
|jkr�|j|
}nd|
|jd	}||d}|j�s\|d}
tj|�d}|
|k�r\|
�sPd}nd}||7}|}|S)NrBrC����rrr+rDriii�Qr,r,i��)
rKrHrNrIrV�gmtime�	localtimerJ�	_MIDNIGHTZhourZminute�secondrQ)r�currentTimerrYZcurrentHourZ
currentMinuteZ
currentSecondZ
currentDayZ	rotate_ts�rZdayZ
daysToWait�
newRolloverAt�dstNow�
dstAtRollover�addendrrrrWsH





z(TimedRotatingFileHandler.computeRollovercCs@tjj|j�r"tjj|j�r"dSttj��}||jkr<dSdS)NFT)rrrr0r6rPrVrX)rrrYrrrrNs
z'TimedRotatingFileHandler.shouldRolloverc	Cs�tjj|j�\}}tj|�}g}|d}t|�}xH|D]@}|d|�|kr6||d�}|jj|�r6|jtjj	||��q6Wt|�|j
kr�g}n|j�|dt|�|j
�}|S)N�.)rr�splitr0�listdirr:rM�match�append�joinr*�sort)	rZdirNameZbaseNameZ	fileNamesr�prefixZplenZfileNamerLrrr�getFilesToDelete]s

z)TimedRotatingFileHandler.getFilesToDeletecCs�|jr|jj�d|_ttj��}tj|�d}|j|j}|jrNtj|�}n6tj|�}|d}||kr�|rrd}nd	}tj||�}|j	|j
dtj|j|��}t
jj|�r�t
j|�|j|j
|�|jdkr�x|j�D]}t
j|�q�W|j�s�|j�|_|j|�}	x|	|k�r"|	|j}	�q
W|jdk�s>|jjd��rx|j�rxtj|	�d
}
||
k�rx|�sld}nd}|	|7}	|	|_dS)Nr+irhrrBrCr,r,i��r,i��)r-r.rPrVr_rXrKrIr^rr0ZstrftimerLrrrr1r#r*rprr2rWrHrN)rrbrerYZ	timeTupleZdstThenrgr4�srdrfrrrrtsH





$
z#TimedRotatingFileHandler.doRollover)r=r+rNFFN)r$r%r&r
rWrrprrrrrr<�s

9Ir<c@s.eZdZddd�Zdd�Zdd	�Zd
d�ZdS)
�WatchedFileHandlerr(NFcCs,tjj|||||�d\|_|_|j�dS)Nr+r,r,)r,r,)rr	r
�dev�ino�_statstream)rrrrrrrrr
�szWatchedFileHandler.__init__cCs0|jr,tj|jj��}|t|t|_|_dS)N)r-r�fstat�filenorrrsrt)r�sresrrrru�szWatchedFileHandler._statstreamcCs�ytj|j�}Wntk
r(d}YnX|sL|t|jksL|t|jkr�|jdk	r�|jj	�|jj
�d|_|j�|_|j�dS)N)
rrUr0�FileNotFoundErrorrrsrrtr-�flushr.r2ru)rrxrrr�reopenIfNeeded�s
"



z!WatchedFileHandler.reopenIfNeededcCs|j�tjj||�dS)N)r{rr	r)rrrrrr�szWatchedFileHandler.emit)r(NF)r$r%r&r
rur{rrrrrrr�s
rrc@sNeZdZdd�Zddd�Zdd�Zdd	�Zd
d�Zdd
�Zdd�Z	dd�Z
dS)�
SocketHandlercCsZtjj|�||_||_|dkr(||_n
||f|_d|_d|_d|_d|_	d|_
d|_dS)NFg�?g>@g@)r�Handlerr
�host�port�address�sock�closeOnError�	retryTime�
retryStart�retryMax�retryFactor)rr~rrrrr
�s
zSocketHandler.__init__r+cCsj|jdk	rtj|j|d�}nJtjtjtj�}|j|�y|j|j�Wntk
rd|j	��YnX|S)N)�timeout)
r�socketZcreate_connectionr��AF_UNIX�SOCK_STREAMZ
settimeout�connect�OSErrorr.)rr�rrrr�
makeSockets

zSocketHandler.makeSocketcCs�tj�}|jdkrd}n
||jk}|r�y|j�|_d|_WnVtk
r�|jdkr^|j|_n"|j|j|_|j|jkr�|j|_||j|_YnXdS)NT)	rVr�r�r�r�r�ZretryPeriodr�r�)rZnowZattemptrrr�createSocket"s





zSocketHandler.createSocketcCsR|jdkr|j�|jrNy|jj|�Wn$tk
rL|jj�d|_YnXdS)N)r�r��sendallr�r.)rrqrrr�send>s

zSocketHandler.sendcCsj|j}|r|j|�}t|j�}|j�|d<d|d<d|d<|jdd�tj|d�}tj	dt
|��}||S)Nr;�args�exc_info�messager+z>L)r�r7�dict�__dict__Z
getMessage�pop�pickle�dumps�structZpackr:)rrZeiZdummy�drqZslenrrr�
makePickleQs

zSocketHandler.makePicklecCs0|jr|jr|jj�d|_ntjj||�dS)N)r�r�r.rr}r)rrrrrrgs
zSocketHandler.handleErrorcCs<y|j|�}|j|�Wntk
r6|j|�YnXdS)N)r�r�rr)rrrqrrrrus
	
zSocketHandler.emitc
Cs@|j�z(|j}|r"d|_|j�tjj|�Wd|j�XdS)N)�acquirer�r.rr}�release)rr�rrrr.�szSocketHandler.closeN)r+)r$r%r&r
r�r�r�r�rrr.rrrrr|�s

r|c@s$eZdZdd�Zdd�Zdd�ZdS)�DatagramHandlercCstj|||�d|_dS)NF)r|r
r�)rr~rrrrr
�szDatagramHandler.__init__cCs*|jdkrtj}ntj}tj|tj�}|S)N)rr�r�ZAF_INET�
SOCK_DGRAM)rZfamilyrqrrrr��s

zDatagramHandler.makeSocketcCs&|jdkr|j�|jj||j�dS)N)r�r��sendtor�)rrqrrrr��s
zDatagramHandler.sendN)r$r%r&r
r�r�rrrrr��sr�c@seZdZdZdZdZdZdZdZdZ	dZ
dZdZdZ
dZdZdZdZdZd	Zd
ZdZdZd
ZdZdZdZdZdZdZdZeeee
eeee	eeeed�Zeeeeeeee
eeeeeeeeeeeeed�Z dddddd�Z!de"fedfdd �Z#d!d"�Z$d#d$�Z%d%d&�Z&d'd(�Z'd)Z(d*Z)d+d,�Z*dS)-�
SysLogHandlerrr+r5rZr[r\r]rD��	�
���������)ZalertZcrit�critical�debugZemerg�err�error�infoZnoticeZpanic�warn�warning)ZauthZauthprivZcron�daemonZftpZkernZlprZmailZnewsZsecurityZsyslog�userZuucpZlocal0Zlocal1Zlocal2Zlocal3Zlocal4Zlocal5Zlocal6Zlocal7r�r�r�r�r�)�DEBUG�INFO�WARNING�ERROR�CRITICALZ	localhostNcCs0tjj|�||_||_||_t|t�rTd|_y|j	|�Wnt
k
rPYnXn�d|_|dkrhtj}|\}}tj
||d|�}|s�t
d��x�|D]|}|\}}}	}
}d}}
y(tj|||	�}
|tjkr�|
j|�PWq�t
k
�r}z|}|
dk	r�|
j�WYdd}~Xq�Xq�W|dk	�r |�|
|_||_dS)NTFrz!getaddrinfo returns an empty list)rr}r
r��facility�socktype�
isinstance�str�
unixsocket�_connect_unixsocketr�r�r�Zgetaddrinfor�r�r.)rr�r�r�r~rZress�resZaf�proto�_Zsar�r��excrrrr
#sB





zSysLogHandler.__init__cCs�|j}|dkrtj}tjtj|�|_y|jj|�||_Wnxtk
r�|jj�|jdk	r`�tj}tjtj|�|_y|jj|�||_Wn tk
r�|jj��YnXYnXdS)N)r�r�r�r�r�r�r.r�)rr�Zuse_socktyperrrr�Ys&




z!SysLogHandler._connect_unixsocketcCs4t|t�r|j|}t|t�r(|j|}|d>|BS)NrZ)r�r��facility_names�priority_names)rr�Zpriorityrrr�encodePriorityqs




zSysLogHandler.encodePriorityc
Cs2|j�z|jj�tjj|�Wd|j�XdS)N)r�r�r.rr}r�)rrrrr.~s

zSysLogHandler.closecCs|jj|d�S)Nr�)�priority_map�get)rZ	levelNamerrr�mapPriority�szSysLogHandler.mapPriority�TcCsy�|j|�}|jr|j|}|jr*|d7}d|j|j|j|j��}|jd�}|jd�}||}|jr�y|j	j
|�Wq�tk
r�|j	j�|j
|j�|j	j
|�Yq�Xn*|jt	jkr�|j	j||j�n|j	j|�Wntk
r�|j|�YnXdS)N�z<%d>zutf-8)r7�ident�
append_nulr�r�r�Z	levelname�encoder�r�r�r�r.r�r�r�r�r�r�rr)rrr;Zpriorrrr�s.





zSysLogHandler.emit)+r$r%r&Z	LOG_EMERGZ	LOG_ALERTZLOG_CRITZLOG_ERRZLOG_WARNINGZ
LOG_NOTICEZLOG_INFOZ	LOG_DEBUGZLOG_KERNZLOG_USERZLOG_MAILZ
LOG_DAEMONZLOG_AUTHZ
LOG_SYSLOGZLOG_LPRZLOG_NEWSZLOG_UUCPZLOG_CRONZLOG_AUTHPRIVZLOG_FTPZ
LOG_LOCAL0Z
LOG_LOCAL1Z
LOG_LOCAL2Z
LOG_LOCAL3Z
LOG_LOCAL4Z
LOG_LOCAL5Z
LOG_LOCAL6Z
LOG_LOCAL7r�r�r��SYSLOG_UDP_PORTr
r�r�r.r�r�r�rrrrrr��s�5

r�c@s&eZdZd	dd�Zdd�Zdd�ZdS)
�SMTPHandlerN�@cCs�tjj|�t|ttf�r(|\|_|_n|d|_|_t|ttf�rR|\|_|_	nd|_||_
t|t�rn|g}||_||_
||_||_dS)N)rr}r
r��list�tuple�mailhost�mailport�username�password�fromaddrr��toaddrs�subject�securer�)rr�r�r�r��credentialsr�r�rrrr
�s
zSMTPHandler.__init__cCs|jS)N)r�)rrrrr�
getSubject�szSMTPHandler.getSubjectcCsy�ddl}ddlm}ddl}|j}|s.|j}|j|j||jd�}|�}|j	|d<dj
|j�|d<|j|�|d<|j
j�|d<|j|j|��|jr�|jdk	r�|j�|j|j�|j�|j|j|j�|j|�|j�Wntk
r�|j|�YnXdS)	Nr)�EmailMessage)r�ZFrom�,ZToZSubjectZDate)�smtplibZ
email.messager�Zemail.utilsr�Z	SMTP_PORTZSMTPr�r�r�rmr�r�Zutilsr_Zset_contentr7r�r�ZehloZstarttlsZloginr�Zsend_message�quitrr)rrr�r�ZemailrZsmtpr;rrrr�s0


zSMTPHandler.emit)NNr�)r$r%r&r
r�rrrrrr��s
"	r�c@s>eZdZddd�Zdd�Zdd�Zd	d
�Zdd�Zd
d�ZdS)�NTEventLogHandlerN�ApplicationcCs�tjj|�y�ddl}ddl}||_||_|s`tjj	|jj
�}tjj	|d�}tjj|dd�}||_||_
|jj|||�|j|_tj|jtj|jtj|jtj|jtj|ji|_Wn"tk
r�td�d|_YnXdS)Nrzwin32service.pydzWThe Python Win32 extensions for NT (service, event logging) appear not to be available.)rr}r
�win32evtlogutil�win32evtlog�appname�_welurrri�__file__rm�dllname�logtypeZAddSourceToRegistryZEVENTLOG_ERROR_TYPE�deftyper�ZEVENTLOG_INFORMATION_TYPEr�r�ZEVENTLOG_WARNING_TYPEr�r��typemap�ImportError�print)rr�r�r�r�r�rrrr
s*zNTEventLogHandler.__init__cCsdS)Nr+r)rrrrr�getMessageID.szNTEventLogHandler.getMessageIDcCsdS)Nrr)rrrrr�getEventCategory8sz"NTEventLogHandler.getEventCategorycCs|jj|j|j�S)N)r�r��levelnor�)rrrrr�getEventTypeAszNTEventLogHandler.getEventTypecCsn|jrjyD|j|�}|j|�}|j|�}|j|�}|jj|j||||g�Wntk
rh|j|�YnXdS)N)	r�r�r�r�r7ZReportEventr�rr)rr�id�cat�typer;rrrrNs



zNTEventLogHandler.emitcCstjj|�dS)N)rr}r.)rrrrr._szNTEventLogHandler.close)Nr�)	r$r%r&r
r�r�r�rr.rrrrr�
s


	
r�c@s&eZdZd
dd�Zdd�Zdd	�ZdS)�HTTPHandler�GETFNcCsbtjj|�|j�}|dkr$td��|r:|dk	r:td��||_||_||_||_||_	||_
dS)Nr��POSTzmethod must be GET or POSTz3context parameter only makes sense with secure=True)r�r�)rr}r
rGrOr~�url�methodr�r��context)rr~r�r�r�r�r�rrrr
qszHTTPHandler.__init__cCs|jS)N)r�)rrrrr�mapLogRecord�szHTTPHandler.mapLogRecordcCsx�yPddl}ddl}|j}|jr4|jj||jd�}n|jj|�}|j}|j	j
|j|��}|jdkr�|j
d�dkrvd}nd}|d||f}|j|j|�|j
d�}	|	dkr�|d|	�}|jdkr�|jd	d
�|jdtt|���|j�r$ddl}
d|jjd
�}d|
j|�j�jd�}|jd|�|j�|jdk�rH|j|jd
��|j�Wn tk
�rr|j|�YnXdS)Nr)r�r��?�&z%c%s�:r�zContent-typez!application/x-www-form-urlencodedzContent-lengthz%s:%szutf-8zBasic �asciiZ
Authorization)Zhttp.clientZurllib.parser~r�ZclientZHTTPSConnectionr�ZHTTPConnectionr��parseZ	urlencoder�r��findZ
putrequestZ	putheaderr�r:r��base64r�Z	b64encode�strip�decodeZ
endheadersr�Zgetresponserr)rrZhttpZurllibr~r=r��data�sepr3rrqrrrr�s@


zHTTPHandler.emit)r�FNN)r$r%r&r
r�rrrrrr�ls
r�c@s4eZdZdd�Zdd�Zdd�Zdd�Zd	d
�ZdS)�BufferingHandlercCstjj|�||_g|_dS)N)rr}r
�capacity�buffer)rrrrrr
�szBufferingHandler.__init__cCst|j�|jkS)N)r:rr)rrrrr�shouldFlush�szBufferingHandler.shouldFlushcCs"|jj|�|j|�r|j�dS)N)rrlr
rz)rrrrrr�s
zBufferingHandler.emitc
Cs"|j�z
g|_Wd|j�XdS)N)r�rr�)rrrrrz�s
zBufferingHandler.flushcCs z|j�Wdtjj|�XdS)N)rzrr}r.)rrrrr.�szBufferingHandler.closeN)r$r%r&r
r
rrzr.rrrrr
�s
	r
c@s>eZdZejddfdd�Zdd�Zdd�Zd	d
�Zdd�Z	dS)
�
MemoryHandlerNTcCs"tj||�||_||_||_dS)N)r
r
�
flushLevel�target�flushOnClose)rrrrrrrrr
�szMemoryHandler.__init__cCst|j�|jkp|j|jkS)N)r:rrr�r)rrrrrr
szMemoryHandler.shouldFlushcCs
||_dS)N)r)rrrrr�	setTargetszMemoryHandler.setTargetc
CsD|j�z,|jr2x|jD]}|jj|�qWg|_Wd|j�XdS)N)r�rr�handler�)rrrrrrzs
zMemoryHandler.flushcCsBz|jr|j�Wd|j�zd|_tj|�Wd|j�XXdS)N)rrzr�rr
r.r�)rrrrr.,szMemoryHandler.close)
r$r%r&rr�r
r
rrzr.rrrrr�src@s,eZdZdd�Zdd�Zdd�Zdd�Zd	S)
�QueueHandlercCstjj|�||_dS)N)rr}r
�queue)rrrrrr
HszQueueHandler.__init__cCs|jj|�dS)N)r�
put_nowait)rrrrr�enqueueOszQueueHandler.enqueuecCs"|j|�|j|_d|_d|_|S)N)r7r�r;r�r�)rrrrr�prepareYs

zQueueHandler.preparecCs8y|j|j|��Wntk
r2|j|�YnXdS)N)rrrr)rrrrrrrszQueueHandler.emitN)r$r%r&r
rrrrrrrr=s
rc@sVeZdZdZdd�dd�Zdd�Zdd	�Zd
d�Zdd
�Zdd�Z	dd�Z
dd�ZdS)�
QueueListenerNF)�respect_handler_levelcGs||_||_d|_||_dS)N)r�handlers�_threadr)rrrrrrrr
�szQueueListener.__init__cCs|jj|�S)N)rr�)r�blockrrr�dequeue�szQueueListener.dequeuecCs&tj|jd�|_}d|_|j�dS)N)rT)�	threadingZThread�_monitorrr��start)rrYrrrr!�szQueueListener.startcCs|S)Nr)rrrrrr�szQueueListener.preparecCsD|j|�}x4|jD]*}|js"d}n|j|jk}|r|j|�qWdS)NT)rrrr��levelr)rrZhandlerZprocessrrrr�s
zQueueListener.handlecCsd|j}t|d�}xNy0|jd�}||jkr*P|j|�|r@|j�Wqtjk
rZPYqXqWdS)N�	task_doneT)r�hasattrr�	_sentinelrr#ZEmpty)r�qZ
has_task_donerrrrr �s



zQueueListener._monitorcCs|jj|j�dS)N)rrr%)rrrr�enqueue_sentinel�szQueueListener.enqueue_sentinelcCs|j�|jj�d|_dS)N)r'rrm)rrrr�stop�s
zQueueListener.stop)r$r%r&r%r
rr!rrr r'r(rrrrr~s
	

ri�i�Q)&rr�rr�r�rVrRrUrrrrrr�ZDEFAULT_TCP_LOGGING_PORTZDEFAULT_UDP_LOGGING_PORTZDEFAULT_HTTP_LOGGING_PORTZDEFAULT_SOAP_LOGGING_PORTr�ZSYSLOG_TCP_PORTr`r	rr'r<rrr}r|r�r�r�r�r�r
rr�objectrrrrr�<module>s@8
FOcE(*PbO9I@__pycache__/handlers.cpython-36.opt-1.pyc000064400000124554150327210640014154 0ustar003

�\dhI��@s�dZddlZddlZddlZddlZddlZddlZddlZddlm	Z	m
Z
mZddlZyddl
Z
Wnek
r|dZ
YnXdZdZdZdZdZdZd(ZGdd�dej�ZGd
d�de�ZGdd�de�ZGdd�dej�ZGdd�dej�ZGdd�de�ZGdd�dej�ZGdd�dej�ZGdd�dej�Z Gdd�dej�Z!Gdd �d ej�Z"Gd!d"�d"e"�Z#Gd#d$�d$ej�Z$e
�r�Gd%d&�d&e%�Z&dS))z�
Additional handlers for the logging package for Python. The core package is
based on PEP 282 and comments thereto in comp.lang.python.

Copyright (C) 2001-2016 Vinay Sajip. All Rights Reserved.

To use, simply 'import logging.handlers' and log away!
�N)�ST_DEV�ST_INO�ST_MTIMEi<#i=#i>#i?#i��<c@s2eZdZdZddd�Zdd�Zdd	�Zd
d�ZdS)
�BaseRotatingHandlerz�
    Base class for handlers that rotate log files at a certain point.
    Not meant to be instantiated directly.  Instead, use RotatingFileHandler
    or TimedRotatingFileHandler.
    NFcCs0tjj|||||�||_||_d|_d|_dS)zA
        Use the specified filename for streamed logging
        N)�logging�FileHandler�__init__�mode�encoding�namer�rotator)�self�filenamerr�delay�r�(/usr/lib64/python3.6/logging/handlers.pyr
5s
zBaseRotatingHandler.__init__cCsHy$|j|�r|j�tjj||�Wntk
rB|j|�YnXdS)z�
        Emit a record.

        Output the record to the file, catering for rollover as described
        in doRollover().
        N)�shouldRollover�
doRolloverrr	�emit�	Exception�handleError)r�recordrrrr?s
zBaseRotatingHandler.emitcCst|j�s|}n
|j|�}|S)a�
        Modify the filename of a log file when rotating.

        This is provided so that a custom filename can be provided.

        The default implementation calls the 'namer' attribute of the
        handler, if it's callable, passing the default name to
        it. If the attribute isn't callable (the default is None), the name
        is returned unchanged.

        :param default_name: The default name for the log file.
        )�callabler
)rZdefault_name�resultrrr�rotation_filenameMs

z%BaseRotatingHandler.rotation_filenamecCs4t|j�s$tjj|�r0tj||�n|j||�dS)aL
        When rotating, rotate the current log.

        The default implementation calls the 'rotator' attribute of the
        handler, if it's callable, passing the source and dest arguments to
        it. If the attribute isn't callable (the default is None), the source
        is simply renamed to the destination.

        :param source: The source filename. This is normally the base
                       filename, e.g. 'test.log'
        :param dest:   The destination filename. This is normally
                       what the source is rotated to, e.g. 'test.log.1'.
        N)rr�os�path�exists�rename)r�source�destrrr�rotate`s
zBaseRotatingHandler.rotate)NF)�__name__�
__module__�__qualname__�__doc__r
rrr#rrrrr/s


rc@s*eZdZdZddd�Zdd	�Zd
d�ZdS)
�RotatingFileHandlerz�
    Handler for logging to a set of files, which switches from one file
    to the next when the current file reaches a certain size.
    �arNFcCs.|dkrd}tj|||||�||_||_dS)a�
        Open the specified file and use it as the stream for logging.

        By default, the file grows indefinitely. You can specify particular
        values of maxBytes and backupCount to allow the file to rollover at
        a predetermined size.

        Rollover occurs whenever the current log file is nearly maxBytes in
        length. If backupCount is >= 1, the system will successively create
        new files with the same pathname as the base file, but with extensions
        ".1", ".2" etc. appended to it. For example, with a backupCount of 5
        and a base file name of "app.log", you would get "app.log",
        "app.log.1", "app.log.2", ... through to "app.log.5". The file being
        written to is always "app.log" - when it gets filled up, it is closed
        and renamed to "app.log.1", and if files "app.log.1", "app.log.2" etc.
        exist, then they are renamed to "app.log.2", "app.log.3" etc.
        respectively.

        If maxBytes is zero, rollover never occurs.
        rr)N)rr
�maxBytes�backupCount)rrrr*r+rrrrrr
zs
zRotatingFileHandler.__init__cCs�|jr|jj�d|_|jdkr�xtt|jddd�D]^}|jd|j|f�}|jd|j|df�}tjj|�r4tjj|�r�tj	|�tj
||�q4W|j|jd�}tjj|�r�tj	|�|j|j|�|js�|j
�|_dS)z<
        Do a rollover, as described in __init__().
        Nr�z%s.%dz.1���)�stream�closer+�ranger�baseFilenamerrr�remover r#r�_open)r�iZsfn�dfnrrrr�s$




zRotatingFileHandler.doRollovercCs|tjj|j�r"tjj|j�r"dS|jdkr6|j�|_|jdkrxd|j|�}|jj	dd�|jj
�t|�|jkrxdSdS)z�
        Determine if rollover should occur.

        Basically, see if the supplied record would cause the file to exceed
        the size limit we have.
        FNrz%s
�T)rrrr1�isfiler.r3r*�format�seek�tell�len)rr�msgrrrr�s


z"RotatingFileHandler.shouldRollover)r)rrNF)r$r%r&r'r
rrrrrrr(us
 r(c@s:eZdZdZddd�Zd	d
�Zdd�Zd
d�Zdd�ZdS)�TimedRotatingFileHandlerz�
    Handler for logging to a file, rotating the log file at certain timed
    intervals.

    If backupCount is > 0, when rollover is done, no more than backupCount
    files are kept - the oldest ones are deleted.
    �hr,rNFc	
Cs�tj||d||�|j�|_||_||_||_|jdkrNd|_d|_d|_	�n�|jdkrld|_d|_d	|_	n�|jd
kr�d|_d|_d|_	n�|jd
ks�|jdkr�d|_d|_d|_	n�|jj
d��r.d|_t|j�dkr�td|j��|jddk�s|jddk�rtd|j��t
|jd�|_d|_d|_	ntd|j��tj|j	tj�|_	|j||_|j}tjj|��r~tj|�t}	nt
tj��}	|j|	�|_dS) Nr)�Sr,z%Y-%m-%d_%H-%M-%Sz-^\d{4}-\d{2}-\d{2}_\d{2}-\d{2}-\d{2}(\.\w+)?$�Mrz%Y-%m-%d_%H-%Mz'^\d{4}-\d{2}-\d{2}_\d{2}-\d{2}(\.\w+)?$�Hz%Y-%m-%d_%Hz!^\d{4}-\d{2}-\d{2}_\d{2}(\.\w+)?$�D�MIDNIGHTrz%Y-%m-%dz^\d{4}-\d{2}-\d{2}(\.\w+)?$�W�r6zHYou must specify a day for weekly rollover from 0 to 6 (0 is Monday): %s�0�6z-Invalid day specified for weekly rollover: %sz'Invalid rollover interval specified: %siii�Qii�Qi�:	)rr
�upper�whenr+�utc�atTime�interval�suffix�extMatch�
startswithr;�
ValueError�int�	dayOfWeek�re�compile�ASCIIr1rrr�statr�time�computeRollover�
rolloverAt)
rrrIrLr+rrrJrK�trrrr
�sL




 z!TimedRotatingFileHandler.__init__cCsd||j}|jdks"|jjd��r`|jr4tj|�}n
tj|�}|d}|d}|d}|d}|jdkrnt}n |jj	d|jj
d|jj}||d|d|}	|	d	kr�|	t7}	|d
d}||	}|jjd��r`|}
|
|jk�r`|
|jkr�|j|
}nd|
|jd
}||d}|j�s\|d}
tj|�d}|
|k�r\|
�sPd}nd
}||7}|}|S)zI
        Work out the rollover time based on the specified time.
        rCrD����Nrrr,rEriii�Qr-r-i��)
rLrIrOrJrW�gmtime�	localtimerK�	_MIDNIGHTZhourZminute�secondrR)r�currentTimerrZZcurrentHourZ
currentMinuteZ
currentSecondZ
currentDayZ	rotate_ts�rZdayZ
daysToWait�
newRolloverAt�dstNow�
dstAtRollover�addendrrrrXsH





z(TimedRotatingFileHandler.computeRollovercCs@tjj|j�r"tjj|j�r"dSttj��}||jkr<dSdS)z�
        Determine if rollover should occur.

        record is not used, as we are just comparing times, but it is needed so
        the method signatures are the same
        FT)rrrr1r7rQrWrY)rrrZrrrrNs
z'TimedRotatingFileHandler.shouldRolloverc	Cs�tjj|j�\}}tj|�}g}|d}t|�}xH|D]@}|d|�|kr6||d�}|jj|�r6|jtjj	||��q6Wt|�|j
kr�g}n|j�|dt|�|j
�}|S)z�
        Determine the files to delete when rolling over.

        More specific than the earlier method, which just used glob.glob().
        �.N)rr�splitr1�listdirr;rN�match�append�joinr+�sort)	rZdirNameZbaseNameZ	fileNamesr�prefixZplenZfileNamerMrrr�getFilesToDelete]s

z)TimedRotatingFileHandler.getFilesToDeletecCs�|jr|jj�d|_ttj��}tj|�d}|j|j}|jrNtj|�}n6tj|�}|d	}||kr�|rrd}nd
}tj||�}|j	|j
dtj|j|��}t
jj|�r�t
j|�|j|j
|�|jdkr�x|j�D]}t
j|�q�W|j�s�|j�|_|j|�}	x|	|k�r"|	|j}	�q
W|jdk�s>|jjd��rx|j�rxtj|	�d}
||
k�rx|�sld}nd}|	|7}	|	|_dS)
ax
        do a rollover; in this case, a date/time stamp is appended to the filename
        when the rollover happens.  However, you want the file to be named for the
        start of the interval, not the current time.  If there is a backup count,
        then we have to get a list of matching filenames, sort them and remove
        the one with the oldest suffix.
        Nr,irirrCrDr-r-i��r-i��)r.r/rQrWr`rYrLrJr_rr1ZstrftimerMrrrr2r#r+rqrr3rXrIrO)rrcrfrZZ	timeTupleZdstThenrhr5�srergrrrrtsH





$
z#TimedRotatingFileHandler.doRollover)r>r,rNFFN)	r$r%r&r'r
rXrrqrrrrrr=�s
9Ir=c@s2eZdZdZd
dd�Zdd�Zd	d
�Zdd�ZdS)�WatchedFileHandlera�
    A handler for logging to a file, which watches the file
    to see if it has changed while in use. This can happen because of
    usage of programs such as newsyslog and logrotate which perform
    log file rotation. This handler, intended for use under Unix,
    watches the file to see if it has changed since the last emit.
    (A file has changed if its device or inode have changed.)
    If it has changed, the old file stream is closed, and the file
    opened to get a new stream.

    This handler is not appropriate for use under Windows, because
    under Windows open files cannot be moved or renamed - logging
    opens the files with exclusive locks - and so there is no need
    for such a handler. Furthermore, ST_INO is not supported under
    Windows; stat always returns zero for this value.

    This handler is based on a suggestion and patch by Chad J.
    Schroeder.
    r)NFcCs,tjj|||||�d\|_|_|j�dS)Nr,r-r-)r-r-)rr	r
�dev�ino�_statstream)rrrrrrrrr
�szWatchedFileHandler.__init__cCs0|jr,tj|jj��}|t|t|_|_dS)N)r.r�fstat�filenorrrtru)r�sresrrrrv�szWatchedFileHandler._statstreamcCs�ytj|j�}Wntk
r(d}YnX|sL|t|jksL|t|jkr�|jdk	r�|jj	�|jj
�d|_|j�|_|j�dS)z�
        Reopen log file if needed.

        Checks if the underlying file has changed, and if it
        has, close the old stream and reopen the file to get the
        current stream.
        N)
rrVr1�FileNotFoundErrorrrtrrur.�flushr/r3rv)rryrrr�reopenIfNeeded�s
"



z!WatchedFileHandler.reopenIfNeededcCs|j�tjj||�dS)z�
        Emit a record.

        If underlying file has changed, reopen the file before emitting the
        record to it.
        N)r|rr	r)rrrrrr�szWatchedFileHandler.emit)r)NF)r$r%r&r'r
rvr|rrrrrrs�s

rsc@sReZdZdZdd�Zddd�Zdd�Zd	d
�Zdd�Zd
d�Z	dd�Z
dd�ZdS)�
SocketHandlera
    A handler class which writes logging records, in pickle format, to
    a streaming socket. The socket is kept open across logging calls.
    If the peer resets it, an attempt is made to reconnect on the next call.
    The pickle which is sent is that of the LogRecord's attribute dictionary
    (__dict__), so that the receiver does not need to have the logging module
    installed in order to process the logging event.

    To unpickle the record at the receiving end into a LogRecord, use the
    makeLogRecord function.
    cCsZtjj|�||_||_|dkr(||_n
||f|_d|_d|_d|_d|_	d|_
d|_dS)a
        Initializes the handler with a specific host address and port.

        When the attribute *closeOnError* is set to True - if a socket error
        occurs, the socket is silently closed and then reopened on the next
        logging call.
        NFg�?g>@g@)r�Handlerr
�host�port�address�sock�closeOnError�	retryTime�
retryStart�retryMax�retryFactor)rrr�rrrr
�s
zSocketHandler.__init__r,cCsj|jdk	rtj|j|d�}nJtjtjtj�}|j|�y|j|j�Wntk
rd|j	��YnX|S)zr
        A factory method which allows subclasses to define the precise
        type of socket they want.
        N)�timeout)
r��socketZcreate_connectionr��AF_UNIX�SOCK_STREAMZ
settimeout�connect�OSErrorr/)rr�rrrr�
makeSockets

zSocketHandler.makeSocketcCs�tj�}|jdkrd}n
||jk}|r�y|j�|_d|_WnVtk
r�|jdkr^|j|_n"|j|j|_|j|jkr�|j|_||j|_YnXdS)z�
        Try to create a socket, using an exponential backoff with
        a max retry time. Thanks to Robert Olson for the original patch
        (SF #815911) which has been slightly refactored.
        NT)	rWr�r�r�r�r�ZretryPeriodr�r�)rZnowZattemptrrr�createSocket"s





zSocketHandler.createSocketcCsR|jdkr|j�|jrNy|jj|�Wn$tk
rL|jj�d|_YnXdS)z�
        Send a pickled string to the socket.

        This function allows for partial sends which can happen when the
        network is busy.
        N)r�r��sendallr�r/)rrrrrr�send>s

zSocketHandler.sendcCsj|j}|r|j|�}t|j�}|j�|d<d|d<d|d<|jdd�tj|d�}tj	dt
|��}||S)z�
        Pickles the record in binary format with a length prefix, and
        returns it ready for transmission across the socket.
        r<N�args�exc_info�messager,z>L)r�r8�dict�__dict__Z
getMessage�pop�pickle�dumps�structZpackr;)rrZeiZdummy�drrZslenrrr�
makePickleQs

zSocketHandler.makePicklecCs0|jr|jr|jj�d|_ntjj||�dS)z�
        Handle an error during logging.

        An error has occurred during logging. Most likely cause -
        connection lost. Close the socket so that we can retry on the
        next event.
        N)r�r�r/rr~r)rrrrrrgs
zSocketHandler.handleErrorcCs<y|j|�}|j|�Wntk
r6|j|�YnXdS)a
        Emit a record.

        Pickles the record and writes it to the socket in binary format.
        If there is an error with the socket, silently drop the packet.
        If there was a problem with the socket, re-establishes the
        socket.
        N)r�r�rr)rrrrrrrrus
	
zSocketHandler.emitc
Cs@|j�z(|j}|r"d|_|j�tjj|�Wd|j�XdS)z$
        Closes the socket.
        N)�acquirer�r/rr~�release)rr�rrrr/�szSocketHandler.closeN)r,)r$r%r&r'r
r�r�r�r�rrr/rrrrr}�s
r}c@s(eZdZdZdd�Zdd�Zdd�ZdS)	�DatagramHandlera�
    A handler class which writes logging records, in pickle format, to
    a datagram socket.  The pickle which is sent is that of the LogRecord's
    attribute dictionary (__dict__), so that the receiver does not need to
    have the logging module installed in order to process the logging event.

    To unpickle the record at the receiving end into a LogRecord, use the
    makeLogRecord function.

    cCstj|||�d|_dS)zP
        Initializes the handler with a specific host address and port.
        FN)r}r
r�)rrr�rrrr
�szDatagramHandler.__init__cCs*|jdkrtj}ntj}tj|tj�}|S)zu
        The factory method of SocketHandler is here overridden to create
        a UDP socket (SOCK_DGRAM).
        N)r�r�r�ZAF_INET�
SOCK_DGRAM)rZfamilyrrrrrr��s

zDatagramHandler.makeSocketcCs&|jdkr|j�|jj||j�dS)z�
        Send a pickled string to a socket.

        This function no longer allows for partial sends which can happen
        when the network is busy - UDP does not guarantee delivery and
        can deliver packets out of sequence.
        N)r�r��sendtor�)rrrrrrr��s
zDatagramHandler.sendN)r$r%r&r'r
r�r�rrrrr��s
r�c@s"eZdZdZdZdZdZdZdZdZ	dZ
d	ZdZdZ
dZdZdZdZdZd	Zd
ZdZdZd
ZdZdZdZdZdZdZdZdZeeeeeeee
e	eeed�Z eeeeeeeeeeee
eeeeeeeeed�Z!dddddd�Z"de#fe
dfd d!�Z$d"d#�Z%d$d%�Z&d&d'�Z'd(d)�Z(d*Z)d+Z*d,d-�Z+dS).�
SysLogHandlera
    A handler class which sends formatted logging records to a syslog
    server. Based on Sam Rushing's syslog module:
    http://www.nightmare.com/squirl/python-ext/misc/syslog.py
    Contributed by Nicolas Untz (after which minor refactoring changes
    have been made).
    rr,r6r[r\r]r^rE��	�
���������)ZalertZcrit�critical�debugZemerg�err�error�infoZnoticeZpanic�warn�warning)ZauthZauthprivZcron�daemonZftpZkernZlprZmailZnewsZsecurityZsyslog�userZuucpZlocal0Zlocal1Zlocal2Zlocal3Zlocal4Zlocal5Zlocal6Zlocal7r�r�r�r�r�)�DEBUG�INFO�WARNING�ERROR�CRITICALZ	localhostNcCs0tjj|�||_||_||_t|t�rTd|_y|j	|�Wnt
k
rPYnXn�d|_|dkrhtj}|\}}tj
||d|�}|s�t
d��x�|D]|}|\}}}	}
}d}}
y(tj|||	�}
|tjkr�|
j|�PWq�t
k
�r}z|}|
dk	r�|
j�WYdd}~Xq�Xq�W|dk	�r |�|
|_||_dS)a
        Initialize a handler.

        If address is specified as a string, a UNIX socket is used. To log to a
        local syslogd, "SysLogHandler(address="/dev/log")" can be used.
        If facility is not specified, LOG_USER is used. If socktype is
        specified as socket.SOCK_DGRAM or socket.SOCK_STREAM, that specific
        socket type will be used. For Unix sockets, you can also specify a
        socktype of None, in which case socket.SOCK_DGRAM will be used, falling
        back to socket.SOCK_STREAM.
        TFNrz!getaddrinfo returns an empty list)rr~r
r��facility�socktype�
isinstance�str�
unixsocket�_connect_unixsocketr�r�r�Zgetaddrinfor�r�r/)rr�r�r�rr�Zress�resZaf�proto�_Zsar�r��excrrrr
#sB





zSysLogHandler.__init__cCs�|j}|dkrtj}tjtj|�|_y|jj|�||_Wnxtk
r�|jj�|jdk	r`�tj}tjtj|�|_y|jj|�||_Wn tk
r�|jj��YnXYnXdS)N)r�r�r�r�r�r�r/r�)rr�Zuse_socktyperrrr�Ys&




z!SysLogHandler._connect_unixsocketcCs4t|t�r|j|}t|t�r(|j|}|d>|BS)z�
        Encode the facility and priority. You can pass in strings or
        integers - if strings are passed, the facility_names and
        priority_names mapping dictionaries are used to convert them to
        integers.
        r[)r�r��facility_names�priority_names)rr�Zpriorityrrr�encodePriorityqs




zSysLogHandler.encodePriorityc
Cs2|j�z|jj�tjj|�Wd|j�XdS)z$
        Closes the socket.
        N)r�r�r/rr~r�)rrrrr/~s

zSysLogHandler.closecCs|jj|d�S)aK
        Map a logging level name to a key in the priority_names map.
        This is useful in two scenarios: when custom levels are being
        used, and in the case where you can't do a straightforward
        mapping by lowercasing the logging level name because of locale-
        specific issues (see SF #1524081).
        r�)�priority_map�get)rZ	levelNamerrr�mapPriority�szSysLogHandler.mapPriority�TcCsy�|j|�}|jr|j|}|jr*|d7}d|j|j|j|j��}|jd�}|jd�}||}|jr�y|j	j
|�Wq�tk
r�|j	j�|j
|j�|j	j
|�Yq�Xn*|jt	jkr�|j	j||j�n|j	j|�Wntk
r�|j|�YnXdS)z�
        Emit a record.

        The record is formatted, and then sent to the syslog server. If
        exception information is present, it is NOT sent to the server.
        �z<%d>zutf-8N)r8�ident�
append_nulr�r�r�Z	levelname�encoder�r�r�r�r/r�r�r�r�r�r�rr)rrr<Zpriorrrr�s.





zSysLogHandler.emit),r$r%r&r'Z	LOG_EMERGZ	LOG_ALERTZLOG_CRITZLOG_ERRZLOG_WARNINGZ
LOG_NOTICEZLOG_INFOZ	LOG_DEBUGZLOG_KERNZLOG_USERZLOG_MAILZ
LOG_DAEMONZLOG_AUTHZ
LOG_SYSLOGZLOG_LPRZLOG_NEWSZLOG_UUCPZLOG_CRONZLOG_AUTHPRIVZLOG_FTPZ
LOG_LOCAL0Z
LOG_LOCAL1Z
LOG_LOCAL2Z
LOG_LOCAL3Z
LOG_LOCAL4Z
LOG_LOCAL5Z
LOG_LOCAL6Z
LOG_LOCAL7r�r�r��SYSLOG_UDP_PORTr
r�r�r/r�r�r�rrrrrr��s�5

r�c@s*eZdZdZd
dd�Zdd�Zdd	�ZdS)�SMTPHandlerzK
    A handler class which sends an SMTP email for each logging event.
    N�@cCs�tjj|�t|ttf�r(|\|_|_n|d|_|_t|ttf�rR|\|_|_	nd|_||_
t|t�rn|g}||_||_
||_||_dS)ax
        Initialize the handler.

        Initialize the instance with the from and to addresses and subject
        line of the email. To specify a non-standard SMTP port, use the
        (host, port) tuple format for the mailhost argument. To specify
        authentication credentials, supply a (username, password) tuple
        for the credentials argument. To specify the use of a secure
        protocol (TLS), pass in a tuple for the secure argument. This will
        only be used when authentication credentials are supplied. The tuple
        will be either an empty tuple, or a single-value tuple with the name
        of a keyfile, or a 2-value tuple with the names of the keyfile and
        certificate file. (This tuple is passed to the `starttls` method).
        A timeout in seconds can be specified for the SMTP connection (the
        default is one second).
        N)rr~r
r��list�tuple�mailhost�mailport�username�password�fromaddrr��toaddrs�subject�securer�)rr�r�r�r��credentialsr�r�rrrr
�s
zSMTPHandler.__init__cCs|jS)z�
        Determine the subject for the email.

        If you want to specify a subject line which is record-dependent,
        override this method.
        )r�)rrrrr�
getSubject�szSMTPHandler.getSubjectcCsy�ddl}ddlm}ddl}|j}|s.|j}|j|j||jd�}|�}|j	|d<dj
|j�|d<|j|�|d<|j
j�|d	<|j|j|��|jr�|jdk	r�|j�|j|j�|j�|j|j|j�|j|�|j�Wntk
r�|j|�YnXdS)
zd
        Emit a record.

        Format the record and send it to the specified addressees.
        rN)�EmailMessage)r�ZFrom�,ZToZSubjectZDate)�smtplibZ
email.messager�Zemail.utilsr�Z	SMTP_PORTZSMTPr�r�r�rnr�r�Zutilsr`Zset_contentr8r�r�ZehloZstarttlsZloginr�Zsend_message�quitrr)rrr�r�Zemailr�Zsmtpr<rrrr�s0


zSMTPHandler.emit)NNr�)r$r%r&r'r
r�rrrrrr��s
"	r�c@sBeZdZdZddd�Zdd�Zdd	�Zd
d�Zdd
�Zdd�Z	dS)�NTEventLogHandlera�
    A handler class which sends events to the NT Event Log. Adds a
    registry entry for the specified application name. If no dllname is
    provided, win32service.pyd (which contains some basic message
    placeholders) is used. Note that use of these placeholders will make
    your event logs big, as the entire message source is held in the log.
    If you want slimmer logs, you have to pass in the name of your own DLL
    which contains the message definitions you want to use in the event log.
    N�ApplicationcCs�tjj|�y�ddl}ddl}||_||_|s`tjj	|jj
�}tjj	|d�}tjj|dd�}||_||_
|jj|||�|j|_tj|jtj|jtj|jtj|jtj|ji|_Wn"tk
r�td�d|_YnXdS)Nrzwin32service.pydzWThe Python Win32 extensions for NT (service, event logging) appear not to be available.)rr~r
�win32evtlogutil�win32evtlog�appname�_welurrrj�__file__rn�dllname�logtypeZAddSourceToRegistryZEVENTLOG_ERROR_TYPE�deftyper�ZEVENTLOG_INFORMATION_TYPEr�r�ZEVENTLOG_WARNING_TYPEr�r��typemap�ImportError�print)rr�r�r�r�r�rrrr
s*zNTEventLogHandler.__init__cCsdS)ay
        Return the message ID for the event record. If you are using your
        own messages, you could do this by having the msg passed to the
        logger being an ID rather than a formatting string. Then, in here,
        you could use a dictionary lookup to get the message ID. This
        version returns 1, which is the base message ID in win32service.pyd.
        r,r)rrrrr�getMessageID.szNTEventLogHandler.getMessageIDcCsdS)z�
        Return the event category for the record.

        Override this if you want to specify your own categories. This version
        returns 0.
        rr)rrrrr�getEventCategory8sz"NTEventLogHandler.getEventCategorycCs|jj|j|j�S)a�
        Return the event type for the record.

        Override this if you want to specify your own types. This version does
        a mapping using the handler's typemap attribute, which is set up in
        __init__() to a dictionary which contains mappings for DEBUG, INFO,
        WARNING, ERROR and CRITICAL. If you are using your own levels you will
        either need to override this method or place a suitable dictionary in
        the handler's typemap attribute.
        )r�r��levelnor�)rrrrr�getEventTypeAszNTEventLogHandler.getEventTypecCsn|jrjyD|j|�}|j|�}|j|�}|j|�}|jj|j||||g�Wntk
rh|j|�YnXdS)z�
        Emit a record.

        Determine the message ID, event category and event type. Then
        log the message in the NT event log.
        N)	r�r�r�r�r8ZReportEventr�rr)rr�id�cat�typer<rrrrNs



zNTEventLogHandler.emitcCstjj|�dS)aS
        Clean up this handler.

        You can remove the application name from the registry as a
        source of event log entries. However, if you do this, you will
        not be able to see the events as you intended in the Event Log
        Viewer - it needs to be able to access the registry to get the
        DLL name.
        N)rr~r/)rrrrr/_szNTEventLogHandler.close)Nr�)
r$r%r&r'r
r�r�r�rr/rrrrr�
s	

	
r�c@s*eZdZdZddd�Zdd�Zd	d
�ZdS)�HTTPHandlerz^
    A class which sends records to a Web server, using either GET or
    POST semantics.
    �GETFNcCsbtjj|�|j�}|dkr$td��|r:|dk	r:td��||_||_||_||_||_	||_
dS)zr
        Initialize the instance with the host, the request URL, and the method
        ("GET" or "POST")
        r��POSTzmethod must be GET or POSTNz3context parameter only makes sense with secure=True)r�r�)rr~r
rHrPr�url�methodr�r��context)rrr�r�r�r�r�rrrr
qszHTTPHandler.__init__cCs|jS)z�
        Default implementation of mapping the log record into a dict
        that is sent as the CGI data. Overwrite in your class.
        Contributed by Franz Glasner.
        )r�)rrrrr�mapLogRecord�szHTTPHandler.mapLogRecordcCsx�yPddl}ddl}|j}|jr4|jj||jd�}n|jj|�}|j}|j	j
|j|��}|jdkr�|j
d�dkrvd}nd}|d||f}|j|j|�|j
d�}	|	dkr�|d|	�}|jd	kr�|jd
d�|jdtt|���|j�r$ddl}
d
|jjd�}d|
j|�j�jd�}|jd|�|j�|jd	k�rH|j|jd��|j�Wn tk
�rr|j|�YnXdS)zk
        Emit a record.

        Send the record to the Web server as a percent-encoded dictionary
        rN)r�r��?�&z%c%s�:r�zContent-typez!application/x-www-form-urlencodedzContent-lengthz%s:%szutf-8zBasic �asciiZ
Authorization)Zhttp.clientZurllib.parserr�ZclientZHTTPSConnectionr�ZHTTPConnectionr��parseZ	urlencoder�r��findZ
putrequestZ	putheaderr�r;r��base64r�Z	b64encode�strip�decodeZ
endheadersr�Zgetresponserr)rrZhttpZurllibrr>r��data�sepr4rrrrrrr�s@


zHTTPHandler.emit)r�FNN)r$r%r&r'r
r�rrrrrr�ls

r�c@s8eZdZdZdd�Zdd�Zdd�Zdd	�Zd
d�ZdS)
�BufferingHandlerz�
  A handler class which buffers logging records in memory. Whenever each
  record is added to the buffer, a check is made to see if the buffer should
  be flushed. If it should, then flush() is expected to do what's needed.
    cCstjj|�||_g|_dS)z>
        Initialize the handler with the buffer size.
        N)rr~r
�capacity�buffer)rrrrrr
�szBufferingHandler.__init__cCst|j�|jkS)z�
        Should the handler flush its buffer?

        Returns true if the buffer is up to capacity. This method can be
        overridden to implement custom flushing strategies.
        )r;r
r)rrrrr�shouldFlush�szBufferingHandler.shouldFlushcCs"|jj|�|j|�r|j�dS)z�
        Emit a record.

        Append the record. If shouldFlush() tells us to, call flush() to process
        the buffer.
        N)r
rmrr{)rrrrrr�s
zBufferingHandler.emitc
Cs"|j�z
g|_Wd|j�XdS)zw
        Override to implement custom flushing behaviour.

        This version just zaps the buffer to empty.
        N)r�r
r�)rrrrr{�s
zBufferingHandler.flushcCs z|j�Wdtjj|�XdS)zp
        Close the handler.

        This version just flushes and chains to the parent class' close().
        N)r{rr~r/)rrrrr/�szBufferingHandler.closeN)	r$r%r&r'r
rrr{r/rrrrr�s	rc@sBeZdZdZejddfdd�Zdd�Zdd	�Zd
d�Z	dd
�Z
dS)�
MemoryHandlerz�
    A handler class which buffers logging records in memory, periodically
    flushing them to a target handler. Flushing occurs whenever the buffer
    is full, or when an event of a certain severity or greater is seen.
    NTcCs"tj||�||_||_||_dS)a;
        Initialize the handler with the buffer size, the level at which
        flushing should occur and an optional target.

        Note that without a target being set either here or via setTarget(),
        a MemoryHandler is no use to anyone!

        The ``flushOnClose`` argument is ``True`` for backward compatibility
        reasons - the old behaviour is that when the handler is closed, the
        buffer is flushed, even if the flush level hasn't been exceeded nor the
        capacity exceeded. To prevent this, set ``flushOnClose`` to ``False``.
        N)rr
�
flushLevel�target�flushOnClose)rrrrrrrrr
�szMemoryHandler.__init__cCst|j�|jkp|j|jkS)zP
        Check for buffer full or a record at the flushLevel or higher.
        )r;r
rr�r)rrrrrrszMemoryHandler.shouldFlushcCs
||_dS)z:
        Set the target handler for this handler.
        N)r)rrrrr�	setTargetszMemoryHandler.setTargetc
CsD|j�z,|jr2x|jD]}|jj|�qWg|_Wd|j�XdS)z�
        For a MemoryHandler, flushing means just sending the buffered
        records to the target, if there is one. Override if you want
        different behaviour.

        The record buffer is also cleared by this operation.
        N)r�rr
�handler�)rrrrrr{s
zMemoryHandler.flushcCsBz|jr|j�Wd|j�zd|_tj|�Wd|j�XXdS)zi
        Flush, if appropriately configured, set the target to None and lose the
        buffer.
        N)rr{r�rrr/r�)rrrrr/,szMemoryHandler.close)r$r%r&r'rr�r
rrr{r/rrrrr�src@s0eZdZdZdd�Zdd�Zdd�Zdd	�Zd
S)�QueueHandlera�
    This handler sends events to a queue. Typically, it would be used together
    with a multiprocessing Queue to centralise logging to file in one process
    (in a multi-process application), so as to avoid file write contention
    between processes.

    This code is new in Python 3.2, but this class can be copy pasted into
    user code for use with earlier Python versions.
    cCstjj|�||_dS)zA
        Initialise an instance, using the passed queue.
        N)rr~r
�queue)rrrrrr
HszQueueHandler.__init__cCs|jj|�dS)z�
        Enqueue a record.

        The base implementation uses put_nowait. You may want to override
        this method if you want to use blocking, timeouts or custom queue
        implementations.
        N)r�
put_nowait)rrrrr�enqueueOszQueueHandler.enqueuecCs"|j|�|j|_d|_d|_|S)a�
        Prepares a record for queuing. The object returned by this method is
        enqueued.

        The base implementation formats the record to merge the message
        and arguments, and removes unpickleable items from the record
        in-place.

        You might want to override this method if you want to convert
        the record to a dict or JSON string, or send a modified copy
        of the record while leaving the original intact.
        N)r8r�r<r�r�)rrrrr�prepareYs

zQueueHandler.preparecCs8y|j|j|��Wntk
r2|j|�YnXdS)zm
        Emit a record.

        Writes the LogRecord to the queue, preparing it for pickling first.
        N)rrrr)rrrrrrrszQueueHandler.emitN)r$r%r&r'r
rrrrrrrr=s
	
rc@sZeZdZdZdZdd�dd�Zdd�Zd	d
�Zdd�Zd
d�Z	dd�Z
dd�Zdd�ZdS)�
QueueListenerz�
        This class implements an internal threaded listener which watches for
        LogRecords being added to a queue, removes them and passes them to a
        list of handlers for processing.
        NF)�respect_handler_levelcGs||_||_d|_||_dS)zc
            Initialise an instance with the specified queue and
            handlers.
            N)r�handlers�_threadr)rrrrrrrr
�szQueueListener.__init__cCs|jj|�S)z�
            Dequeue a record and return it, optionally blocking.

            The base implementation uses get. You may want to override this method
            if you want to use timeouts or work with custom queue implementations.
            )rr�)r�blockrrr�dequeue�szQueueListener.dequeuecCs&tj|jd�|_}d|_|j�dS)z�
            Start the listener.

            This starts up a background thread to monitor the queue for
            LogRecords to process.
            )rTN)�	threadingZThread�_monitorrr��start)rrZrrrr"�szQueueListener.startcCs|S)a
            Prepare a record for handling.

            This method just returns the passed-in record. You may want to
            override this method if you need to do any custom marshalling or
            manipulation of the record before passing it to the handlers.
            r)rrrrrr�szQueueListener.preparecCsD|j|�}x4|jD]*}|js"d}n|j|jk}|r|j|�qWdS)z�
            Handle a record.

            This just loops through the handlers offering them the record
            to handle.
            TN)rrrr��levelr)rrZhandlerZprocessrrrr�s
zQueueListener.handlecCsd|j}t|d�}xNy0|jd�}||jkr*P|j|�|r@|j�Wqtjk
rZPYqXqWdS)z�
            Monitor the queue for records, and ask the handler
            to deal with them.

            This method runs on a separate, internal thread.
            The thread will terminate if it sees a sentinel object in the queue.
            �	task_doneTN)r�hasattrr�	_sentinelrr$ZEmpty)r�qZ
has_task_donerrrrr!�s



zQueueListener._monitorcCs|jj|j�dS)a
            This is used to enqueue the sentinel record.

            The base implementation uses put_nowait. You may want to override this
            method if you want to use timeouts or work with custom queue
            implementations.
            N)rrr&)rrrr�enqueue_sentinel�szQueueListener.enqueue_sentinelcCs|j�|jj�d|_dS)a!
            Stop the listener.

            This asks the thread to terminate, and then waits for it to do so.
            Note that if you don't call this before your application exits, there
            may be some records still left on the queue, which won't be processed.
            N)r(rrn)rrrr�stop�s
zQueueListener.stop)
r$r%r&r'r&r
rr"rrr!r(r)rrrrr~s
	

ri�i�Q)'r'rr�rr�r�rWrSrVrrrrr r�ZDEFAULT_TCP_LOGGING_PORTZDEFAULT_UDP_LOGGING_PORTZDEFAULT_HTTP_LOGGING_PORTZDEFAULT_SOAP_LOGGING_PORTr�ZSYSLOG_TCP_PORTrar	rr(r=rsr~r}r�r�r�r�r�rrr�objectrrrrr�<module>sB8
FOcE(*PbO9I@__pycache__/__init__.cpython-36.pyc000064400000165755150327210640013164 0ustar003


 \e�*@sdZddlZddlZddlZddlZddlZddlZddlZddlZddl	m
Z
dddddd	d
ddd
ddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-g*ZyddlZWne
k
r�dZYnXd.Zd/Zd0Zd1Zej�Zd2Zd2Zd2Zd2Zd3ZeZd4Zd5ZeZd6Zd7ZdZedededededediZeeeeeeeed8�Z d9d �Z!d:d�Z"e#ed;��rnd<d=�Z$nd>d?�Z$ej%j&e"j'j(�Z)d@dA�Z*e�r�ej+�Z,ndZ,dBdC�Z-dDdE�Z.GdFd�de/�Z0e0a1dGd+�Z2dHd*�Z3dId%�Z4GdJdK�dKe/�Z5GdLdM�dMe5�Z6GdNdO�dOe5�Z7dPZ8e5e8fe6dQfe7dRfdS�Z9GdTd�de/�Z:e:�Z;GdUd�de/�Z<GdVd�de/�Z=GdWdX�dXe/�Z>ej?�Z@gZAdYdZ�ZBd[d\�ZCGd]d
�d
e>�ZDGd^d�deD�ZEGd_d
�d
eE�ZFGd`da�daeE�ZGeGe�ZHeHZIGdbdc�dce/�ZJddd&�ZKded"�ZLGdfdg�dge/�ZMGdhd�de>�ZNGdidj�djeN�ZOeNaPGdkd�de/�ZQeOe�ZReReN_ReMeNjR�eN_Sdld�ZTd}dmd!�ZUdnd�ZVeVZWdod�ZXd2dp�dqd�ZYdrd)�ZZdsd(�Z[dtd#�Z\dud�Z]dvd$�Z^dwd�Z_eAfdxd'�Z`ddlaZaeajbe`�Gdyd�deD�Zcdadd~dzd{�Zed|d�ZfdS)z�
Logging package for Python. Based on PEP 282 and comments thereto in
comp.lang.python.

Copyright (C) 2001-2016 Vinay Sajip. All Rights Reserved.

To use, simply 'import logging' and log away!
�N)�Template�BASIC_FORMAT�BufferingFormatter�CRITICAL�DEBUG�ERROR�FATAL�FileHandler�Filter�	Formatter�Handler�INFO�	LogRecord�Logger�
LoggerAdapter�NOTSET�NullHandler�
StreamHandler�WARN�WARNING�addLevelName�basicConfig�captureWarnings�critical�debug�disable�error�	exception�fatal�getLevelName�	getLogger�getLoggerClass�info�log�
makeLogRecord�setLoggerClass�shutdown�warn�warning�getLogRecordFactory�setLogRecordFactory�
lastResort�raiseExceptionsz&Vinay Sajip <vinay_sajip@red-dove.com>Z
productionz0.5.1.2z07 February 2010T�2�(���
)rrrrrr
rrcCs4tj|�}|dk	r|Stj|�}|dk	r,|Sd|S)a
    Return the textual representation of logging level 'level'.

    If the level is one of the predefined levels (CRITICAL, ERROR, WARNING,
    INFO, DEBUG) then you get the corresponding string. If you have
    associated levels with names using addLevelName then the name you have
    associated with 'level' is returned.

    If a numeric value corresponding to one of the defined levels is passed
    in, the corresponding string representation is returned.

    Otherwise, the string "Level %s" % level is returned.
    NzLevel %s)�_levelToName�get�_nameToLevel)�level�result�r7�(/usr/lib64/python3.6/logging/__init__.pyrxs

c
Cs(t�z|t|<|t|<Wdt�XdS)zy
    Associate 'levelName' with 'level'.

    This is used when converting levels to text during message formatting.
    N)�_acquireLockr2r4�_releaseLock)r5Z	levelNamer7r7r8r�s
�	_getframecCs
tjd�S)N�)�sysr;r7r7r7r8�<lambda>�sr>cCs.yt�Wn tk
r(tj�djjSXdS)z5Return the frame object for the caller's stack frame.�N)�	Exceptionr=�exc_info�tb_frame�f_backr7r7r7r8�currentframe�srDcCsJt|t�r|}n6t|�|kr:|tkr0td|��t|}ntd|��|S)NzUnknown level: %rz*Level not an integer or a valid string: %r)�
isinstance�int�strr4�
ValueError�	TypeError)r5�rvr7r7r8�_checkLevel�s

rKcCstrtj�dS)z�
    Acquire the module-level lock for serializing access to shared data.

    This should be released with _releaseLock().
    N)�_lock�acquirer7r7r7r8r9�sr9cCstrtj�dS)zK
    Release the module-level lock acquired by calling _acquireLock().
    N)rL�releaser7r7r7r8r:�sr:c@s.eZdZdZd	dd�Zdd�ZeZdd�ZdS)
ra
    A LogRecord instance represents an event being logged.

    LogRecord instances are created every time something is logged. They
    contain all the information pertinent to the event being logged. The
    main information passed in is in msg and args, which are combined
    using str(msg) % args to create the message field of the record. The
    record also includes information such as when the record was created,
    the source line where the logging call was made, and any exception
    information to be logged.
    Nc

Ks�tj�}||_||_|rDt|�dkrDt|dtj�rD|drD|d}||_t|�|_	||_
||_y&tj
j|�|_tj
j|j�d|_Wn&tttfk
r�||_d|_YnX||_d|_|	|_||_||_||_|t|�d|_|jtd|_to�t �rt j!�|_"t j#�j|_$nd|_"d|_$t%�s0d|_&nDd|_&t'j(j)d�}|dk	�rty|j*�j|_&Wnt+k
�rrYnXt,�r�t-td��r�tj.�|_/nd|_/dS)	zK
        Initialize a logging record with interesting information.
        �rzUnknown moduleNi�ZMainProcessZmultiprocessing�getpid)0�time�name�msg�lenrE�collections�Mapping�argsrZ	levelname�levelno�pathname�os�path�basename�filename�splitext�modulerIrH�AttributeErrorrA�exc_text�
stack_info�linenoZfuncName�createdrF�msecs�
_startTimeZrelativeCreated�
logThreads�	threading�	get_identZthreadZcurrent_threadZ
threadName�logMultiprocessingZprocessNamer=�modulesr3Zcurrent_processr@�logProcesses�hasattrrP�process)
�selfrRr5rYrcrSrWrA�func�sinfo�kwargs�ctZmpr7r7r8�__init__�sR 



zLogRecord.__init__cCsd|j|j|j|j|jfS)Nz!<LogRecord: %s, %s, %s, %s, "%s">)rRrXrYrcrS)ror7r7r8�__str__Cs
zLogRecord.__str__cCst|j�}|jr||j}|S)z�
        Return the message for this LogRecord.

        Return the message for this LogRecord after merging any user-supplied
        arguments with the message.
        )rGrSrW)rorSr7r7r8�
getMessageIs

zLogRecord.getMessage)NN)�__name__�
__module__�__qualname__�__doc__rtru�__repr__rvr7r7r7r8r�s

GcCs|adS)z�
    Set the factory to be used when instantiating a log record.

    :param factory: A callable which will be called to instantiate
    a log record.
    N)�_logRecordFactory)�factoryr7r7r8r*ZscCstS)zH
    Return the factory to be used when instantiating a log record.
    )r|r7r7r7r8r)dsc	Cs&tdddddfdd�}|jj|�|S)z�
    Make a LogRecord whose attributes are defined by the specified dictionary,
    This function is useful for converting a logging event received over
    a socket connection (which is sent as a dictionary) into a LogRecord
    instance.
    N�r)r|�__dict__�update)�dictrJr7r7r8r$ksc@s0eZdZdZdZdZdd�Zdd�Zdd	�Zd
S)�PercentStylez%(message)sz%(asctime)sz
%(asctime)cCs|p|j|_dS)N)�default_format�_fmt)ro�fmtr7r7r8rt�szPercentStyle.__init__cCs|jj|j�dkS)Nr)r��find�asctime_search)ror7r7r8�usesTime�szPercentStyle.usesTimecCs|j|jS)N)r�r)ro�recordr7r7r8�format�szPercentStyle.formatN)	rwrxryr��asctime_formatr�rtr�r�r7r7r7r8r�zsr�c@s eZdZdZdZdZdd�ZdS)�StrFormatStylez	{message}z	{asctime}z{asctimecCs|jjf|j�S)N)r�r�r)ror�r7r7r8r��szStrFormatStyle.formatN)rwrxryr�r�r�r�r7r7r7r8r��sr�c@s0eZdZdZdZdZdd�Zdd�Zdd�Zd	S)
�StringTemplateStylez
${message}z
${asctime}cCs|p|j|_t|j�|_dS)N)r�r�r�_tpl)ror�r7r7r8rt�szStringTemplateStyle.__init__cCs$|j}|jd�dkp"|j|j�dkS)Nz$asctimer)r�r�r�)ror�r7r7r8r��szStringTemplateStyle.usesTimecCs|jjf|j�S)N)r�Z
substituter)ror�r7r7r8r��szStringTemplateStyle.formatN)	rwrxryr�r�r�rtr�r�r7r7r7r8r��sr�z"%(levelname)s:%(name)s:%(message)sz{levelname}:{name}:{message}z${levelname}:${name}:${message})�%�{�$c@sZeZdZdZejZddd�ZdZdZ	ddd	�Z
d
d�Zdd
�Zdd�Z
dd�Zdd�ZdS)ra�
    Formatter instances are used to convert a LogRecord to text.

    Formatters need to know how a LogRecord is constructed. They are
    responsible for converting a LogRecord to (usually) a string which can
    be interpreted by either a human or an external system. The base Formatter
    allows a formatting string to be specified. If none is supplied, the
    the style-dependent default value, "%(message)s", "{message}", or
    "${message}", is used.

    The Formatter can be initialized with a format string which makes use of
    knowledge of the LogRecord attributes - e.g. the default value mentioned
    above makes use of the fact that the user's message and arguments are pre-
    formatted into a LogRecord's message attribute. Currently, the useful
    attributes in a LogRecord are described by:

    %(name)s            Name of the logger (logging channel)
    %(levelno)s         Numeric logging level for the message (DEBUG, INFO,
                        WARNING, ERROR, CRITICAL)
    %(levelname)s       Text logging level for the message ("DEBUG", "INFO",
                        "WARNING", "ERROR", "CRITICAL")
    %(pathname)s        Full pathname of the source file where the logging
                        call was issued (if available)
    %(filename)s        Filename portion of pathname
    %(module)s          Module (name portion of filename)
    %(lineno)d          Source line number where the logging call was issued
                        (if available)
    %(funcName)s        Function name
    %(created)f         Time when the LogRecord was created (time.time()
                        return value)
    %(asctime)s         Textual time when the LogRecord was created
    %(msecs)d           Millisecond portion of the creation time
    %(relativeCreated)d Time in milliseconds when the LogRecord was created,
                        relative to the time the logging module was loaded
                        (typically at application startup time)
    %(thread)d          Thread ID (if available)
    %(threadName)s      Thread name (if available)
    %(process)d         Process ID (if available)
    %(message)s         The result of record.getMessage(), computed just as
                        the record is emitted
    Nr�cCsD|tkrtddjtj����t|d|�|_|jj|_||_dS)a�
        Initialize the formatter with specified format strings.

        Initialize the formatter either with the specified format string, or a
        default as described above. Allow for specialized date formatting with
        the optional datefmt argument. If datefmt is omitted, you get an
        ISO8601-like (or RFC 3339-like) format.

        Use a style parameter of '%', '{' or '$' to specify that you want to
        use one of %-formatting, :meth:`str.format` (``{}``) formatting or
        :class:`string.Template` formatting in your format string.

        .. versionchanged:: 3.2
           Added the ``style`` parameter.
        zStyle must be one of: %s�,rN)�_STYLESrH�join�keys�_styler��datefmt)ror�r��styler7r7r8rt�s
zFormatter.__init__z%Y-%m-%d %H:%M:%Sz%s,%03dcCs@|j|j�}|rtj||�}ntj|j|�}|j||jf}|S)a%
        Return the creation time of the specified LogRecord as formatted text.

        This method should be called from format() by a formatter which
        wants to make use of a formatted time. This method can be overridden
        in formatters to provide for any specific requirement, but the
        basic behaviour is as follows: if datefmt (a string) is specified,
        it is used with time.strftime() to format the creation time of the
        record. Otherwise, an ISO8601-like (or RFC 3339-like) format is used.
        The resulting string is returned. This function uses a user-configurable
        function to convert the creation time to a tuple. By default,
        time.localtime() is used; to change this for a particular formatter
        instance, set the 'converter' attribute to a function with the same
        signature as time.localtime() or time.gmtime(). To change it for all
        formatters, for example if you want all logging times to be shown in GMT,
        set the 'converter' attribute in the Formatter class.
        )�	converterrdrQZstrftime�default_time_format�default_msec_formatre)ror�r�rs�s�tr7r7r8�
formatTime�szFormatter.formatTimecCsZtj�}|d}tj|d|d|d|�|j�}|j�|dd�dkrV|dd�}|S)z�
        Format and return the specified exception information as a string.

        This default implementation just uses
        traceback.print_exception()
        r?rrON�
���r�)�io�StringIO�	traceback�print_exception�getvalue�close)roZei�sio�tbr�r7r7r8�formatExceptionszFormatter.formatExceptioncCs
|jj�S)zK
        Check if the format uses the creation time of the record.
        )r�r�)ror7r7r8r�szFormatter.usesTimecCs|jj|�S)N)r�r�)ror�r7r7r8�
formatMessage$szFormatter.formatMessagecCs|S)aU
        This method is provided as an extension point for specialized
        formatting of stack information.

        The input data is a string as returned from a call to
        :func:`traceback.print_stack`, but with the last trailing newline
        removed.

        The base implementation just returns the value passed in.
        r7)rorbr7r7r8�formatStack'szFormatter.formatStackcCs�|j�|_|j�r"|j||j�|_|j|�}|jrF|jsF|j	|j�|_|jrn|dd�dkrd|d}||j}|j
r�|dd�dkr�|d}||j|j
�}|S)az
        Format the specified record as text.

        The record's attribute dictionary is used as the operand to a
        string formatting operation which yields the returned string.
        Before formatting the dictionary, a couple of preparatory steps
        are carried out. The message attribute of the record is computed
        using LogRecord.getMessage(). If the formatting string uses the
        time (as determined by a call to usesTime(), formatTime() is
        called to format the event time. If there is exception information,
        it is formatted using formatException() and appended to the message.
        rONr�r�r�)rv�messager�r�r��asctimer�rArar�rbr�)ror�r�r7r7r8r�4s 


zFormatter.format)NNr�)N)rwrxryrzrQZ	localtimer�rtr�r�r�r�r�r�r�r�r7r7r7r8r�s)


c@s2eZdZdZddd�Zdd�Zdd�Zd	d
�ZdS)rzB
    A formatter suitable for formatting a number of records.
    NcCs|r||_nt|_dS)zm
        Optionally specify a formatter which will be used to format each
        individual record.
        N)�linefmt�_defaultFormatter)ror�r7r7r8rt]szBufferingFormatter.__init__cCsdS)zE
        Return the header string for the specified records.
        r~r7)ro�recordsr7r7r8�formatHeadergszBufferingFormatter.formatHeadercCsdS)zE
        Return the footer string for the specified records.
        r~r7)ror�r7r7r8�formatFootermszBufferingFormatter.formatFootercCsNd}t|�dkrJ||j|�}x|D]}||jj|�}q$W||j|�}|S)zQ
        Format the specified records and return the result as a string.
        r~r)rTr�r�r�r�)ror�rJr�r7r7r8r�ss
zBufferingFormatter.format)N)rwrxryrzrtr�r�r�r7r7r7r8rYs


c@s"eZdZdZddd�Zdd�ZdS)	r
a�
    Filter instances are used to perform arbitrary filtering of LogRecords.

    Loggers and Handlers can optionally use Filter instances to filter
    records as desired. The base filter class only allows events which are
    below a certain point in the logger hierarchy. For example, a filter
    initialized with "A.B" will allow events logged by loggers "A.B",
    "A.B.C", "A.B.C.D", "A.B.D" etc. but not "A.BB", "B.A.B" etc. If
    initialized with the empty string, all events are passed.
    r~cCs||_t|�|_dS)z�
        Initialize a filter.

        Initialize with the name of the logger which, together with its
        children, will have its events allowed through the filter. If no
        name is specified, allow every event.
        N)rRrT�nlen)rorRr7r7r8rt�szFilter.__init__cCsJ|jdkrdS|j|jkrdS|jj|jd|j�dkr:dS|j|jdkS)z�
        Determine if the specified record is to be logged.

        Is the specified record to be logged? Returns 0 for no, nonzero for
        yes. If deemed appropriate, the record may be modified in-place.
        rTF�.)r�rRr�)ror�r7r7r8�filter�s
z
Filter.filterN)r~)rwrxryrzrtr�r7r7r7r8r
�s

c@s0eZdZdZdd�Zdd�Zdd�Zdd	�Zd
S)�Filtererz[
    A base class for loggers and handlers which allows them to share
    common code.
    cCs
g|_dS)zE
        Initialize the list of filters to be an empty list.
        N)�filters)ror7r7r8rt�szFilterer.__init__cCs||jkr|jj|�dS)z;
        Add the specified filter to this handler.
        N)r��append)ror�r7r7r8�	addFilter�s
zFilterer.addFiltercCs||jkr|jj|�dS)z@
        Remove the specified filter from this handler.
        N)r��remove)ror�r7r7r8�removeFilter�s
zFilterer.removeFiltercCs@d}x6|jD],}t|d�r&|j|�}n||�}|sd}PqW|S)ah
        Determine if a record is loggable by consulting all the filters.

        The default is to allow the record to be logged; any filter can veto
        this and the record is then dropped. Returns a zero value if a record
        is to be dropped, else non-zero.

        .. versionchanged:: 3.2

           Allow filters to be just callables.
        Tr�F)r�rmr�)ror�rJ�fr6r7r7r8r��s
zFilterer.filterN)rwrxryrzrtr�r�r�r7r7r7r8r��s
r�c
CsFttt}}}|rB|rB|rB|�z||kr6|j|�Wd|�XdS)zD
    Remove a handler reference from the internal cleanup list.
    N)r9r:�_handlerListr�)�wrrMrN�handlersr7r7r8�_removeHandlerRef�sr�c
Cs*t�ztjtj|t��Wdt�XdS)zL
    Add a handler to the internal cleanup list using a weak reference.
    N)r9r�r��weakref�refr�r:)Zhandlerr7r7r8�_addHandlerRef�sr�c@s�eZdZdZefdd�Zdd�Zdd�Zeee�Z	dd	�Z
d
d�Zdd
�Zdd�Z
dd�Zdd�Zdd�Zdd�Zdd�Zdd�Zdd�Zdd�Zd S)!raq
    Handler instances dispatch logging events to specific destinations.

    The base handler class. Acts as a placeholder which defines the Handler
    interface. Handlers can optionally use Formatter instances to format
    records as desired. By default, no formatter is specified; in this case,
    the 'raw' message as determined by record.message is logged.
    cCs4tj|�d|_t|�|_d|_t|�|j�dS)zz
        Initializes the instance - basically setting the formatter to None
        and the filter list to empty.
        N)r�rt�_namerKr5�	formatterr��
createLock)ror5r7r7r8rts

zHandler.__init__cCs|jS)N)r�)ror7r7r8�get_nameszHandler.get_namec
Cs<t�z(|jtkrt|j=||_|r,|t|<Wdt�XdS)N)r9r��	_handlersr:)rorRr7r7r8�set_names
zHandler.set_namecCstrtj�|_nd|_dS)zU
        Acquire a thread lock for serializing access to the underlying I/O.
        N)rh�RLock�lock)ror7r7r8r� szHandler.createLockcCs|jr|jj�dS)z.
        Acquire the I/O thread lock.
        N)r�rM)ror7r7r8rM)szHandler.acquirecCs|jr|jj�dS)z.
        Release the I/O thread lock.
        N)r�rN)ror7r7r8rN0szHandler.releasecCst|�|_dS)zX
        Set the logging level of this handler.  level must be an int or a str.
        N)rKr5)ror5r7r7r8�setLevel7szHandler.setLevelcCs|jr|j}nt}|j|�S)z�
        Format the specified record.

        If a formatter is set, use it. Otherwise, use the default formatter
        for the module.
        )r�r�r�)ror�r�r7r7r8r�=szHandler.formatcCstd��dS)z�
        Do whatever it takes to actually log the specified logging record.

        This version is intended to be implemented by subclasses and so
        raises a NotImplementedError.
        z.emit must be implemented by Handler subclassesN)�NotImplementedError)ror�r7r7r8�emitJszHandler.emitc
Cs4|j|�}|r0|j�z|j|�Wd|j�X|S)a<
        Conditionally emit the specified logging record.

        Emission depends on filters which may have been added to the handler.
        Wrap the actual emission of the record with acquisition/release of
        the I/O thread lock. Returns whether the filter passed the record for
        emission.
        N)r�rMr�rN)ror�rJr7r7r8�handleTs	

zHandler.handlecCs
||_dS)z5
        Set the formatter for this handler.
        N)r�)ror�r7r7r8�setFormatterfszHandler.setFormattercCsdS)z�
        Ensure all logging output has been flushed.

        This version does nothing and is intended to be implemented by
        subclasses.
        Nr7)ror7r7r8�flushlsz
Handler.flushc
Cs0t�z|jr |jtkr t|j=Wdt�XdS)a%
        Tidy up any resources used by the handler.

        This version removes the handler from an internal map of handlers,
        _handlers, which is used for handler lookup by name. Subclasses
        should ensure that this gets called from overridden close()
        methods.
        N)r9r�r�r:)ror7r7r8r�us

z
Handler.closecCstotj�rtj�\}}}z�y�tjjd�tj|||dtj�tjjd�|j}x&|rvtj	j
|jj�t
dkrv|j}qRW|r�tj|tjd�ntjjd|j|jf�ytjjd|j|jf�Wn tk
r�tjjd�YnXWntk
r�YnXWd~~~XdS)	aD
        Handle errors which occur during an emit() call.

        This method should be called from handlers when an exception is
        encountered during an emit() call. If raiseExceptions is false,
        exceptions get silently ignored. This is what is mostly wanted
        for a logging system - most users will not care about errors in
        the logging system, they are more interested in application errors.
        You could, however, replace this with a custom handler if you wish.
        The record which was being processed is passed in to this method.
        z--- Logging error ---
NzCall stack:
r)�filezLogged from file %s, line %s
zMessage: %r
Arguments: %s
zwUnable to print the message and arguments - possible formatting error.
Use the traceback above to help find the error.
)r,r=�stderrrA�writer�r�rBrZr[�dirname�f_code�co_filename�__path__rC�print_stackr]rcrSrWr@�OSError)ror�r��vr��framer7r7r8�handleError�s.


zHandler.handleErrorcCst|j�}d|jj|fS)Nz	<%s (%s)>)rr5�	__class__rw)ror5r7r7r8r{�s
zHandler.__repr__N)rwrxryrzrrtr�r��propertyrRr�rMrNr�r�r�r�r�r�r�r�r{r7r7r7r8r�s"

	

	-c@s6eZdZdZdZddd�Zdd�Zdd	�Zd
d�ZdS)
rz�
    A handler class which writes logging records, appropriately formatted,
    to a stream. Note that this class does not close the stream, as
    sys.stdout or sys.stderr may be used.
    r�NcCs"tj|�|dkrtj}||_dS)zb
        Initialize the handler.

        If stream is not specified, sys.stderr is used.
        N)rrtr=r��stream)ror�r7r7r8rt�s
zStreamHandler.__init__c
Cs8|j�z |jr&t|jd�r&|jj�Wd|j�XdS)z%
        Flushes the stream.
        r�N)rMr�rmr�rN)ror7r7r8r��s
zStreamHandler.flushcCsVy2|j|�}|j}|j|�|j|j�|j�Wntk
rP|j|�YnXdS)a�
        Emit a record.

        If a formatter is specified, it is used to format the record.
        The record is then written to the stream with a trailing newline.  If
        exception information is present, it is formatted using
        traceback.print_exception and appended to the stream.  If the stream
        has an 'encoding' attribute, it is used to determine how to do the
        output to the stream.
        N)r�r�r��
terminatorr�r@r�)ror�rSr�r7r7r8r��s

zStreamHandler.emitcCs6t|j�}t|jdd�}|r$|d7}d|jj||fS)NrRr~� z<%s %s(%s)>)rr5�getattrr�r�rw)ror5rRr7r7r8r{�s

zStreamHandler.__repr__)N)	rwrxryrzr�rtr�r�r{r7r7r7r8r�s
c@s:eZdZdZddd�Zdd�Zd	d
�Zdd�Zd
d�ZdS)r	zO
    A handler class which writes formatted logging records to disk files.
    �aNFcCsTtj|�}tjj|�|_||_||_||_|r@tj	|�d|_
ntj	||j��dS)zO
        Open the specified file and use it as the stream for logging.
        N)
rZ�fspathr[�abspath�baseFilename�mode�encoding�delayrrtr�r�_open)ror]r�r�r�r7r7r8rt�s

zFileHandler.__init__cCsb|j�zJz8|jr@z|j�Wd|j}d|_t|d�r>|j�XWdtj|�XWd|j�XdS)z$
        Closes the stream.
        Nr�)rMr�r�rmr�rrN)ror�r7r7r8r�
s
zFileHandler.closecCst|j|j|jd�S)zx
        Open the current base file with the (original) mode and encoding.
        Return the resulting stream.
        )r�)�openr�r�r�)ror7r7r8r� szFileHandler._opencCs$|jdkr|j�|_tj||�dS)z�
        Emit a record.

        If the stream was not opened because 'delay' was specified in the
        constructor, open it before calling the superclass's emit.
        N)r�r�rr�)ror�r7r7r8r�'s

zFileHandler.emitcCst|j�}d|jj|j|fS)Nz<%s %s (%s)>)rr5r�rwr�)ror5r7r7r8r{2s
zFileHandler.__repr__)r�NF)	rwrxryrzrtr�r�r�r{r7r7r7r8r	�s
c@s(eZdZdZefdd�Zedd��ZdS)�_StderrHandlerz�
    This class is like a StreamHandler using sys.stderr, but always uses
    whatever sys.stderr is currently set to rather than the value of
    sys.stderr at handler construction time.
    cCstj||�dS)z)
        Initialize the handler.
        N)rrt)ror5r7r7r8rt=sz_StderrHandler.__init__cCstjS)N)r=r�)ror7r7r8r�Csz_StderrHandler.streamN)rwrxryrzrrtr�r�r7r7r7r8r�7sr�c@s eZdZdZdd�Zdd�ZdS)�PlaceHolderz�
    PlaceHolder instances are used in the Manager logger hierarchy to take
    the place of nodes for which no loggers have been defined. This class is
    intended for internal use only and not as part of the public API.
    cCs|di|_dS)zY
        Initialize with the specified logger being a child of this placeholder.
        N)�	loggerMap)ro�aloggerr7r7r8rtUszPlaceHolder.__init__cCs||jkrd|j|<dS)zJ
        Add the specified logger as a child of this placeholder.
        N)r�)ror�r7r7r8r�[s
zPlaceHolder.appendN)rwrxryrzrtr�r7r7r7r8r�Osr�cCs(|tkr t|t�s td|j��|adS)z�
    Set the class to be used when instantiating a logger. The class should
    define __init__() such that only a name argument is required, and the
    __init__() should call Logger.__init__()
    z(logger not derived from logging.Logger: N)r�
issubclassrIrw�_loggerClass)�klassr7r7r8r%fs


cCstS)zB
    Return the class to be used when instantiating a logger.
    )r�r7r7r7r8r!ssc@s@eZdZdZdd�Zdd�Zdd�Zdd	�Zd
d�Zdd
�Z	dS)�Managerzt
    There is [under normal circumstances] just one Manager instance, which
    holds the hierarchy of loggers.
    cCs(||_d|_d|_i|_d|_d|_dS)zT
        Initialize the manager with the root node of the logger hierarchy.
        rFN)�rootr�emittedNoHandlerWarning�
loggerDict�loggerClass�logRecordFactory)roZrootnoder7r7r8rt~szManager.__init__c
Cs�d}t|t�std��t�z�||jkrv|j|}t|t�r�|}|jpHt|�}||_||j|<|j	||�|j
|�n(|jp~t|�}||_||j|<|j
|�Wdt�X|S)a�
        Get a logger with the specified name (channel name), creating it
        if it doesn't yet exist. This name is a dot-separated hierarchical
        name, such as "a", "a.b", "a.b.c" or similar.

        If a PlaceHolder existed for the specified name [i.e. the logger
        didn't exist but a child of it did], replace it with the created
        logger and fix up the parent/child references which pointed to the
        placeholder to now point to the logger.
        NzA logger name must be a string)rErGrIr9r�r�r�r��manager�_fixupChildren�
_fixupParentsr:)rorRrJ�phr7r7r8r �s(





zManager.getLoggercCs*|tkr t|t�s td|j��||_dS)zY
        Set the class to be used when instantiating a logger with this Manager.
        z(logger not derived from logging.Logger: N)rr�rIrwr�)ror�r7r7r8r%�s


zManager.setLoggerClasscCs
||_dS)zg
        Set the factory to be used when instantiating a log record with this
        Manager.
        N)r�)ror}r7r7r8r*�szManager.setLogRecordFactorycCs�|j}|jd�}d}x||dkr�|r�|d|�}||jkrJt|�|j|<n2|j|}t|t�rd|}nt|t�srt�|j|�|jdd|d�}qW|s�|j}||_	dS)z�
        Ensure that there are either loggers or placeholders all the way
        from the specified logger to the root of the logger hierarchy.
        r�NrrO)
rR�rfindr�r�rEr�AssertionErrorr�r��parent)ror�rR�irJZsubstr�objr7r7r8r��s 




zManager._fixupParentscCsH|j}t|�}x4|jj�D]&}|jjd|�|kr|j|_||_qWdS)zk
        Ensure that children of the placeholder ph are connected to the
        specified logger.
        N)rRrTr�r�r)ror�r�rRZnamelen�cr7r7r8r��szManager._fixupChildrenN)
rwrxryrzrtr r%r*r�r�r7r7r7r8r�ys"
r�c@s�eZdZdZefdd�Zdd�Zdd�Zdd	�Zd
d�Z	dd
�Z
dd�Zdd�dd�Zdd�Z
e
Zdd�Zd2dd�Zd3dd�Zd4dd�Zd d!�Zd"d#�Zd$d%�Zd&d'�Zd(d)�Zd*d+�Zd,d-�Zd.d/�Zd0d1�ZdS)5rar
    Instances of the Logger class represent a single logging channel. A
    "logging channel" indicates an area of an application. Exactly how an
    "area" is defined is up to the application developer. Since an
    application can have any number of areas, logging channels are identified
    by a unique string. Application areas can be nested (e.g. an area
    of "input processing" might include sub-areas "read CSV files", "read
    XLS files" and "read Gnumeric files"). To cater for this natural nesting,
    channel names are organized into a namespace hierarchy where levels are
    separated by periods, much like the Java or Python package namespace. So
    in the instance given above, channel names might be "input" for the upper
    level, and "input.csv", "input.xls" and "input.gnu" for the sub-levels.
    There is no arbitrary limit to the depth of nesting.
    cCs6tj|�||_t|�|_d|_d|_g|_d|_dS)zJ
        Initialize the logger with a name and an optional level.
        NTF)	r�rtrRrKr5r�	propagater��disabled)rorRr5r7r7r8rt�s

zLogger.__init__cCst|�|_dS)zW
        Set the logging level of this logger.  level must be an int or a str.
        N)rKr5)ror5r7r7r8r�szLogger.setLevelcOs |jt�r|jt||f|�dS)z�
        Log 'msg % args' with severity 'DEBUG'.

        To pass exception information, use the keyword argument exc_info with
        a true value, e.g.

        logger.debug("Houston, we have a %s", "thorny problem", exc_info=1)
        N)�isEnabledForr�_log)rorSrWrrr7r7r8rs	
zLogger.debugcOs |jt�r|jt||f|�dS)z�
        Log 'msg % args' with severity 'INFO'.

        To pass exception information, use the keyword argument exc_info with
        a true value, e.g.

        logger.info("Houston, we have a %s", "interesting problem", exc_info=1)
        N)rr
r)rorSrWrrr7r7r8r"s	
zLogger.infocOs |jt�r|jt||f|�dS)z�
        Log 'msg % args' with severity 'WARNING'.

        To pass exception information, use the keyword argument exc_info with
        a true value, e.g.

        logger.warning("Houston, we have a %s", "bit of a problem", exc_info=1)
        N)rrr)rorSrWrrr7r7r8r(s	
zLogger.warningcOs$tjdtd�|j|f|�|�dS)Nz6The 'warn' method is deprecated, use 'warning' insteadr?)�warningsr'�DeprecationWarningr()rorSrWrrr7r7r8r'*szLogger.warncOs |jt�r|jt||f|�dS)z�
        Log 'msg % args' with severity 'ERROR'.

        To pass exception information, use the keyword argument exc_info with
        a true value, e.g.

        logger.error("Houston, we have a %s", "major problem", exc_info=1)
        N)rrr)rorSrWrrr7r7r8r/s	
zLogger.errorT)rAcOs|j|f|�d|i|��dS)zU
        Convenience method for logging an ERROR with exception information.
        rAN)r)rorSrArWrrr7r7r8r;szLogger.exceptioncOs |jt�r|jt||f|�dS)z�
        Log 'msg % args' with severity 'CRITICAL'.

        To pass exception information, use the keyword argument exc_info with
        a true value, e.g.

        logger.critical("Houston, we have a %s", "major disaster", exc_info=1)
        N)rrr)rorSrWrrr7r7r8rAs	
zLogger.criticalcOs<t|t�strtd��ndS|j|�r8|j|||f|�dS)z�
        Log 'msg % args' with the integer severity 'level'.

        To pass exception information, use the keyword argument exc_info with
        a true value, e.g.

        logger.log(level, "We have a %s", "mysterious problem", exc_info=1)
        zlevel must be an integerN)rErFr,rIrr)ror5rSrWrrr7r7r8r#Os	


z
Logger.logFcCs�t�}|dk	r|j}d
}x�t|d�r�|j}tjj|j�}|tkrH|j}qd}|r�t	j
�}|jd�tj
||d�|j�}|dd	kr�|dd�}|j�|j|j|j|f}PqW|S)
z�
        Find the stack frame of the caller so that we can note the source
        file name, line number and function name.
        N�(unknown file)r�(unknown function)r�zStack (most recent call last):
)r�rOr�)r
rrNr�r�)rDrCrmr�rZr[�normcaser��_srcfiler�r�r�r�r�r�r��f_lineno�co_name)rorbr�rJ�cor]rqr�r7r7r8�
findCaller`s,
zLogger.findCallerNc

Cs^t|||||||||
�	}|	dk	rZx8|	D]0}|dks<||jkrHtd|��|	||j|<q&W|S)zr
        A factory method which can be overridden in subclasses to create
        specialized LogRecords.
        Nr�r�z$Attempt to overwrite %r in LogRecord)r�r�)r|r�KeyError)
rorRr5�fn�lnorSrWrArp�extrarqrJ�keyr7r7r8�
makeRecord~s
zLogger.makeRecordcCs�d}tr@y|j|�\}}	}
}WqJtk
r<d\}}	}
YqJXn
d\}}	}
|r|t|t�rjt|�||jf}nt|t�s|tj	�}|j
|j|||	||||
||�
}|j|�dS)z�
        Low-level logging routine which creates a LogRecord and then calls
        all the handlers of this logger to handle the record.
        N�(unknown file)r�(unknown function))rrr)rrr)
r
rrHrE�
BaseException�type�
__traceback__�tupler=rArrRr�)ror5rSrWrArrbrqrrrpr�r7r7r8r�s


zLogger._logcCs |jr|j|�r|j|�dS)z�
        Call the handlers for the specified record.

        This method is used for unpickled records received from a socket, as
        well as those created locally. Logger-level filtering is applied.
        N)rr��callHandlers)ror�r7r7r8r��sz
Logger.handlec
Cs.t�z||jkr|jj|�Wdt�XdS)z;
        Add the specified handler to this logger.
        N)r9r�r�r:)ro�hdlrr7r7r8�
addHandler�s

zLogger.addHandlerc
Cs.t�z||jkr|jj|�Wdt�XdS)z@
        Remove the specified handler from this logger.
        N)r9r�r�r:)rorr7r7r8�
removeHandler�s

zLogger.removeHandlercCs2|}d}x$|r,|jrd}P|js$Pq
|j}q
W|S)a�
        See if this logger has any handlers configured.

        Loop through all handlers for this logger and its parents in the
        logger hierarchy. Return True if a handler was found, else False.
        Stop searching up the hierarchy whenever a logger with the "propagate"
        attribute set to zero is found - that will be the last logger which
        is checked for the existence of handlers.
        FT)r�rr)rorrJr7r7r8�hasHandlers�s

zLogger.hasHandlerscCs�|}d}xH|rPx,|jD]"}|d}|j|jkr|j|�qW|jsHd}q
|j}q
W|dkr�trv|jtjkr�tj|�n(tr�|jj	r�t
jjd|j
�d|j_	dS)a�
        Pass a record to all relevant handlers.

        Loop through all handlers for this logger and its parents in the
        logger hierarchy. If no handler was found, output a one-off error
        message to sys.stderr. Stop searching up the hierarchy whenever a
        logger with the "propagate" attribute set to zero is found - that
        will be the last logger whose handlers are called.
        rrONz+No handlers could be found for logger "%s"
T)r�rXr5r�rrr+r,r�r�r=r�r�rR)ror�r�foundrr7r7r8r�s$


zLogger.callHandlerscCs$|}x|r|jr|jS|j}qWtS)z�
        Get the effective level for this logger.

        Loop through this logger and its parents in the logger hierarchy,
        looking for a non-zero logging level. Return the first one found.
        )r5rr)ro�loggerr7r7r8�getEffectiveLevel�s
zLogger.getEffectiveLevelcCs|jj|krdS||j�kS)z;
        Is this logger enabled for level 'level'?
        F)r�rr%)ror5r7r7r8rszLogger.isEnabledForcCs&|j|k	rdj|j|f�}|jj|�S)ab
        Get a logger which is a descendant to this one.

        This is a convenience method, such that

        logging.getLogger('abc').getChild('def.ghi')

        is the same as

        logging.getLogger('abc.def.ghi')

        It's useful, for example, when the parent logger is named using
        __name__ rather than a literal string.
        r�)r�r�rRr�r )ro�suffixr7r7r8�getChilds
zLogger.getChildcCs t|j��}d|jj|j|fS)Nz<%s %s (%s)>)rr%r�rwrR)ror5r7r7r8r{#szLogger.__repr__)F)NNN)NNF)rwrxryrzrrtr�rr"r(r'rrrrr#rrrr�r r!r"rr%rr'r{r7r7r7r8r�s0



c@seZdZdZdd�ZdS)�
RootLoggerz�
    A root logger is not that different to any other logger, except that
    it must have a logging level and there is only one instance of it in
    the hierarchy.
    cCstj|d|�dS)z=
        Initialize the logger with the name "root".
        r�N)rrt)ror5r7r7r8rt.szRootLogger.__init__N)rwrxryrzrtr7r7r7r8r((sr(c@s�eZdZdZdd�Zdd�Zdd�Zdd	�Zd
d�Zdd
�Z	dd�Z
dd�dd�Zdd�Zdd�Z
dd�Zdd�Zdd�Zdd�Zd+d"d#�Zed$d%��Zejd&d%��Zed'd(��Zd)d*�Zd S),rzo
    An adapter for loggers which makes it easier to specify contextual
    information in logging output.
    cCs||_||_dS)ax
        Initialize the adapter with a logger and a dict-like object which
        provides contextual information. This constructor signature allows
        easy stacking of LoggerAdapters, if so desired.

        You can effectively pass keyword arguments as shown in the
        following example:

        adapter = LoggerAdapter(someLogger, dict(p1=v1, p2="v2"))
        N)r$r)ror$rr7r7r8rt<szLoggerAdapter.__init__cCs|j|d<||fS)a�
        Process the logging message and keyword arguments passed in to
        a logging call to insert contextual information. You can either
        manipulate the message itself, the keyword args or both. Return
        the message and kwargs modified (or not) to suit your needs.

        Normally, you'll only need to override this one method in a
        LoggerAdapter subclass for your specific needs.
        r)r)rorSrrr7r7r8rnJs

zLoggerAdapter.processcOs|jt|f|�|�dS)zA
        Delegate a debug call to the underlying logger.
        N)r#r)rorSrWrrr7r7r8rZszLoggerAdapter.debugcOs|jt|f|�|�dS)zA
        Delegate an info call to the underlying logger.
        N)r#r
)rorSrWrrr7r7r8r"`szLoggerAdapter.infocOs|jt|f|�|�dS)zC
        Delegate a warning call to the underlying logger.
        N)r#r)rorSrWrrr7r7r8r(fszLoggerAdapter.warningcOs$tjdtd�|j|f|�|�dS)Nz6The 'warn' method is deprecated, use 'warning' insteadr?)rr'r	r()rorSrWrrr7r7r8r'lszLoggerAdapter.warncOs|jt|f|�|�dS)zB
        Delegate an error call to the underlying logger.
        N)r#r)rorSrWrrr7r7r8rqszLoggerAdapter.errorT)rAcOs |jt|f|�d|i|��dS)zF
        Delegate an exception call to the underlying logger.
        rAN)r#r)rorSrArWrrr7r7r8rwszLoggerAdapter.exceptioncOs|jt|f|�|�dS)zD
        Delegate a critical call to the underlying logger.
        N)r#r)rorSrWrrr7r7r8r}szLoggerAdapter.criticalcOs4|j|�r0|j||�\}}|jj||f|�|�dS)z�
        Delegate a log call to the underlying logger, after adding
        contextual information from this adapter instance.
        N)rrnr$r#)ror5rSrWrrr7r7r8r#�s
zLoggerAdapter.logcCs|jjj|krdS||j�kS)z;
        Is this logger enabled for level 'level'?
        F)r$r�rr%)ror5r7r7r8r�szLoggerAdapter.isEnabledForcCs|jj|�dS)zC
        Set the specified level on the underlying logger.
        N)r$r�)ror5r7r7r8r��szLoggerAdapter.setLevelcCs
|jj�S)zD
        Get the effective level for the underlying logger.
        )r$r%)ror7r7r8r%�szLoggerAdapter.getEffectiveLevelcCs
|jj�S)z@
        See if the underlying logger has any handlers.
        )r$r")ror7r7r8r"�szLoggerAdapter.hasHandlersNFcCs|jj||||||d�S)zX
        Low-level log implementation, proxied to allow nested logger adapters.
        )rArrb)r$r)ror5rSrWrArrbr7r7r8r�szLoggerAdapter._logcCs|jjS)N)r$r�)ror7r7r8r��szLoggerAdapter.managercCs||j_dS)N)r$r�)ro�valuer7r7r8r��scCs|jjS)N)r$rR)ror7r7r8rR�szLoggerAdapter.namecCs&|j}t|j��}d|jj|j|fS)Nz<%s %s (%s)>)r$rr%r�rwrR)ror$r5r7r7r8r{�szLoggerAdapter.__repr__)NNF)rwrxryrzrtrnrr"r(r'rrrr#rr�r%r"rr�r��setterrRr{r7r7r7r8r6s(	

c
Ks�t��zjttj�dk�rp|jdd�}|dkrHd|kr`d|kr`td��nd|ksXd|kr`td��|dkr�|jdd�}|jdd	�}|r�t||�}n|jdd�}t|�}|g}|jd
d�}|jdd�}|tkr�td
dj	tj
����|jdt|d�}t|||�}	x.|D]&}|jdk�r |j
|	�tj|��qW|jdd�}
|
dk	�rPtj|
�|�rpdj	|j
��}td|��Wdt�XdS)a�	
    Do basic configuration for the logging system.

    This function does nothing if the root logger already has handlers
    configured. It is a convenience method intended for use by simple scripts
    to do one-shot configuration of the logging package.

    The default behaviour is to create a StreamHandler which writes to
    sys.stderr, set a formatter using the BASIC_FORMAT format string, and
    add the handler to the root logger.

    A number of optional keyword arguments may be specified, which can alter
    the default behaviour.

    filename  Specifies that a FileHandler be created, using the specified
              filename, rather than a StreamHandler.
    filemode  Specifies the mode to open the file, if filename is specified
              (if filemode is unspecified, it defaults to 'a').
    format    Use the specified format string for the handler.
    datefmt   Use the specified date/time format.
    style     If a format string is specified, use this to specify the
              type of format string (possible values '%', '{', '$', for
              %-formatting, :meth:`str.format` and :class:`string.Template`
              - defaults to '%').
    level     Set the root logger level to the specified level.
    stream    Use the specified stream to initialize the StreamHandler. Note
              that this argument is incompatible with 'filename' - if both
              are present, 'stream' is ignored.
    handlers  If specified, this should be an iterable of already created
              handlers, which will be added to the root handler. Any handler
              in the list which does not have a formatter assigned will be
              assigned the formatter created in this function.

    Note that you could specify a stream created using open(filename, mode)
    rather than passing the filename and mode in. However, it should be
    remembered that StreamHandler does not close its stream (since it may be
    using sys.stdout or sys.stderr), whereas FileHandler closes its stream
    when the handler is closed.

    .. versionchanged:: 3.2
       Added the ``style`` parameter.

    .. versionchanged:: 3.3
       Added the ``handlers`` parameter. A ``ValueError`` is now thrown for
       incompatible arguments (e.g. ``handlers`` specified together with
       ``filename``/``filemode``, or ``filename``/``filemode`` specified
       together with ``stream``, or ``handlers`` specified together with
       ``stream``.
    rr�Nr�r]z8'stream' and 'filename' should not be specified togetherzG'stream' or 'filename' should not be specified together with 'handlers'�filemoder�r�r�r�zStyle must be one of: %sr�r�rOr5z, zUnrecognised argument(s): %s)r9rTr�r��poprHr	rr�r�r�rr�r�r r�r:)rrr�r]r��hr�Zdfsr�Zfsr�r5r�r7r7r8r�sF4




cCs|rtjj|�StSdS)z�
    Return a logger with the specified name, creating it if necessary.

    If no name is specified, return the root logger.
    N)rr�r r�)rRr7r7r8r .scOs*ttj�dkrt�tj|f|�|�dS)z�
    Log a message with severity 'CRITICAL' on the root logger. If the logger
    has no handlers, call basicConfig() to add a console handler with a
    pre-defined format.
    rN)rTr�r�rr)rSrWrrr7r7r8r9scOs*ttj�dkrt�tj|f|�|�dS)z�
    Log a message with severity 'ERROR' on the root logger. If the logger has
    no handlers, call basicConfig() to add a console handler with a pre-defined
    format.
    rN)rTr�r�rr)rSrWrrr7r7r8rEs)rAcOst|f|�d|i|��dS)z�
    Log a message with severity 'ERROR' on the root logger, with exception
    information. If the logger has no handlers, basicConfig() is called to add
    a console handler with a pre-defined format.
    rAN)r)rSrArWrrr7r7r8rOscOs*ttj�dkrt�tj|f|�|�dS)z�
    Log a message with severity 'WARNING' on the root logger. If the logger has
    no handlers, call basicConfig() to add a console handler with a pre-defined
    format.
    rN)rTr�r�rr()rSrWrrr7r7r8r(WscOs"tjdtd�t|f|�|�dS)Nz8The 'warn' function is deprecated, use 'warning' insteadr?)rr'r	r()rSrWrrr7r7r8r'ascOs*ttj�dkrt�tj|f|�|�dS)z�
    Log a message with severity 'INFO' on the root logger. If the logger has
    no handlers, call basicConfig() to add a console handler with a pre-defined
    format.
    rN)rTr�r�rr")rSrWrrr7r7r8r"fscOs*ttj�dkrt�tj|f|�|�dS)z�
    Log a message with severity 'DEBUG' on the root logger. If the logger has
    no handlers, call basicConfig() to add a console handler with a pre-defined
    format.
    rN)rTr�r�rr)rSrWrrr7r7r8rpscOs,ttj�dkrt�tj||f|�|�dS)z�
    Log 'msg % args' with the integer severity 'level' on the root logger. If
    the logger has no handlers, call basicConfig() to add a console handler
    with a pre-defined format.
    rN)rTr�r�rr#)r5rSrWrrr7r7r8r#zscCs|tj_dS)zB
    Disable all logging calls of severity 'level' and below.
    N)r�r�r)r5r7r7r8r�scCs�x�t|dd��D]l}yT|�}|rhz:y|j�|j�|j�Wnttfk
rXYnXWd|j�XWqtrx�YqXqWdS)z�
    Perform any cleanup actions in the logging system (e.g. flushing
    buffers).

    Should be called at application exit.
    N)�reversedrMr�r�r�rHrNr,)ZhandlerListr�r-r7r7r8r&�s
c@s(eZdZdZdd�Zdd�Zdd�ZdS)	ra�
    This handler does nothing. It's intended to be used to avoid the
    "No handlers could be found for logger XXX" one-off warning. This is
    important for library code, which may contain code to log events. If a user
    of the library does not configure logging, the one-off warning might be
    produced; to avoid this, the library developer simply needs to instantiate
    a NullHandler and add it to the top-level logger of the library module or
    package.
    cCsdS)zStub.Nr7)ror�r7r7r8r��szNullHandler.handlecCsdS)zStub.Nr7)ror�r7r7r8r��szNullHandler.emitcCs
d|_dS)N)r�)ror7r7r8r��szNullHandler.createLockN)rwrxryrzr�r�r�r7r7r7r8r�s	cCs`|dk	r$tdk	r\t||||||�n8tj|||||�}td�}|jsP|jt��|jd|�dS)a�
    Implementation of showwarnings which redirects to logging, which will first
    check to see if the file parameter is None. If a file is specified, it will
    delegate to the original warnings implementation of showwarning. Otherwise,
    it will call warnings.formatwarning and will log the resulting string to a
    warnings logger named "py.warnings" with level logging.WARNING.
    Nzpy.warningsz%s)�_warnings_showwarningr�
formatwarningr r�r rr()r��categoryr]rcr��liner�r$r7r7r8�_showwarning�sr3cCs0|rtdkr,tjatt_ntdk	r,tt_dadS)z�
    If capture is true, redirect all warnings to the logging package.
    If capture is False, ensure that warnings are not redirected to logging
    but to their original destinations.
    N)r/r�showwarningr3)Zcapturer7r7r8r�s)N)NN)grzr=rZrQr�r�rr�rU�stringr�__all__rh�ImportError�
__author__Z
__status__�__version__Z__date__rfr,rgrjrlrrrrrr
rrr2r4rrrmrDr[r�__code__r�r
rKr�rLr9r:�objectrr|r*r)r$r�r�r�rr�rr�rr
r��WeakValueDictionaryr�r�r�r�rrr	r�Z_defaultLastResortr+r�r%r!r�rr(r�rr�r�rr rrrrr(r'r"rr#rr&�atexit�registerrr/r3rr7r7r7r8�<module>s�@






	



	i
	.*%4
>;E
lEb








__pycache__/__init__.cpython-36.opt-1.pyc000064400000165715150327210640014117 0ustar003


 \e�*@sdZddlZddlZddlZddlZddlZddlZddlZddlZddl	m
Z
dddddd	d
ddd
ddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-g*ZyddlZWne
k
r�dZYnXd.Zd/Zd0Zd1Zej�Zd2Zd2Zd2Zd2Zd3ZeZd4Zd5ZeZd6Zd7ZdZedededededediZeeeeeeeed8�Z d9d �Z!d:d�Z"e#ed;��rnd<d=�Z$nd>d?�Z$ej%j&e"j'j(�Z)d@dA�Z*e�r�ej+�Z,ndZ,dBdC�Z-dDdE�Z.GdFd�de/�Z0e0a1dGd+�Z2dHd*�Z3dId%�Z4GdJdK�dKe/�Z5GdLdM�dMe5�Z6GdNdO�dOe5�Z7dPZ8e5e8fe6dQfe7dRfdS�Z9GdTd�de/�Z:e:�Z;GdUd�de/�Z<GdVd�de/�Z=GdWdX�dXe/�Z>ej?�Z@gZAdYdZ�ZBd[d\�ZCGd]d
�d
e>�ZDGd^d�deD�ZEGd_d
�d
eE�ZFGd`da�daeE�ZGeGe�ZHeHZIGdbdc�dce/�ZJddd&�ZKded"�ZLGdfdg�dge/�ZMGdhd�de>�ZNGdidj�djeN�ZOeNaPGdkd�de/�ZQeOe�ZReReN_ReMeNjR�eN_Sdld�ZTd}dmd!�ZUdnd�ZVeVZWdod�ZXd2dp�dqd�ZYdrd)�ZZdsd(�Z[dtd#�Z\dud�Z]dvd$�Z^dwd�Z_eAfdxd'�Z`ddlaZaeajbe`�Gdyd�deD�Zcdadd~dzd{�Zed|d�ZfdS)z�
Logging package for Python. Based on PEP 282 and comments thereto in
comp.lang.python.

Copyright (C) 2001-2016 Vinay Sajip. All Rights Reserved.

To use, simply 'import logging' and log away!
�N)�Template�BASIC_FORMAT�BufferingFormatter�CRITICAL�DEBUG�ERROR�FATAL�FileHandler�Filter�	Formatter�Handler�INFO�	LogRecord�Logger�
LoggerAdapter�NOTSET�NullHandler�
StreamHandler�WARN�WARNING�addLevelName�basicConfig�captureWarnings�critical�debug�disable�error�	exception�fatal�getLevelName�	getLogger�getLoggerClass�info�log�
makeLogRecord�setLoggerClass�shutdown�warn�warning�getLogRecordFactory�setLogRecordFactory�
lastResort�raiseExceptionsz&Vinay Sajip <vinay_sajip@red-dove.com>Z
productionz0.5.1.2z07 February 2010T�2�(���
)rrrrrr
rrcCs4tj|�}|dk	r|Stj|�}|dk	r,|Sd|S)a
    Return the textual representation of logging level 'level'.

    If the level is one of the predefined levels (CRITICAL, ERROR, WARNING,
    INFO, DEBUG) then you get the corresponding string. If you have
    associated levels with names using addLevelName then the name you have
    associated with 'level' is returned.

    If a numeric value corresponding to one of the defined levels is passed
    in, the corresponding string representation is returned.

    Otherwise, the string "Level %s" % level is returned.
    NzLevel %s)�_levelToName�get�_nameToLevel)�level�result�r7�(/usr/lib64/python3.6/logging/__init__.pyrxs

c
Cs(t�z|t|<|t|<Wdt�XdS)zy
    Associate 'levelName' with 'level'.

    This is used when converting levels to text during message formatting.
    N)�_acquireLockr2r4�_releaseLock)r5Z	levelNamer7r7r8r�s
�	_getframecCs
tjd�S)N�)�sysr;r7r7r7r8�<lambda>�sr>cCs.yt�Wn tk
r(tj�djjSXdS)z5Return the frame object for the caller's stack frame.�N)�	Exceptionr=�exc_info�tb_frame�f_backr7r7r7r8�currentframe�srDcCsJt|t�r|}n6t|�|kr:|tkr0td|��t|}ntd|��|S)NzUnknown level: %rz*Level not an integer or a valid string: %r)�
isinstance�int�strr4�
ValueError�	TypeError)r5�rvr7r7r8�_checkLevel�s

rKcCstrtj�dS)z�
    Acquire the module-level lock for serializing access to shared data.

    This should be released with _releaseLock().
    N)�_lock�acquirer7r7r7r8r9�sr9cCstrtj�dS)zK
    Release the module-level lock acquired by calling _acquireLock().
    N)rL�releaser7r7r7r8r:�sr:c@s.eZdZdZd	dd�Zdd�ZeZdd�ZdS)
ra
    A LogRecord instance represents an event being logged.

    LogRecord instances are created every time something is logged. They
    contain all the information pertinent to the event being logged. The
    main information passed in is in msg and args, which are combined
    using str(msg) % args to create the message field of the record. The
    record also includes information such as when the record was created,
    the source line where the logging call was made, and any exception
    information to be logged.
    Nc

Ks�tj�}||_||_|rDt|�dkrDt|dtj�rD|drD|d}||_t|�|_	||_
||_y&tj
j|�|_tj
j|j�d|_Wn&tttfk
r�||_d|_YnX||_d|_|	|_||_||_||_|t|�d|_|jtd|_to�t �rt j!�|_"t j#�j|_$nd|_"d|_$t%�s0d|_&nDd|_&t'j(j)d�}|dk	�rty|j*�j|_&Wnt+k
�rrYnXt,�r�t-td��r�tj.�|_/nd|_/dS)	zK
        Initialize a logging record with interesting information.
        �rzUnknown moduleNi�ZMainProcessZmultiprocessing�getpid)0�time�name�msg�lenrE�collections�Mapping�argsrZ	levelname�levelno�pathname�os�path�basename�filename�splitext�modulerIrH�AttributeErrorrA�exc_text�
stack_info�linenoZfuncName�createdrF�msecs�
_startTimeZrelativeCreated�
logThreads�	threading�	get_identZthreadZcurrent_threadZ
threadName�logMultiprocessingZprocessNamer=�modulesr3Zcurrent_processr@�logProcesses�hasattrrP�process)
�selfrRr5rYrcrSrWrA�func�sinfo�kwargs�ctZmpr7r7r8�__init__�sR 



zLogRecord.__init__cCsd|j|j|j|j|jfS)Nz!<LogRecord: %s, %s, %s, %s, "%s">)rRrXrYrcrS)ror7r7r8�__str__Cs
zLogRecord.__str__cCst|j�}|jr||j}|S)z�
        Return the message for this LogRecord.

        Return the message for this LogRecord after merging any user-supplied
        arguments with the message.
        )rGrSrW)rorSr7r7r8�
getMessageIs

zLogRecord.getMessage)NN)�__name__�
__module__�__qualname__�__doc__rtru�__repr__rvr7r7r7r8r�s

GcCs|adS)z�
    Set the factory to be used when instantiating a log record.

    :param factory: A callable which will be called to instantiate
    a log record.
    N)�_logRecordFactory)�factoryr7r7r8r*ZscCstS)zH
    Return the factory to be used when instantiating a log record.
    )r|r7r7r7r8r)dsc	Cs&tdddddfdd�}|jj|�|S)z�
    Make a LogRecord whose attributes are defined by the specified dictionary,
    This function is useful for converting a logging event received over
    a socket connection (which is sent as a dictionary) into a LogRecord
    instance.
    N�r)r|�__dict__�update)�dictrJr7r7r8r$ksc@s0eZdZdZdZdZdd�Zdd�Zdd	�Zd
S)�PercentStylez%(message)sz%(asctime)sz
%(asctime)cCs|p|j|_dS)N)�default_format�_fmt)ro�fmtr7r7r8rt�szPercentStyle.__init__cCs|jj|j�dkS)Nr)r��find�asctime_search)ror7r7r8�usesTime�szPercentStyle.usesTimecCs|j|jS)N)r�r)ro�recordr7r7r8�format�szPercentStyle.formatN)	rwrxryr��asctime_formatr�rtr�r�r7r7r7r8r�zsr�c@s eZdZdZdZdZdd�ZdS)�StrFormatStylez	{message}z	{asctime}z{asctimecCs|jjf|j�S)N)r�r�r)ror�r7r7r8r��szStrFormatStyle.formatN)rwrxryr�r�r�r�r7r7r7r8r��sr�c@s0eZdZdZdZdZdd�Zdd�Zdd�Zd	S)
�StringTemplateStylez
${message}z
${asctime}cCs|p|j|_t|j�|_dS)N)r�r�r�_tpl)ror�r7r7r8rt�szStringTemplateStyle.__init__cCs$|j}|jd�dkp"|j|j�dkS)Nz$asctimer)r�r�r�)ror�r7r7r8r��szStringTemplateStyle.usesTimecCs|jjf|j�S)N)r�Z
substituter)ror�r7r7r8r��szStringTemplateStyle.formatN)	rwrxryr�r�r�rtr�r�r7r7r7r8r��sr�z"%(levelname)s:%(name)s:%(message)sz{levelname}:{name}:{message}z${levelname}:${name}:${message})�%�{�$c@sZeZdZdZejZddd�ZdZdZ	ddd	�Z
d
d�Zdd
�Zdd�Z
dd�Zdd�ZdS)ra�
    Formatter instances are used to convert a LogRecord to text.

    Formatters need to know how a LogRecord is constructed. They are
    responsible for converting a LogRecord to (usually) a string which can
    be interpreted by either a human or an external system. The base Formatter
    allows a formatting string to be specified. If none is supplied, the
    the style-dependent default value, "%(message)s", "{message}", or
    "${message}", is used.

    The Formatter can be initialized with a format string which makes use of
    knowledge of the LogRecord attributes - e.g. the default value mentioned
    above makes use of the fact that the user's message and arguments are pre-
    formatted into a LogRecord's message attribute. Currently, the useful
    attributes in a LogRecord are described by:

    %(name)s            Name of the logger (logging channel)
    %(levelno)s         Numeric logging level for the message (DEBUG, INFO,
                        WARNING, ERROR, CRITICAL)
    %(levelname)s       Text logging level for the message ("DEBUG", "INFO",
                        "WARNING", "ERROR", "CRITICAL")
    %(pathname)s        Full pathname of the source file where the logging
                        call was issued (if available)
    %(filename)s        Filename portion of pathname
    %(module)s          Module (name portion of filename)
    %(lineno)d          Source line number where the logging call was issued
                        (if available)
    %(funcName)s        Function name
    %(created)f         Time when the LogRecord was created (time.time()
                        return value)
    %(asctime)s         Textual time when the LogRecord was created
    %(msecs)d           Millisecond portion of the creation time
    %(relativeCreated)d Time in milliseconds when the LogRecord was created,
                        relative to the time the logging module was loaded
                        (typically at application startup time)
    %(thread)d          Thread ID (if available)
    %(threadName)s      Thread name (if available)
    %(process)d         Process ID (if available)
    %(message)s         The result of record.getMessage(), computed just as
                        the record is emitted
    Nr�cCsD|tkrtddjtj����t|d|�|_|jj|_||_dS)a�
        Initialize the formatter with specified format strings.

        Initialize the formatter either with the specified format string, or a
        default as described above. Allow for specialized date formatting with
        the optional datefmt argument. If datefmt is omitted, you get an
        ISO8601-like (or RFC 3339-like) format.

        Use a style parameter of '%', '{' or '$' to specify that you want to
        use one of %-formatting, :meth:`str.format` (``{}``) formatting or
        :class:`string.Template` formatting in your format string.

        .. versionchanged:: 3.2
           Added the ``style`` parameter.
        zStyle must be one of: %s�,rN)�_STYLESrH�join�keys�_styler��datefmt)ror�r��styler7r7r8rt�s
zFormatter.__init__z%Y-%m-%d %H:%M:%Sz%s,%03dcCs@|j|j�}|rtj||�}ntj|j|�}|j||jf}|S)a%
        Return the creation time of the specified LogRecord as formatted text.

        This method should be called from format() by a formatter which
        wants to make use of a formatted time. This method can be overridden
        in formatters to provide for any specific requirement, but the
        basic behaviour is as follows: if datefmt (a string) is specified,
        it is used with time.strftime() to format the creation time of the
        record. Otherwise, an ISO8601-like (or RFC 3339-like) format is used.
        The resulting string is returned. This function uses a user-configurable
        function to convert the creation time to a tuple. By default,
        time.localtime() is used; to change this for a particular formatter
        instance, set the 'converter' attribute to a function with the same
        signature as time.localtime() or time.gmtime(). To change it for all
        formatters, for example if you want all logging times to be shown in GMT,
        set the 'converter' attribute in the Formatter class.
        )�	converterrdrQZstrftime�default_time_format�default_msec_formatre)ror�r�rs�s�tr7r7r8�
formatTime�szFormatter.formatTimecCsZtj�}|d}tj|d|d|d|�|j�}|j�|dd�dkrV|dd�}|S)z�
        Format and return the specified exception information as a string.

        This default implementation just uses
        traceback.print_exception()
        r?rrON�
���r�)�io�StringIO�	traceback�print_exception�getvalue�close)roZei�sio�tbr�r7r7r8�formatExceptionszFormatter.formatExceptioncCs
|jj�S)zK
        Check if the format uses the creation time of the record.
        )r�r�)ror7r7r8r�szFormatter.usesTimecCs|jj|�S)N)r�r�)ror�r7r7r8�
formatMessage$szFormatter.formatMessagecCs|S)aU
        This method is provided as an extension point for specialized
        formatting of stack information.

        The input data is a string as returned from a call to
        :func:`traceback.print_stack`, but with the last trailing newline
        removed.

        The base implementation just returns the value passed in.
        r7)rorbr7r7r8�formatStack'szFormatter.formatStackcCs�|j�|_|j�r"|j||j�|_|j|�}|jrF|jsF|j	|j�|_|jrn|dd�dkrd|d}||j}|j
r�|dd�dkr�|d}||j|j
�}|S)az
        Format the specified record as text.

        The record's attribute dictionary is used as the operand to a
        string formatting operation which yields the returned string.
        Before formatting the dictionary, a couple of preparatory steps
        are carried out. The message attribute of the record is computed
        using LogRecord.getMessage(). If the formatting string uses the
        time (as determined by a call to usesTime(), formatTime() is
        called to format the event time. If there is exception information,
        it is formatted using formatException() and appended to the message.
        rONr�r�r�)rv�messager�r�r��asctimer�rArar�rbr�)ror�r�r7r7r8r�4s 


zFormatter.format)NNr�)N)rwrxryrzrQZ	localtimer�rtr�r�r�r�r�r�r�r�r7r7r7r8r�s)


c@s2eZdZdZddd�Zdd�Zdd�Zd	d
�ZdS)rzB
    A formatter suitable for formatting a number of records.
    NcCs|r||_nt|_dS)zm
        Optionally specify a formatter which will be used to format each
        individual record.
        N)�linefmt�_defaultFormatter)ror�r7r7r8rt]szBufferingFormatter.__init__cCsdS)zE
        Return the header string for the specified records.
        r~r7)ro�recordsr7r7r8�formatHeadergszBufferingFormatter.formatHeadercCsdS)zE
        Return the footer string for the specified records.
        r~r7)ror�r7r7r8�formatFootermszBufferingFormatter.formatFootercCsNd}t|�dkrJ||j|�}x|D]}||jj|�}q$W||j|�}|S)zQ
        Format the specified records and return the result as a string.
        r~r)rTr�r�r�r�)ror�rJr�r7r7r8r�ss
zBufferingFormatter.format)N)rwrxryrzrtr�r�r�r7r7r7r8rYs


c@s"eZdZdZddd�Zdd�ZdS)	r
a�
    Filter instances are used to perform arbitrary filtering of LogRecords.

    Loggers and Handlers can optionally use Filter instances to filter
    records as desired. The base filter class only allows events which are
    below a certain point in the logger hierarchy. For example, a filter
    initialized with "A.B" will allow events logged by loggers "A.B",
    "A.B.C", "A.B.C.D", "A.B.D" etc. but not "A.BB", "B.A.B" etc. If
    initialized with the empty string, all events are passed.
    r~cCs||_t|�|_dS)z�
        Initialize a filter.

        Initialize with the name of the logger which, together with its
        children, will have its events allowed through the filter. If no
        name is specified, allow every event.
        N)rRrT�nlen)rorRr7r7r8rt�szFilter.__init__cCsJ|jdkrdS|j|jkrdS|jj|jd|j�dkr:dS|j|jdkS)z�
        Determine if the specified record is to be logged.

        Is the specified record to be logged? Returns 0 for no, nonzero for
        yes. If deemed appropriate, the record may be modified in-place.
        rTF�.)r�rRr�)ror�r7r7r8�filter�s
z
Filter.filterN)r~)rwrxryrzrtr�r7r7r7r8r
�s

c@s0eZdZdZdd�Zdd�Zdd�Zdd	�Zd
S)�Filtererz[
    A base class for loggers and handlers which allows them to share
    common code.
    cCs
g|_dS)zE
        Initialize the list of filters to be an empty list.
        N)�filters)ror7r7r8rt�szFilterer.__init__cCs||jkr|jj|�dS)z;
        Add the specified filter to this handler.
        N)r��append)ror�r7r7r8�	addFilter�s
zFilterer.addFiltercCs||jkr|jj|�dS)z@
        Remove the specified filter from this handler.
        N)r��remove)ror�r7r7r8�removeFilter�s
zFilterer.removeFiltercCs@d}x6|jD],}t|d�r&|j|�}n||�}|sd}PqW|S)ah
        Determine if a record is loggable by consulting all the filters.

        The default is to allow the record to be logged; any filter can veto
        this and the record is then dropped. Returns a zero value if a record
        is to be dropped, else non-zero.

        .. versionchanged:: 3.2

           Allow filters to be just callables.
        Tr�F)r�rmr�)ror�rJ�fr6r7r7r8r��s
zFilterer.filterN)rwrxryrzrtr�r�r�r7r7r7r8r��s
r�c
CsFttt}}}|rB|rB|rB|�z||kr6|j|�Wd|�XdS)zD
    Remove a handler reference from the internal cleanup list.
    N)r9r:�_handlerListr�)�wrrMrN�handlersr7r7r8�_removeHandlerRef�sr�c
Cs*t�ztjtj|t��Wdt�XdS)zL
    Add a handler to the internal cleanup list using a weak reference.
    N)r9r�r��weakref�refr�r:)Zhandlerr7r7r8�_addHandlerRef�sr�c@s�eZdZdZefdd�Zdd�Zdd�Zeee�Z	dd	�Z
d
d�Zdd
�Zdd�Z
dd�Zdd�Zdd�Zdd�Zdd�Zdd�Zdd�Zdd�Zd S)!raq
    Handler instances dispatch logging events to specific destinations.

    The base handler class. Acts as a placeholder which defines the Handler
    interface. Handlers can optionally use Formatter instances to format
    records as desired. By default, no formatter is specified; in this case,
    the 'raw' message as determined by record.message is logged.
    cCs4tj|�d|_t|�|_d|_t|�|j�dS)zz
        Initializes the instance - basically setting the formatter to None
        and the filter list to empty.
        N)r�rt�_namerKr5�	formatterr��
createLock)ror5r7r7r8rts

zHandler.__init__cCs|jS)N)r�)ror7r7r8�get_nameszHandler.get_namec
Cs<t�z(|jtkrt|j=||_|r,|t|<Wdt�XdS)N)r9r��	_handlersr:)rorRr7r7r8�set_names
zHandler.set_namecCstrtj�|_nd|_dS)zU
        Acquire a thread lock for serializing access to the underlying I/O.
        N)rh�RLock�lock)ror7r7r8r� szHandler.createLockcCs|jr|jj�dS)z.
        Acquire the I/O thread lock.
        N)r�rM)ror7r7r8rM)szHandler.acquirecCs|jr|jj�dS)z.
        Release the I/O thread lock.
        N)r�rN)ror7r7r8rN0szHandler.releasecCst|�|_dS)zX
        Set the logging level of this handler.  level must be an int or a str.
        N)rKr5)ror5r7r7r8�setLevel7szHandler.setLevelcCs|jr|j}nt}|j|�S)z�
        Format the specified record.

        If a formatter is set, use it. Otherwise, use the default formatter
        for the module.
        )r�r�r�)ror�r�r7r7r8r�=szHandler.formatcCstd��dS)z�
        Do whatever it takes to actually log the specified logging record.

        This version is intended to be implemented by subclasses and so
        raises a NotImplementedError.
        z.emit must be implemented by Handler subclassesN)�NotImplementedError)ror�r7r7r8�emitJszHandler.emitc
Cs4|j|�}|r0|j�z|j|�Wd|j�X|S)a<
        Conditionally emit the specified logging record.

        Emission depends on filters which may have been added to the handler.
        Wrap the actual emission of the record with acquisition/release of
        the I/O thread lock. Returns whether the filter passed the record for
        emission.
        N)r�rMr�rN)ror�rJr7r7r8�handleTs	

zHandler.handlecCs
||_dS)z5
        Set the formatter for this handler.
        N)r�)ror�r7r7r8�setFormatterfszHandler.setFormattercCsdS)z�
        Ensure all logging output has been flushed.

        This version does nothing and is intended to be implemented by
        subclasses.
        Nr7)ror7r7r8�flushlsz
Handler.flushc
Cs0t�z|jr |jtkr t|j=Wdt�XdS)a%
        Tidy up any resources used by the handler.

        This version removes the handler from an internal map of handlers,
        _handlers, which is used for handler lookup by name. Subclasses
        should ensure that this gets called from overridden close()
        methods.
        N)r9r�r�r:)ror7r7r8r�us

z
Handler.closecCstotj�rtj�\}}}z�y�tjjd�tj|||dtj�tjjd�|j}x&|rvtj	j
|jj�t
dkrv|j}qRW|r�tj|tjd�ntjjd|j|jf�ytjjd|j|jf�Wn tk
r�tjjd�YnXWntk
r�YnXWd~~~XdS)	aD
        Handle errors which occur during an emit() call.

        This method should be called from handlers when an exception is
        encountered during an emit() call. If raiseExceptions is false,
        exceptions get silently ignored. This is what is mostly wanted
        for a logging system - most users will not care about errors in
        the logging system, they are more interested in application errors.
        You could, however, replace this with a custom handler if you wish.
        The record which was being processed is passed in to this method.
        z--- Logging error ---
NzCall stack:
r)�filezLogged from file %s, line %s
zMessage: %r
Arguments: %s
zwUnable to print the message and arguments - possible formatting error.
Use the traceback above to help find the error.
)r,r=�stderrrA�writer�r�rBrZr[�dirname�f_code�co_filename�__path__rC�print_stackr]rcrSrWr@�OSError)ror�r��vr��framer7r7r8�handleError�s.


zHandler.handleErrorcCst|j�}d|jj|fS)Nz	<%s (%s)>)rr5�	__class__rw)ror5r7r7r8r{�s
zHandler.__repr__N)rwrxryrzrrtr�r��propertyrRr�rMrNr�r�r�r�r�r�r�r�r{r7r7r7r8r�s"

	

	-c@s6eZdZdZdZddd�Zdd�Zdd	�Zd
d�ZdS)
rz�
    A handler class which writes logging records, appropriately formatted,
    to a stream. Note that this class does not close the stream, as
    sys.stdout or sys.stderr may be used.
    r�NcCs"tj|�|dkrtj}||_dS)zb
        Initialize the handler.

        If stream is not specified, sys.stderr is used.
        N)rrtr=r��stream)ror�r7r7r8rt�s
zStreamHandler.__init__c
Cs8|j�z |jr&t|jd�r&|jj�Wd|j�XdS)z%
        Flushes the stream.
        r�N)rMr�rmr�rN)ror7r7r8r��s
zStreamHandler.flushcCsVy2|j|�}|j}|j|�|j|j�|j�Wntk
rP|j|�YnXdS)a�
        Emit a record.

        If a formatter is specified, it is used to format the record.
        The record is then written to the stream with a trailing newline.  If
        exception information is present, it is formatted using
        traceback.print_exception and appended to the stream.  If the stream
        has an 'encoding' attribute, it is used to determine how to do the
        output to the stream.
        N)r�r�r��
terminatorr�r@r�)ror�rSr�r7r7r8r��s

zStreamHandler.emitcCs6t|j�}t|jdd�}|r$|d7}d|jj||fS)NrRr~� z<%s %s(%s)>)rr5�getattrr�r�rw)ror5rRr7r7r8r{�s

zStreamHandler.__repr__)N)	rwrxryrzr�rtr�r�r{r7r7r7r8r�s
c@s:eZdZdZddd�Zdd�Zd	d
�Zdd�Zd
d�ZdS)r	zO
    A handler class which writes formatted logging records to disk files.
    �aNFcCsTtj|�}tjj|�|_||_||_||_|r@tj	|�d|_
ntj	||j��dS)zO
        Open the specified file and use it as the stream for logging.
        N)
rZ�fspathr[�abspath�baseFilename�mode�encoding�delayrrtr�r�_open)ror]r�r�r�r7r7r8rt�s

zFileHandler.__init__cCsb|j�zJz8|jr@z|j�Wd|j}d|_t|d�r>|j�XWdtj|�XWd|j�XdS)z$
        Closes the stream.
        Nr�)rMr�r�rmr�rrN)ror�r7r7r8r�
s
zFileHandler.closecCst|j|j|jd�S)zx
        Open the current base file with the (original) mode and encoding.
        Return the resulting stream.
        )r�)�openr�r�r�)ror7r7r8r� szFileHandler._opencCs$|jdkr|j�|_tj||�dS)z�
        Emit a record.

        If the stream was not opened because 'delay' was specified in the
        constructor, open it before calling the superclass's emit.
        N)r�r�rr�)ror�r7r7r8r�'s

zFileHandler.emitcCst|j�}d|jj|j|fS)Nz<%s %s (%s)>)rr5r�rwr�)ror5r7r7r8r{2s
zFileHandler.__repr__)r�NF)	rwrxryrzrtr�r�r�r{r7r7r7r8r	�s
c@s(eZdZdZefdd�Zedd��ZdS)�_StderrHandlerz�
    This class is like a StreamHandler using sys.stderr, but always uses
    whatever sys.stderr is currently set to rather than the value of
    sys.stderr at handler construction time.
    cCstj||�dS)z)
        Initialize the handler.
        N)rrt)ror5r7r7r8rt=sz_StderrHandler.__init__cCstjS)N)r=r�)ror7r7r8r�Csz_StderrHandler.streamN)rwrxryrzrrtr�r�r7r7r7r8r�7sr�c@s eZdZdZdd�Zdd�ZdS)�PlaceHolderz�
    PlaceHolder instances are used in the Manager logger hierarchy to take
    the place of nodes for which no loggers have been defined. This class is
    intended for internal use only and not as part of the public API.
    cCs|di|_dS)zY
        Initialize with the specified logger being a child of this placeholder.
        N)�	loggerMap)ro�aloggerr7r7r8rtUszPlaceHolder.__init__cCs||jkrd|j|<dS)zJ
        Add the specified logger as a child of this placeholder.
        N)r�)ror�r7r7r8r�[s
zPlaceHolder.appendN)rwrxryrzrtr�r7r7r7r8r�Osr�cCs(|tkr t|t�s td|j��|adS)z�
    Set the class to be used when instantiating a logger. The class should
    define __init__() such that only a name argument is required, and the
    __init__() should call Logger.__init__()
    z(logger not derived from logging.Logger: N)r�
issubclassrIrw�_loggerClass)�klassr7r7r8r%fs


cCstS)zB
    Return the class to be used when instantiating a logger.
    )r�r7r7r7r8r!ssc@s@eZdZdZdd�Zdd�Zdd�Zdd	�Zd
d�Zdd
�Z	dS)�Managerzt
    There is [under normal circumstances] just one Manager instance, which
    holds the hierarchy of loggers.
    cCs(||_d|_d|_i|_d|_d|_dS)zT
        Initialize the manager with the root node of the logger hierarchy.
        rFN)�rootr�emittedNoHandlerWarning�
loggerDict�loggerClass�logRecordFactory)roZrootnoder7r7r8rt~szManager.__init__c
Cs�d}t|t�std��t�z�||jkrv|j|}t|t�r�|}|jpHt|�}||_||j|<|j	||�|j
|�n(|jp~t|�}||_||j|<|j
|�Wdt�X|S)a�
        Get a logger with the specified name (channel name), creating it
        if it doesn't yet exist. This name is a dot-separated hierarchical
        name, such as "a", "a.b", "a.b.c" or similar.

        If a PlaceHolder existed for the specified name [i.e. the logger
        didn't exist but a child of it did], replace it with the created
        logger and fix up the parent/child references which pointed to the
        placeholder to now point to the logger.
        NzA logger name must be a string)rErGrIr9r�r�r�r��manager�_fixupChildren�
_fixupParentsr:)rorRrJ�phr7r7r8r �s(





zManager.getLoggercCs*|tkr t|t�s td|j��||_dS)zY
        Set the class to be used when instantiating a logger with this Manager.
        z(logger not derived from logging.Logger: N)rr�rIrwr�)ror�r7r7r8r%�s


zManager.setLoggerClasscCs
||_dS)zg
        Set the factory to be used when instantiating a log record with this
        Manager.
        N)r�)ror}r7r7r8r*�szManager.setLogRecordFactorycCs�|j}|jd�}d}xn|dkr�|r�|d|�}||jkrJt|�|j|<n$|j|}t|t�rd|}n
|j|�|jdd|d�}qW|s�|j}||_dS)z�
        Ensure that there are either loggers or placeholders all the way
        from the specified logger to the root of the logger hierarchy.
        r�NrrO)	rR�rfindr�r�rErr�r��parent)ror�rR�irJZsubstr�objr7r7r8r��s




zManager._fixupParentscCsH|j}t|�}x4|jj�D]&}|jjd|�|kr|j|_||_qWdS)zk
        Ensure that children of the placeholder ph are connected to the
        specified logger.
        N)rRrTr�r�r�)ror�r�rRZnamelen�cr7r7r8r��szManager._fixupChildrenN)
rwrxryrzrtr r%r*r�r�r7r7r7r8r�ys"
r�c@s�eZdZdZefdd�Zdd�Zdd�Zdd	�Zd
d�Z	dd
�Z
dd�Zdd�dd�Zdd�Z
e
Zdd�Zd2dd�Zd3dd�Zd4dd�Zd d!�Zd"d#�Zd$d%�Zd&d'�Zd(d)�Zd*d+�Zd,d-�Zd.d/�Zd0d1�ZdS)5rar
    Instances of the Logger class represent a single logging channel. A
    "logging channel" indicates an area of an application. Exactly how an
    "area" is defined is up to the application developer. Since an
    application can have any number of areas, logging channels are identified
    by a unique string. Application areas can be nested (e.g. an area
    of "input processing" might include sub-areas "read CSV files", "read
    XLS files" and "read Gnumeric files"). To cater for this natural nesting,
    channel names are organized into a namespace hierarchy where levels are
    separated by periods, much like the Java or Python package namespace. So
    in the instance given above, channel names might be "input" for the upper
    level, and "input.csv", "input.xls" and "input.gnu" for the sub-levels.
    There is no arbitrary limit to the depth of nesting.
    cCs6tj|�||_t|�|_d|_d|_g|_d|_dS)zJ
        Initialize the logger with a name and an optional level.
        NTF)	r�rtrRrKr5r��	propagater��disabled)rorRr5r7r7r8rt�s

zLogger.__init__cCst|�|_dS)zW
        Set the logging level of this logger.  level must be an int or a str.
        N)rKr5)ror5r7r7r8r�szLogger.setLevelcOs |jt�r|jt||f|�dS)z�
        Log 'msg % args' with severity 'DEBUG'.

        To pass exception information, use the keyword argument exc_info with
        a true value, e.g.

        logger.debug("Houston, we have a %s", "thorny problem", exc_info=1)
        N)�isEnabledForr�_log)rorSrWrrr7r7r8rs	
zLogger.debugcOs |jt�r|jt||f|�dS)z�
        Log 'msg % args' with severity 'INFO'.

        To pass exception information, use the keyword argument exc_info with
        a true value, e.g.

        logger.info("Houston, we have a %s", "interesting problem", exc_info=1)
        N)rr
r)rorSrWrrr7r7r8r"s	
zLogger.infocOs |jt�r|jt||f|�dS)z�
        Log 'msg % args' with severity 'WARNING'.

        To pass exception information, use the keyword argument exc_info with
        a true value, e.g.

        logger.warning("Houston, we have a %s", "bit of a problem", exc_info=1)
        N)rrr)rorSrWrrr7r7r8r(s	
zLogger.warningcOs$tjdtd�|j|f|�|�dS)Nz6The 'warn' method is deprecated, use 'warning' insteadr?)�warningsr'�DeprecationWarningr()rorSrWrrr7r7r8r'*szLogger.warncOs |jt�r|jt||f|�dS)z�
        Log 'msg % args' with severity 'ERROR'.

        To pass exception information, use the keyword argument exc_info with
        a true value, e.g.

        logger.error("Houston, we have a %s", "major problem", exc_info=1)
        N)rrr)rorSrWrrr7r7r8r/s	
zLogger.errorT)rAcOs|j|f|�d|i|��dS)zU
        Convenience method for logging an ERROR with exception information.
        rAN)r)rorSrArWrrr7r7r8r;szLogger.exceptioncOs |jt�r|jt||f|�dS)z�
        Log 'msg % args' with severity 'CRITICAL'.

        To pass exception information, use the keyword argument exc_info with
        a true value, e.g.

        logger.critical("Houston, we have a %s", "major disaster", exc_info=1)
        N)rrr)rorSrWrrr7r7r8rAs	
zLogger.criticalcOs<t|t�strtd��ndS|j|�r8|j|||f|�dS)z�
        Log 'msg % args' with the integer severity 'level'.

        To pass exception information, use the keyword argument exc_info with
        a true value, e.g.

        logger.log(level, "We have a %s", "mysterious problem", exc_info=1)
        zlevel must be an integerN)rErFr,rIrr)ror5rSrWrrr7r7r8r#Os	


z
Logger.logFcCs�t�}|dk	r|j}d
}x�t|d�r�|j}tjj|j�}|tkrH|j}qd}|r�t	j
�}|jd�tj
||d�|j�}|dd	kr�|dd�}|j�|j|j|j|f}PqW|S)
z�
        Find the stack frame of the caller so that we can note the source
        file name, line number and function name.
        N�(unknown file)r�(unknown function)r�zStack (most recent call last):
)r�rOr�)r	rr
Nr�r�)rDrCrmr�rZr[�normcaser��_srcfiler�r�r�r�r�r�r��f_lineno�co_name)rorbr�rJ�cor]rqr�r7r7r8�
findCaller`s,
zLogger.findCallerNc

Cs^t|||||||||
�	}|	dk	rZx8|	D]0}|dks<||jkrHtd|��|	||j|<q&W|S)zr
        A factory method which can be overridden in subclasses to create
        specialized LogRecords.
        Nr�r�z$Attempt to overwrite %r in LogRecord)r�r�)r|r�KeyError)
rorRr5�fn�lnorSrWrArp�extrarqrJ�keyr7r7r8�
makeRecord~s
zLogger.makeRecordcCs�d}tr@y|j|�\}}	}
}WqJtk
r<d\}}	}
YqJXn
d\}}	}
|r|t|t�rjt|�||jf}nt|t�s|tj	�}|j
|j|||	||||
||�
}|j|�dS)z�
        Low-level logging routine which creates a LogRecord and then calls
        all the handlers of this logger to handle the record.
        N�(unknown file)r�(unknown function))rrr)rrr)
rrrHrE�
BaseException�type�
__traceback__�tupler=rArrRr�)ror5rSrWrArrbrqrrrpr�r7r7r8r�s


zLogger._logcCs |jr|j|�r|j|�dS)z�
        Call the handlers for the specified record.

        This method is used for unpickled records received from a socket, as
        well as those created locally. Logger-level filtering is applied.
        N)rr��callHandlers)ror�r7r7r8r��sz
Logger.handlec
Cs.t�z||jkr|jj|�Wdt�XdS)z;
        Add the specified handler to this logger.
        N)r9r�r�r:)ro�hdlrr7r7r8�
addHandler�s

zLogger.addHandlerc
Cs.t�z||jkr|jj|�Wdt�XdS)z@
        Remove the specified handler from this logger.
        N)r9r�r�r:)rorr7r7r8�
removeHandler�s

zLogger.removeHandlercCs2|}d}x$|r,|jrd}P|js$Pq
|j}q
W|S)a�
        See if this logger has any handlers configured.

        Loop through all handlers for this logger and its parents in the
        logger hierarchy. Return True if a handler was found, else False.
        Stop searching up the hierarchy whenever a logger with the "propagate"
        attribute set to zero is found - that will be the last logger which
        is checked for the existence of handlers.
        FT)r�rr�)rorrJr7r7r8�hasHandlers�s

zLogger.hasHandlerscCs�|}d}xH|rPx,|jD]"}|d}|j|jkr|j|�qW|jsHd}q
|j}q
W|dkr�trv|jtjkr�tj|�n(tr�|jj	r�t
jjd|j
�d|j_	dS)a�
        Pass a record to all relevant handlers.

        Loop through all handlers for this logger and its parents in the
        logger hierarchy. If no handler was found, output a one-off error
        message to sys.stderr. Stop searching up the hierarchy whenever a
        logger with the "propagate" attribute set to zero is found - that
        will be the last logger whose handlers are called.
        rrONz+No handlers could be found for logger "%s"
T)r�rXr5r�rr�r+r,r�r�r=r�r�rR)ror�r�foundrr7r7r8r�s$


zLogger.callHandlerscCs$|}x|r|jr|jS|j}qWtS)z�
        Get the effective level for this logger.

        Loop through this logger and its parents in the logger hierarchy,
        looking for a non-zero logging level. Return the first one found.
        )r5r�r)ro�loggerr7r7r8�getEffectiveLevel�s
zLogger.getEffectiveLevelcCs|jj|krdS||j�kS)z;
        Is this logger enabled for level 'level'?
        F)r�rr$)ror5r7r7r8rszLogger.isEnabledForcCs&|j|k	rdj|j|f�}|jj|�S)ab
        Get a logger which is a descendant to this one.

        This is a convenience method, such that

        logging.getLogger('abc').getChild('def.ghi')

        is the same as

        logging.getLogger('abc.def.ghi')

        It's useful, for example, when the parent logger is named using
        __name__ rather than a literal string.
        r�)r�r�rRr�r )ro�suffixr7r7r8�getChilds
zLogger.getChildcCs t|j��}d|jj|j|fS)Nz<%s %s (%s)>)rr$r�rwrR)ror5r7r7r8r{#szLogger.__repr__)F)NNN)NNF)rwrxryrzrrtr�rr"r(r'rrrrr#rrrr�rr r!rr$rr&r{r7r7r7r8r�s0



c@seZdZdZdd�ZdS)�
RootLoggerz�
    A root logger is not that different to any other logger, except that
    it must have a logging level and there is only one instance of it in
    the hierarchy.
    cCstj|d|�dS)z=
        Initialize the logger with the name "root".
        r�N)rrt)ror5r7r7r8rt.szRootLogger.__init__N)rwrxryrzrtr7r7r7r8r'(sr'c@s�eZdZdZdd�Zdd�Zdd�Zdd	�Zd
d�Zdd
�Z	dd�Z
dd�dd�Zdd�Zdd�Z
dd�Zdd�Zdd�Zdd�Zd+d"d#�Zed$d%��Zejd&d%��Zed'd(��Zd)d*�Zd S),rzo
    An adapter for loggers which makes it easier to specify contextual
    information in logging output.
    cCs||_||_dS)ax
        Initialize the adapter with a logger and a dict-like object which
        provides contextual information. This constructor signature allows
        easy stacking of LoggerAdapters, if so desired.

        You can effectively pass keyword arguments as shown in the
        following example:

        adapter = LoggerAdapter(someLogger, dict(p1=v1, p2="v2"))
        N)r#r)ror#rr7r7r8rt<szLoggerAdapter.__init__cCs|j|d<||fS)a�
        Process the logging message and keyword arguments passed in to
        a logging call to insert contextual information. You can either
        manipulate the message itself, the keyword args or both. Return
        the message and kwargs modified (or not) to suit your needs.

        Normally, you'll only need to override this one method in a
        LoggerAdapter subclass for your specific needs.
        r)r)rorSrrr7r7r8rnJs

zLoggerAdapter.processcOs|jt|f|�|�dS)zA
        Delegate a debug call to the underlying logger.
        N)r#r)rorSrWrrr7r7r8rZszLoggerAdapter.debugcOs|jt|f|�|�dS)zA
        Delegate an info call to the underlying logger.
        N)r#r
)rorSrWrrr7r7r8r"`szLoggerAdapter.infocOs|jt|f|�|�dS)zC
        Delegate a warning call to the underlying logger.
        N)r#r)rorSrWrrr7r7r8r(fszLoggerAdapter.warningcOs$tjdtd�|j|f|�|�dS)Nz6The 'warn' method is deprecated, use 'warning' insteadr?)rr'rr()rorSrWrrr7r7r8r'lszLoggerAdapter.warncOs|jt|f|�|�dS)zB
        Delegate an error call to the underlying logger.
        N)r#r)rorSrWrrr7r7r8rqszLoggerAdapter.errorT)rAcOs |jt|f|�d|i|��dS)zF
        Delegate an exception call to the underlying logger.
        rAN)r#r)rorSrArWrrr7r7r8rwszLoggerAdapter.exceptioncOs|jt|f|�|�dS)zD
        Delegate a critical call to the underlying logger.
        N)r#r)rorSrWrrr7r7r8r}szLoggerAdapter.criticalcOs4|j|�r0|j||�\}}|jj||f|�|�dS)z�
        Delegate a log call to the underlying logger, after adding
        contextual information from this adapter instance.
        N)rrnr#r#)ror5rSrWrrr7r7r8r#�s
zLoggerAdapter.logcCs|jjj|krdS||j�kS)z;
        Is this logger enabled for level 'level'?
        F)r#r�rr$)ror5r7r7r8r�szLoggerAdapter.isEnabledForcCs|jj|�dS)zC
        Set the specified level on the underlying logger.
        N)r#r�)ror5r7r7r8r��szLoggerAdapter.setLevelcCs
|jj�S)zD
        Get the effective level for the underlying logger.
        )r#r$)ror7r7r8r$�szLoggerAdapter.getEffectiveLevelcCs
|jj�S)z@
        See if the underlying logger has any handlers.
        )r#r!)ror7r7r8r!�szLoggerAdapter.hasHandlersNFcCs|jj||||||d�S)zX
        Low-level log implementation, proxied to allow nested logger adapters.
        )rArrb)r#r)ror5rSrWrArrbr7r7r8r�szLoggerAdapter._logcCs|jjS)N)r#r�)ror7r7r8r��szLoggerAdapter.managercCs||j_dS)N)r#r�)ro�valuer7r7r8r��scCs|jjS)N)r#rR)ror7r7r8rR�szLoggerAdapter.namecCs&|j}t|j��}d|jj|j|fS)Nz<%s %s (%s)>)r#rr$r�rwrR)ror#r5r7r7r8r{�szLoggerAdapter.__repr__)NNF)rwrxryrzrtrnrr"r(r'rrrr#rr�r$r!rr�r��setterrRr{r7r7r7r8r6s(	

c
Ks�t��zjttj�dk�rp|jdd�}|dkrHd|kr`d|kr`td��nd|ksXd|kr`td��|dkr�|jdd�}|jdd	�}|r�t||�}n|jdd�}t|�}|g}|jd
d�}|jdd�}|tkr�td
dj	tj
����|jdt|d�}t|||�}	x.|D]&}|jdk�r |j
|	�tj|��qW|jdd�}
|
dk	�rPtj|
�|�rpdj	|j
��}td|��Wdt�XdS)a�	
    Do basic configuration for the logging system.

    This function does nothing if the root logger already has handlers
    configured. It is a convenience method intended for use by simple scripts
    to do one-shot configuration of the logging package.

    The default behaviour is to create a StreamHandler which writes to
    sys.stderr, set a formatter using the BASIC_FORMAT format string, and
    add the handler to the root logger.

    A number of optional keyword arguments may be specified, which can alter
    the default behaviour.

    filename  Specifies that a FileHandler be created, using the specified
              filename, rather than a StreamHandler.
    filemode  Specifies the mode to open the file, if filename is specified
              (if filemode is unspecified, it defaults to 'a').
    format    Use the specified format string for the handler.
    datefmt   Use the specified date/time format.
    style     If a format string is specified, use this to specify the
              type of format string (possible values '%', '{', '$', for
              %-formatting, :meth:`str.format` and :class:`string.Template`
              - defaults to '%').
    level     Set the root logger level to the specified level.
    stream    Use the specified stream to initialize the StreamHandler. Note
              that this argument is incompatible with 'filename' - if both
              are present, 'stream' is ignored.
    handlers  If specified, this should be an iterable of already created
              handlers, which will be added to the root handler. Any handler
              in the list which does not have a formatter assigned will be
              assigned the formatter created in this function.

    Note that you could specify a stream created using open(filename, mode)
    rather than passing the filename and mode in. However, it should be
    remembered that StreamHandler does not close its stream (since it may be
    using sys.stdout or sys.stderr), whereas FileHandler closes its stream
    when the handler is closed.

    .. versionchanged:: 3.2
       Added the ``style`` parameter.

    .. versionchanged:: 3.3
       Added the ``handlers`` parameter. A ``ValueError`` is now thrown for
       incompatible arguments (e.g. ``handlers`` specified together with
       ``filename``/``filemode``, or ``filename``/``filemode`` specified
       together with ``stream``, or ``handlers`` specified together with
       ``stream``.
    rr�Nr�r]z8'stream' and 'filename' should not be specified togetherzG'stream' or 'filename' should not be specified together with 'handlers'�filemoder�r�r�r�zStyle must be one of: %sr�r�rOr5z, zUnrecognised argument(s): %s)r9rTr�r��poprHr	rr�r�r�rr�r�rr�r:)rrr�r]r��hr�Zdfsr�Zfsr�r5r�r7r7r8r�sF4




cCs|rtjj|�StSdS)z�
    Return a logger with the specified name, creating it if necessary.

    If no name is specified, return the root logger.
    N)rr�r r�)rRr7r7r8r .scOs*ttj�dkrt�tj|f|�|�dS)z�
    Log a message with severity 'CRITICAL' on the root logger. If the logger
    has no handlers, call basicConfig() to add a console handler with a
    pre-defined format.
    rN)rTr�r�rr)rSrWrrr7r7r8r9scOs*ttj�dkrt�tj|f|�|�dS)z�
    Log a message with severity 'ERROR' on the root logger. If the logger has
    no handlers, call basicConfig() to add a console handler with a pre-defined
    format.
    rN)rTr�r�rr)rSrWrrr7r7r8rEs)rAcOst|f|�d|i|��dS)z�
    Log a message with severity 'ERROR' on the root logger, with exception
    information. If the logger has no handlers, basicConfig() is called to add
    a console handler with a pre-defined format.
    rAN)r)rSrArWrrr7r7r8rOscOs*ttj�dkrt�tj|f|�|�dS)z�
    Log a message with severity 'WARNING' on the root logger. If the logger has
    no handlers, call basicConfig() to add a console handler with a pre-defined
    format.
    rN)rTr�r�rr()rSrWrrr7r7r8r(WscOs"tjdtd�t|f|�|�dS)Nz8The 'warn' function is deprecated, use 'warning' insteadr?)rr'rr()rSrWrrr7r7r8r'ascOs*ttj�dkrt�tj|f|�|�dS)z�
    Log a message with severity 'INFO' on the root logger. If the logger has
    no handlers, call basicConfig() to add a console handler with a pre-defined
    format.
    rN)rTr�r�rr")rSrWrrr7r7r8r"fscOs*ttj�dkrt�tj|f|�|�dS)z�
    Log a message with severity 'DEBUG' on the root logger. If the logger has
    no handlers, call basicConfig() to add a console handler with a pre-defined
    format.
    rN)rTr�r�rr)rSrWrrr7r7r8rpscOs,ttj�dkrt�tj||f|�|�dS)z�
    Log 'msg % args' with the integer severity 'level' on the root logger. If
    the logger has no handlers, call basicConfig() to add a console handler
    with a pre-defined format.
    rN)rTr�r�rr#)r5rSrWrrr7r7r8r#zscCs|tj_dS)zB
    Disable all logging calls of severity 'level' and below.
    N)r�r�r)r5r7r7r8r�scCs�x�t|dd��D]l}yT|�}|rhz:y|j�|j�|j�Wnttfk
rXYnXWd|j�XWqtrx�YqXqWdS)z�
    Perform any cleanup actions in the logging system (e.g. flushing
    buffers).

    Should be called at application exit.
    N)�reversedrMr�r�r�rHrNr,)ZhandlerListr�r,r7r7r8r&�s
c@s(eZdZdZdd�Zdd�Zdd�ZdS)	ra�
    This handler does nothing. It's intended to be used to avoid the
    "No handlers could be found for logger XXX" one-off warning. This is
    important for library code, which may contain code to log events. If a user
    of the library does not configure logging, the one-off warning might be
    produced; to avoid this, the library developer simply needs to instantiate
    a NullHandler and add it to the top-level logger of the library module or
    package.
    cCsdS)zStub.Nr7)ror�r7r7r8r��szNullHandler.handlecCsdS)zStub.Nr7)ror�r7r7r8r��szNullHandler.emitcCs
d|_dS)N)r�)ror7r7r8r��szNullHandler.createLockN)rwrxryrzr�r�r�r7r7r7r8r�s	cCs`|dk	r$tdk	r\t||||||�n8tj|||||�}td�}|jsP|jt��|jd|�dS)a�
    Implementation of showwarnings which redirects to logging, which will first
    check to see if the file parameter is None. If a file is specified, it will
    delegate to the original warnings implementation of showwarning. Otherwise,
    it will call warnings.formatwarning and will log the resulting string to a
    warnings logger named "py.warnings" with level logging.WARNING.
    Nzpy.warningsz%s)�_warnings_showwarningr�
formatwarningr r�rrr()r��categoryr]rcr��liner�r#r7r7r8�_showwarning�sr2cCs0|rtdkr,tjatt_ntdk	r,tt_dadS)z�
    If capture is true, redirect all warnings to the logging package.
    If capture is False, ensure that warnings are not redirected to logging
    but to their original destinations.
    N)r.r�showwarningr2)Zcapturer7r7r8r�s)N)NN)grzr=rZrQr�r�rr�rU�stringr�__all__rh�ImportError�
__author__Z
__status__�__version__Z__date__rfr,rgrjrlrrrrrr
rrr2r4rrrmrDr[r�__code__r�rrKr�rLr9r:�objectrr|r*r)r$r�r�r�rr�rr�rr
r��WeakValueDictionaryr�r�r�r�rrr	r�Z_defaultLastResortr+r�r%r!r�rr'r�rr�r�rr rrrrr(r'r"rr#rr&�atexit�registerrr.r2rr7r7r7r8�<module>s�@






	



	i
	.*%4
>;E
lEb