设置日志文件和报告 HTML 文件位置

Setting log file and report HTML file locations

下面是对帮助我走到这一步的问题的引用(还有很多,但不幸的是我没有保存链接):

我想指定 .log 文件和 .html 报告文件的文件名和位置。

下面是我最近的尝试。

“创建”fileHandler 记录器的函数:

def define_file_logger(log_level, formatter, file_location):
    # create directory
    os.makedirs(os.path.dirname(file_location), exist_ok=True)

    # create file handler for logging to file
    file_handler = logging.FileHandler(filename=Path(file_location) / 'log.log')
    file_handler.setLevel(log_level)

    # apply formatter to file handler logger
    file_handler.setFormatter(formatter)

    # request logger
    final_logger = logging.getLogger(__name__)

    # prevent double logs in console
    if final_logger.hasHandlers():
        final_logger.handlers.clear()

    final_logger.propagate = False

    # add handler
    final_logger.addHandler(file_handler)

    # return
    return final_logger

我的 config.py 文件(在 root 目录中):

@pytest.hookimpl(tryfirst=True)
def pytest_load_initial_conftests(args, early_config, parser):
    os.environ['reports_dir'] = str(Path('Reports', f'{datetime.now().strftime("%d.%m.%Y")}', f'{datetime.now().strftime("%H.%M")}'))

我的 conftest.py 文件(在 root 目录中):

@pytest.hookimpl(tryfirst=True)
def pytest_configure(config):
    # set custom options only if none are provided from command line
    if not config.option.htmlpath:
        # set path and file name
        config.option.htmlpath = Path(os.environ['reports_dir']) / 'report.html'
        config.option.self_contained_html = True

当我运行这个时,我得到错误:

No such file or directory

如果我将此更改为define_file_logger 函数:

之前:

# create file handler for logging to file
file_handler = logging.FileHandler(filename=Path(file_location) / 'log.log')

之后:

# create file handler for logging to file
file_handler = logging.FileHandler(filename='log.log')

我回到这个问题上,实际上设法弄明白了..

本节:

# create directory
os.makedirs(os.path.dirname(file_location), exist_ok=True)

没有创建我想要的目录。

目录应该是这样的:

├── Reports
│   └── 08.03.2022
│       ├── 08.35
│       │   └── report.html
│       └── 08.44
│           ├── Execution_Log.log
│           └── report.html

本质上是:

Reports > Date > Time > file

但它正忙于为 TIME 文件夹创建文件夹(无论出于何种原因)。

所以现在,我有这个:

config.pysrc 目录中:

@pytest.hookimpl(tryfirst=True)
def pytest_load_initial_conftests(args, early_config, parser):
    # set directories
    os.environ['current_dir'] = str(Path(__file__))
    os.environ['project_dir'] = str(str([p for p in Path(os.environ['current_dir']).parents if p.parts[-1] == 'src'][0]))
    os.environ['reports_dir'] = str(Path('Reports', f'{datetime.now().strftime("%d.%m.%Y")}', f'{datetime.now().strftime("%H.%M")}'))

conftest.pysrc 目录中:

@pytest.hookimpl(tryfirst=True)
def pytest_configure(config):
    # set path and file name
    config.option.htmlpath = Path(os.environ['reports_dir'], 'report.html')
    config.option.self_contained_html = True

custom_logger.py(不必在 src 目录中):

def define_file_logger(log_level: str, formatter: logging.Formatter, file_location: str = None) -> logging.FileHandler:
    # create directory
    os.makedirs(file_location, exist_ok=True)

    # create file handler for logging to file
    file_handler = logging.FileHandler(filename=Path(os.environ['reports_dir'], 'Execution_Log.log'))
    file_handler.setLevel(LOG_MAP[log_level])

    # apply formatter to file handler logger
    file_handler.setFormatter(formatter)

    # return logger
    return file_handler

我认为这就是导致我出现问题的原因:

# create directory
os.makedirs(os.path.dirname(file_location), exist_ok=True)

不应该包括os.path.dirname,像这样:

# create directory
os.makedirs(file_location, exist_ok=True)

我也改了这个(Path(file_location) / 'log.log'):

# create file handler for logging to file
file_handler = logging.FileHandler(filename=Path(file_location) / 'log.log')

为此:

# create file handler for logging to file
file_handler = logging.FileHandler(filename=Path(file_location, 'log.log'))