2015-05-14 5 views
1

Я хочу сделать вывод журнала в ежедневную папку на python.Как создать ежедневную папку журнала в ведении журнала python

Я могу сделать путь журнала в ручном режиме, например, «../myapp/logs/20150514/xx.log» до текущей даты. Но проблема в том, что путь журнала не изменяется при изменении даты.

Я создаю экземпляр журнала в то время как я начинаю мой затянувшийся питона скрипт xx.py, и теперь путь журнала экземпляра является «../myapp/logs/20150514/xx.log». Но на завтра, поскольку экземпляр не изменился, поэтому его путь все еще «../myapp/logs/20150514/xx.log», который должен быть «../myapp/logs/20150515/xx.log».

Как я могу сделать вывод журнала в ежедневную папку?

Моя получить журнал коды экземпляра:

import os 
import utils 
import logging 
from logging.handlers import RotatingFileHandler 
import datetime 

def getInstance(file=None): 
    global logMap 
    if file is None: 
     file = 'other/default.log' 
    else: 
     file = file + '.log' 
    if(logMap.has_key(file)): 
     return logMap.get(file) 
    else: 
     visit_date = datetime.date.today().strftime('%Y-%m-%d') 
     date_file = os.path.join(visit_date,file) 
     log_path = utils.read_from_ini('log_path').strip() 
     log_path = os.path.join(log_path,date_file); 
     if not os.path.isdir(os.path.dirname(log_path)): 
      os.makedirs(os.path.dirname(log_path)) 
     logging.basicConfig(datefmt='%Y-%m-%d %H:%M:%S',level=logging.INFO) 
     log_format = '[%(asctime)s][%(levelname)s]%(filename)s==> %(message)s' 
     formatter = logging.Formatter(log_format) 
     log_file = RotatingFileHandler(log_path, maxBytes=10*1024*1024,backupCount=5) 
     log_file.setLevel(logging.INFO) 
     log_file.setFormatter(formatter) 
     instance = logging.getLogger(file) 
     instance.addHandler(log_file) 
     logMap[file] = instance 
     return instance 

ответ

1

Ваш RotatingFileHandler не вращается на временной основе, а размер основе. Вот для чего нужен аргумент maxBytes. Если вы хотите повернуть по времени, используйте вместо этого TimedRotatingFileHandler. Обратите внимание, что это работает с именами файлов, но не с путями (насколько я знаю). У вас может быть 20150505.log, 20150506.log, но не 20150505/mylog.log, 20150506/mylog.log.

Если вы хотите повернуть имена папок, вы, вероятно, можете сделать это, подклассифицировав TimedRotatingFileHandler и добавив свою собственную логику.

+0

Да, TimedRotatingFileHandler работает только с именами файлов. Если нет другого изящного решения, я подумаю о создании его подкласса. Большое спасибо. – JackYe

Смежные вопросы