Лучший способ поворота FileHandler при сохранении файла при смене каталога - PullRequest
0 голосов
/ 06 марта 2020

Я пытаюсь изменить файл, в котором сохраняются результаты моих журналов. Я знаю существование класса 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)

Знаете ли вы, есть ли лучшее решение? добиться желаемого поведения?

...