Я пытаюсь изменить файл, в котором сохраняются результаты моих журналов. Я знаю существование класса TimeRotatingFileHandler , однако думаю, что не могу его использовать, так как сохраняю данные с такой структурой:
/usr/src/app/data/{%Y-%m}/logs/{%Y-%m-%d}.log
Если это был только файл .log имя файла, которое меняется там не будет никаких проблем. Однако каталог также меняется каждый месяц, так как я не только сохраняю данные журналов и хочу каждый месяц удалять все данные.
Вот мой logging.conf
файл:
[loggers]
keys=root, luigi-interface
[handlers]
keys=rootConsole, rootFile, luigiConsole, luigiFile
[formatters]
keys=rootFormatter, luigiFormatter
[formatter_rootFormatter]
class=logging.Formatter
format=%(asctime)s [%(levelname)s] %(name)s | %(methodname)s - %(message)s
datefmt=%Y-%m-%d %H:%M:%S
[formatter_luigiFormatter]
format=%(asctime)s [%(levelname)s] %(name)s | %(message)s
datefmt=%Y-%m-%d %H:%M:%S
[handler_rootConsole]
class=logging.StreamHandler
formatter=rootFormatter
args=()
[handler_rootFile]
class=logging.FileHandler
formatter=rootFormatter
args=('/usr/src/app/data/default.log','a')
[handler_luigiConsole]
class=logging.StreamHandler
level=INFO
formatter=luigiFormatter
args=()
[handler_luigiFile]
class=logging.FileHandler
level=INFO
formatter=luigiFormatter
args=('/usr/src/app/data/default.log','a')
[logger_root]
level=INFO
handlers=rootConsole, rootFile
[logger_luigi-interface]
level=DEBUG
handlers=luigiConsole, luigiFile
qualname=luigi-interface
propagate=0
Мне удалось изменить каталог сохранения, выполнив этот фрагмент кода перед выполнением задачи Main luigi. Тем не менее, я думаю, что это неправильный способ сделать это, так как мне нужно вручную изменить обработчики, добавленные к каждому регистратору, чтобы заставить его работать.
loggers = [logging.getLogger(), logging.getLogger('luigi-interface')]
for l in loggers:
formatter = None
for h in l.handlers:
if type(h) == logging.FileHandler:
formatter = h.formatter
l.removeHandler(h)
if formatter:
logs_directory = os.path.join(os.getcwd(), 'data', self.run_date.strftime('%Y-%m'), 'logs')
file_path = os.path.join(logs_directory, '{}.log'.format(self.run_date))
if not os.path.exists(logs_directory):
os.makedirs(logs_directory)
fh = logging.FileHandler(file_path, 'a')
fh.setFormatter(formatter)
l.addHandler(fh)
Знаете ли вы, есть ли лучшее решение? добиться желаемого поведения?