Python,想要使用日志轮换和压缩进行日志记录

标签 python logging

任何人都可以建议一种在 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()

关于Python,想要使用日志轮换和压缩进行日志记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8467978/

相关文章:

python - python/django 中的每小时日志轮转

logging - 使用 gsub 截断 Logstash 消息字段

python - 从字典列表中删除具有重复值的字典

c++ - Emacs 定制

tomcat - 单独的异常日志文件

logging - 哪些层应该记录异常?

java - Lombok @Slf4j - 记录到文件

python - django-registration-redux 添加额外字段

python - 计算列中连续真实值的数量

python - 无法导入 torch mac