python Firebase和Gzipped旋转文件记录处理程序

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python Firebase和Gzipped旋转文件记录处理程序相关的知识,希望对你有一定的参考价值。

#!/usr/bin/env python
# coding=utf-8
import os
import glob
import subprocess

import logging
from logging.handlers import BaseRotatingHandler

__author__ = u'Ahmed Şeref GÜNEYSU'


# noinspection PyPep8Naming,PyTypeChecker
class GzippedRotatingFileHandler(BaseRotatingHandler):
    def __init__(self, filename, mode='a', maxBytes=0, encoding=None, delay=0):
        """
        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

    def doRollover(self):
        """
        Do a rollover, as described in __init__().
        """
        if self.stream:
            self.stream.close()
            self.stream = None
            path, file = os.path.join(os.path.split(self.baseFilename))

            files = glob.glob("%s/*.gz" % path)
            if files:
                suffix = int(os.path.splitext(os.path.splitext(files[-1])[0])[-1].replace('.', '')) + 1
            else:
                suffix = 1
            dfn = "%s.%s" % (self.baseFilename, suffix)

            if os.path.exists(self.baseFilename):
                os.rename(self.baseFilename, dfn)
                subprocess.call(["gzip", dfn])
        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 FirebaseHandler(logging.Handler):
    """
    A class which sends records to a Web server, using either GET or
    POST semantics.
    """

    def __init__(self, url):
        """
        Initialize the instance with the host, the request URL, and the method
        ("GET" or "POST")
        """
        logging.Handler.__init__(self)
        self.url = url

    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.
        :type record: logging.LogRecord
        :param record:
        """
        # return  record.__dict__
        if record.msg:
            try:
                msg = record.msg.message
            except Exception, e:
                logging.exception(e)
                msg = None
        else:
            msg = None

        data = dict(
            created=record.created,
            filename=record.filename,
            function=record.funcName,
            levelname=record.levelname,
            linenumber=record.lineno,
            module=record.module,
            msecs=record.msecs,
            msg=msg,
            name=record.name,
            pathname=record.pathname,
            process=record.process,
            processname=record.processName,
            relativecreated=record.relativeCreated,
            thread=record.thread,
            threadname=record.threadName,
        )
        return data

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

        Send the record to the Web server as a percent-encoded dictionary
        """

        import requests
        import json

        try:
            data = self.mapLogRecord(record=record)
            requests.post(self.url, data=json.dumps(data))
        except (KeyboardInterrupt, SystemExit):
            raise
            # except Exception, e:
            #     self.handleError(record)

以上是关于python Firebase和Gzipped旋转文件记录处理程序的主要内容,如果未能解决你的问题,请参考以下文章

在 Amazon s3 中将 Spark RDD 编写为 Gzipped 文件

在 Spring Boot REST 应用程序中处理 gzipped 请求

Angular 的 PRE-Gzipped 文件不是通过 IIS 提供的吗?

如何在XHR onProgress函数中使用缩减/ gzipped内容?

text 在nim中读取gzipped文件

Android:图片以 -90 度旋转上传到 Firebase