⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 handlers.py

📁 xen虚拟机源代码安装包
💻 PY
📖 第 1 页 / 共 2 页
字号:
        self.address = address        self.facility = facility        if type(address) == types.StringType:            self.socket = socket.socket(socket.AF_UNIX, socket.SOCK_DGRAM)            # syslog may require either DGRAM or STREAM sockets            try:                self.socket.connect(address)            except socket.error:                self.socket.close()                self.socket = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)            self.socket.connect(address)            self.unixsocket = 1        else:            self.socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)            self.unixsocket = 0        self.formatter = None    # curious: when talking to the unix-domain '/dev/log' socket, a    #   zero-terminator seems to be required.  this string is placed    #   into a class variable so that it can be overridden if    #   necessary.    log_format_string = '<%d>%s\000'    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 type(facility) == types.StringType:            facility = self.facility_names[facility]        if type(priority) == types.StringType:            priority = self.priority_names[priority]        return (facility << 3) | priority    def close (self):        """        Closes the socket.        """        if self.unixsocket:            self.socket.close()        logging.Handler.close(self)    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.        """        msg = self.format(record)        """        We need to convert record level to lowercase, maybe this will        change in the future.        """        msg = self.log_format_string % (            self.encodePriority(self.facility,                                string.lower(record.levelname)),            msg)        try:            if self.unixsocket:                self.socket.send(msg)            else:                self.socket.sendto(msg, self.address)        except:            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):        """        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.        """        logging.Handler.__init__(self)        if type(mailhost) == types.TupleType:            host, port = mailhost            self.mailhost = host            self.mailport = port        else:            self.mailhost = mailhost            self.mailport = None        self.fromaddr = fromaddr        if type(toaddrs) == types.StringType:            toaddrs = [toaddrs]        self.toaddrs = toaddrs        self.subject = subject    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    weekdayname = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']    monthname = [None,                 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',                 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']    def date_time(self):        """Return the current date and time formatted for a MIME header."""        year, month, day, hh, mm, ss, wd, y, z = time.gmtime(time.time())        s = "%s, %02d %3s %4d %02d:%02d:%02d GMT" % (                self.weekdayname[wd],                day, self.monthname[month], year,                hh, mm, ss)        return s    def emit(self, record):        """        Emit a record.        Format the record and send it to the specified addressees.        """        try:            import smtplib            port = self.mailport            if not port:                port = smtplib.SMTP_PORT            smtp = smtplib.SMTP(self.mailhost, port)            msg = self.format(record)            msg = "From: %s\r\nTo: %s\r\nSubject: %s\r\nDate: %s\r\n\r\n%s" % (                            self.fromaddr,                            string.join(self.toaddrs, ","),                            self.getSubject(record),                            self.date_time(), msg)            smtp.sendmail(self.fromaddr, self.toaddrs, msg)            smtp.quit()        except:            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:                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"):        """        Initialize the instance with the host, the request URL, and the method        ("GET" or "POST")        """        logging.Handler.__init__(self)        method = string.upper(method)        if method not in ["GET", "POST"]:            raise ValueError, "method must be GET or POST"        self.host = host        self.url = url        self.method = method    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 an URL-encoded dictionary        """        try:            import httplib, urllib            h = httplib.HTTP(self.host)            url = self.url            data = urllib.urlencode(self.mapLogRecord(record))            if self.method == "GET":                if (string.find(url, '?') >= 0):                    sep = '&'                else:                    sep = '?'                url = url + "%c%s" % (sep, data)            h.putrequest(self.method, url)            if self.method == "POST":                h.putheader("Content-length", str(len(data)))            h.endheaders()            if self.method == "POST":                h.send(data)            h.getreply()    #can't do anything with the result        except:            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.buffer = []    def close(self):        """        Close the handler.        This version just flushes and chains to the parent class' close().        """        self.flush()        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):        """        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!        """        BufferingHandler.__init__(self, capacity)        self.flushLevel = flushLevel        self.target = target    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.target = target    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.        """        if self.target:            for record in self.buffer:                self.target.handle(record)            self.buffer = []    def close(self):        """        Flush, set the target to None and lose the buffer.        """        self.flush()        self.target = None        BufferingHandler.close(self)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -