设置日志文件和报告 HTML 文件位置
Setting log file and report HTML file locations
下面是对帮助我走到这一步的问题的引用(还有很多,但不幸的是我没有保存链接):
- Change default location log file generated by logger in python
我想指定 .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.py
在 src
目录中:
@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.py
在 src
目录中:
@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'))
下面是对帮助我走到这一步的问题的引用(还有很多,但不幸的是我没有保存链接):
- Change default location log file generated by logger in python
我想指定 .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.py
在 src
目录中:
@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.py
在 src
目录中:
@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'))