当前位置: 首页 > 面试题库 >

Python,想要通过日志轮换和压缩进行日志记录

单于奕
2023-03-14
问题内容

任何人都可以在python中建议一种记录方法

  • 每天记录日志旋转
  • 旋转日志时的压缩
  • 可选-删除最早的日志文件以保留X MB的可用空间
  • 可选-sftp日志文件到服务器

感谢您的任何答复


问题答案:
  • 每天进行日志轮换: 使用TimedRotatingFileHandler
  • 日志压缩 :设置encoding='bz2'参数。(请注意,此“技巧”仅适用于Python2。’bz2’不再被视为Python3中的编码。)
  • 可选-删除最早的日志文件以保留X MB的可用空间 。您可以(间接)使用RotatingFileHandler安排它。通过设置该maxBytes参数,日志文件将在达到一定大小时翻转。通过设置backupCount参数,您可以控制保留多少翻转。这两个参数一起使您可以控制日志文件占用的最大空间。您可能可以将其子类化,TimeRotatingFileHandler以将这种行为也纳入其中。

只是为了好玩,这是您可以如何子类化TimeRotatingFileHandler。当您运行以下脚本时,它将把日志文件写入/tmp/log_rotate*

使用较小的time.sleep(例如0.1)值,日志文件会迅速填满,达到maxBytes限制,然后再进行滚动。

较大time.sleep(例如1.0)时,日志文件会缓慢填充,不会达到maxBytes限制,但是无论何时(达到10秒的时间间隔),它们都会翻转。

以下所有代码均来自logging /
handlers.py
。我只是以最简单的方式将TimeRotatingFileHandler与RotatingFileHandler网格化。

import time
import re
import os
import stat
import logging
import logging.handlers as handlers


class SizedTimedRotatingFileHandler(handlers.TimedRotatingFileHandler):
    """
    Handler for logging to a set of files, which switches from one file
    to the next when the current file reaches a certain size, or at certain
    timed intervals
    """

    def __init__(self, filename, maxBytes=0, backupCount=0, encoding=None,
                 delay=0, when='h', interval=1, utc=False):
        handlers.TimedRotatingFileHandler.__init__(
            self, filename, when, interval, backupCount, encoding, delay, utc)
        self.maxBytes = maxBytes

    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)
            # due to non-posix-compliant Windows feature
            self.stream.seek(0, 2)
            if self.stream.tell() + len(msg) >= self.maxBytes:
                return 1
        t = int(time.time())
        if t >= self.rolloverAt:
            return 1
        return 0


def demo_SizedTimedRotatingFileHandler():
    log_filename = '/tmp/log_rotate'
    logger = logging.getLogger('MyLogger')
    logger.setLevel(logging.DEBUG)
    handler = SizedTimedRotatingFileHandler(
        log_filename, maxBytes=100, backupCount=5,
        when='s', interval=10,
        # encoding='bz2',  # uncomment for bz2 compression
    )
    logger.addHandler(handler)
    for i in range(10000):
        time.sleep(0.1)
        logger.debug('i=%d' % i)

demo_SizedTimedRotatingFileHandler()


 类似资料:
  • 我需要压缩Weblogic日志。 我检查了Weblogic控制台的日志设置,发现我可以旋转日志,但没有看到可以为日志压缩(压缩到zip文件)设置的任何属性。 当前设置如图所示。 有没有自动压缩这些日志的方法?

  • 日志压缩可确保 Kafka 始终至少为单个 topic partition 的数据日志中的每个 message key 保留最新的已知值。 这样的设计解决了应用程序崩溃、系统故障后恢复或者应用在运行维护过程中重启后重新加载缓存的场景。 接下来让我们深入讨论这些在使用过程中的更多细节,阐述在这个过程中它是如何进行日志压缩的。 迄今为止,我们只介绍了简单的日志保留方法(当旧的数据保留时间超过指定时间、

  • 我想登录由几个类组成的应用程序。我想要一个。txt日志文件的末尾。因此,我创建了一个静态记录器实例,并在一个类中为其创建了一个FileHandler。因为我想要一个文件,所以我在FileHandler中将第二个参数设置为true,以便能够在日志记录期间追加日志文件。 之后,我创建了其他伐木工人。我知道我必须为每个类实例化一个记录器。因此,我只为每个类创建记录器(不带FileHandler)。但是所

  • 我试图使用refrofit2、kotlin和loging-拦截器记录所有请求(使用网络拦截器): 改造:“2.0.2” okhttp3 : “3.2.0” com.squareup.okhttp3:logging-interceptor 3.2.0 喜欢: 它只是打印: 到底发生了什么? -编辑- 记录器不会显示在主线程上执行请求的错误,因此请小心。

  • 问题内容: 我想使用PySide创建一个简单的应用程序,仅用于从python日志记录中输出。 我想知道: 如何重定向stdout写入QTextEdit? 如何编写logging.Handler记录到QTextEdit? 谢谢 问题答案: 这是从PyQt邮件列表复制粘贴的,但应该适用于PySide 这应该做您想要的。 用法示例:

  • 主要内容:日志文件的命名规则,logrotate配置文件,把自己的日志加入日志轮替日志是重要的系统文件,记录和保存了系统中所有的重要事件。但是日志文件也需要进行定期的维护,因为日志文件是不断增长的,如果完全不进行日志维护,而任由其随意递增,那么用不了多久,我们的硬盘就会被写满。 日志维护的最主要的工作就是把旧的日志文件删除,从而腾出空间保存新的日志文件。这项工作如果靠管理员手工来完成,那其实是非常烦琐的,而且也容易忘记。那么 Linux 系统是否可以自动完成日志的轮替工作呢?