更新日志内容时,python动态更改日志目录

时间:2019-11-05 07:44:19

标签: python datetime logging

我想根据创建新日志时的时间(特别是小时)来更改日志的目录。

例如,假设在运行程序期间,消息aaa保存在目录d:\log\191105\09\log.log的日志文件中,时间是09:59。

随着时间的流逝,新日志bbb被保存在日志文件中,但是目录应该不同,d:\log\191105\10.log在10:00时不终止程序。

我的日志管理器代码如下,

import logging
import datetime
import psutil
import os, os.path

class LogManager:
    today = datetime.datetime.now()
    process_name = psutil.Process().name()
    process_id = str(psutil.Process().pid)
    log_dir = "D:/LOG/" + today.strftime("%Y%m%d") + "/" + today.strftime("%H") + "/"
    log_filename = process_name + '_[' + process_id + ']_' + today.strftime("%Y-%m-%d_%H") + '.log'
    if not os.path.exists(log_dir):
        os.makedirs(log_dir)

    # date/directory config
    log = logging.getLogger('mypython')
    log.setLevel(logging.INFO)
    formatter = logging.Formatter('%(asctime)s||%(levelname)s||%(message)s')
    fileHandler = logging.FileHandler(log_dir+log_filename)
    fileHandler.setFormatter(formatter)

    log.addHandler(fileHandler)

    def update(self):
        self.today = datetime.datetime.now()
        old_log_dir = self.log_dir
        self.log_dir = "D:/LOG/" + self.today.strftime("%Y%m%d") + "/" + self.today.strftime("%H") + "/"

        if (old_log_dir == self.log_dir):
            return

        self.log_filename = self.process_name + '_[' + self.process_id + ']_' + self.today.strftime("%Y-%m-%d_%H") + '.log'
        if not os.path.exists(self.log_dir):
            os.makedirs(self.log_dir)

        self.log = logging.getLogger('mypython')

        # here, i wanna update my filehandler
        for hdlr in self.log.handlers[:]:
            if isinstance(hdlr, self.log.FileHander):
                self.log.removeHandler(hdlr)

        self.fileHandler = logging.FileHandler(self.log_dir+self.log_filename)
        self.fileHandler.setFormatter(self.formatter)

        self.log.addHandler(self.fileHandler)

    def i(self, ex):
        self.update()
        self.log.info(ex)

    def w(self, ex):
        self.update()
        self.log.warning(ex)

我将这些函数称为

import LogManager as lm

logManager = lm.LogManager()
logManager.i('message')

它运作良好,但似乎在经过一小时后仍未更新其fileHandler。

我试图查找日志中是否具有updateHandler方法...但是没有。

我该怎么办??

1 个答案:

答案 0 :(得分:1)

通过使用日志记录库中已有的内容,您可以轻松得多。具体来说,有一个TimedRotatingFileHandler,您只需要更改其命名文件的方式即可。我为您创建了一个最小的工作演示,该演示每秒钟更改一次将日志保存到的文件夹。 编辑:改为每隔一小时滚动一次,而不是按照下面的评论每秒滚动一次

import os
import logging
from time import sleep, strftime
from logging.handlers import TimedRotatingFileHandler

def namer(default_name):
    head, tail = os.path.split(default_name)
    folder_name = 'logs'+strftime('%H%M%S') 
    folder = os.path.join(head, folder_name)
    try:
        os.mkdir(folder)
    except:
        # folder already exists
        pass
    return os.path.join(folder, tail)

logger = logging.getLogger()
handler = TimedRotatingFileHandler('base.log', when='H')
handler.namer = namer
# set the rollover time to the next full hour
handler.rolloverAt = datetime.now().replace(microsecond=0,second=0,minute=0).timestamp() + 60*60
logger.addHandler(handler)

logger.warning('test1')
sleep(2)
logger.warning('test2')