python / django中的每小时日志循环

o7jaxewo  于 2022-12-20  发布在  Go
关注(0)|答案(4)|浏览(134)

当我在python logging上查看Python文档并进行一些实验时,我不是很理解,
第一次计算下一个滚动时间时(创建处理程序时),将使用现有日志文件的上次修改时间或当前时间来计算下一个滚动发生的时间。
我发现每小时轮换的轮换时间会受到我开始记录的时间的影响,比如12:23:33开始,下一次轮换是在13:23:33,这最终会使日志文件名混淆。
代码应该是这样的,

TimedRotatingFileHandler(filename, when='h', interval=1, backupCount=0, encoding=None, delay=False, utc=False)

有没有办法强制每小时日志循环从00分钟(如13:00:00)开始,而不是从日志记录开始的时间开始,并且每个日志将只包含其日志文件名所指示的小时内的日志?

nbewdwxp

nbewdwxp1#

查看TimedRotatingFileHandler的代码,您不能强制它以特定的分钟值旋转:根据文档,如果日志文件已经存在,则下一次转存将发生在logfile last modification time + interval,如果日志文件不存在,则下一次转存将发生在current time + interval
但是,由于您似乎知道文件名,因此可以先将日志文件的最后修改时间设置为当前小时来欺骗TimedRotatingFileHandler

from    datetime import datetime
import  os, time

thishour = datetime.now().replace(minute = 0, second = 0, microsecond = 0)
timestamp = time.mktime(thishour.timetuple())

# this opens/creates the logfile...
with file(filename, 'a'):
    # ...and sets atime/mtime
    os.utime(filename, (timestamp, timestamp))

TimedRotatingFileHandler(filename, ...)

(未测试)

btxsgosb

btxsgosb2#

我还附上了另一个答案。Python日志支持WatchedFileHandler,如果发现文件信息更新,它将关闭并重新打开具有相同文件名的日志文件。它可以很好地与系统级日志旋转(如Linux logrotate守护进程)配合使用。

uoifb46i

uoifb46i3#

logger = logging.getLogger()

    log_format = '%(asctime)s - %(levelname)s - %(name)s - %(message)s'
    logging.basicConfig(format=log_format, level=level)

    # Create 'log' directory if not present
    log_path = os.path.dirname(logfile)
    if not os.path.exists(log_path):
        os.makedirs(log_path)

    handler = TimedRotatingFileHandler(
        logfile,
        when="H",
        interval=1,
        encoding="utf-8")

    handler.setFormatter(logging.Formatter(log_format))
    handler.extMatch = re.compile(r"^\d{8}$")
    handler.suffix = "%Y%m%d"
    handler.setLevel(level)

    logger.addHandler(handler)
jv4diomz

jv4diomz4#

我写了一个custom Handler,通过它可以实现你需要的功能。

import logging
import os
from custom_rotating_file_handler import CustomRotatingFileHandler

def custom_rotating_logger(log_fpath, when='H'):
    os.makedirs(os.path.dirname(log_fpath), exist_ok=True)
    file_handler = CustomRotatingFileHandler(log_fpath,
                                             when=when,
                                             backupCount=10,
                                             encoding="utf-8")

    formatter = logging.Formatter('%(asctime)s %(message)s')
    file_handler.setFormatter(formatter)

    logger = logging.getLogger('MyCustomLogger')
    logger.setLevel(logging.DEBUG)
    logger.addHandler(file_handler)
    return logger

# For test: log rotating at beginning of each minute.
logger = custom_rotating_logger('/tmp/tmp.log', when='M')

import time
for i in range(100):
    time.sleep(1)
    logger.debug('ddddd')
    logger.info('iiiii')
    logger.warning('wwwww')

将上面的代码另存为testhandler.py并运行以下命令:

python3 testhandler.py && sudo find /tmp -name 'tmp.log.*'

您可以看到如下输出:

/tmp/tmp.log.202212142132
/tmp/tmp.log.202212142133

日志文件中的内容:

> head -n 3 /tmp/tmp.log.202212142133
2022-12-14 21:33:00,483 ddddd
2022-12-14 21:33:00,490 iiiii
2022-12-14 21:33:00,490 wwwww

相关问题