Ведение журнала python: как создать каталог журнала?

Я хотел бы использовать фреймворк python в своем приложении, и я хотел бы разрешить конечному пользователю моего приложения указать файл журнала. (Через структуру ведения журнала Python механизмы настройки, которые в моем случае являются разделом файла YAML, который конечный пользователь может редактировать, чтобы указать, как ведет себя журнал.)

Есть ли способ получить структуру ведения журнала, чтобы обеспечить существование каталога путем ее создания?. Поскольку точный путь к имени файла журнала встроен в информацию о конфигурации, указанную конечным пользователем, является нетривиальным для меня как писателя приложения для анализа этой информации, чтобы определить, какая директория должна быть создана.

Если конечный пользователь указывает "foo/bar/baz.log", я хотел бы убедиться, что создан каталог foo/bar.

Примечание. Это эквивалент Python этого вопроса SO о регистрации Java.

Ответ 1

Подкласс FileHandler (или любой другой обработчик, который вы используете) для вызова mkdir_p во время инициализации:

import logging
import os
import errno

def mkdir_p(path):
    """http://stackoverflow.com/a/600612/190597 (tzot)"""
    try:
        os.makedirs(path, exist_ok=True)  # Python>3.2
    except TypeError:
        try:
            os.makedirs(path)
        except OSError as exc: # Python >2.5
            if exc.errno == errno.EEXIST and os.path.isdir(path):
                pass
            else: raise

class MakeFileHandler(logging.FileHandler):
    def __init__(self, filename, mode='a', encoding=None, delay=0):            
        mkdir_p(os.path.dirname(filename))
        logging.FileHandler.__init__(self, filename, mode, encoding, delay)