我想根据创建新日志时的时间(特别是小时)来更改日志的目录。
例如,假设在运行程序期间,消息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方法...但是没有。
我该怎么办??
答案 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')