我正在使用Robot Framework来运行自己制作的python脚本,但是当我尝试通过自定义的根记录器记录日志时遇到了一个问题,该记录器一直用于以所需格式输出python记录。如果我不使用根记录器,RF可以很好地输出日志,但是如果我使用根记录器,则RF不会输出,也不会输出python脚本完成的日志记录。这是我的代码:
logger.py:
import logging.config
import os
_WORKSPACE = os.getenv(
'WORKSPACE',
default=R'C:\opt\ci\jenkins\workspace\Killer_Automation_Robot'
)
def _get_named_logging_config(test_name):
named_logging_config = dict(
version = 1,
disable_existing_loggers = False,
formatters = {
'file': {
'format': '[%(asctime)-s] {%(filename)-30s:%(lineno)-3d} %(levelname)-8s - %(message)-s'
},
'console': {
'format': '[%(asctime)-s] {%(filename)-30s:%(lineno)-3d} %(levelname)-8s - %(message)-s'
}
},
handlers = {
'default': {
'level': 'INFO',
#'level': 'DEBUG',
'formatter': 'console',
'class': 'logging.StreamHandler',
},
'file': {
'level': 'DEBUG',
'formatter': 'file',
'class': 'logging.FileHandler',
'filename': ''.join([
_WORKSPACE,
R'\{!s}.log'.format(
test_name
),
]),
'mode': 'w',
'encoding': 'utf-8'
},
},
loggers = {
'': {
'handlers': ['default','file'],
'level': 'DEBUG',
'propagate': True
},
'hammer': {
'handlers': ['default'],
'level': 'WARN',
'propagate': False
},
},
root = {
'handlers': ['default','file'],
'level': 'DEBUG',
},
)
return named_logging_config
def instantiate_logger(name):
named_logging_config = _get_named_logging_config(
''.join([
'robot_',
name,
])
)
return named_logging_config
def make_logging():
named_logging_config = instantiate_logger('do_math')
logging.config.dictConfig(named_logging_config)
log = logging.getLogger('')
do_something.robot
*** Settings ***
Library do_math
*** Test Cases ***
Logging test
do logging
do_something.py:
import logger
import logging
logger.make_logging()
log = logging.getLogger(__name__)
log.info('Starting {!s}'.format('Install Software Test'))
class do_math(object):
def __init__(self):
log.info('Starting {!s}'.format('do math'))
def do_logging(self):
log.info('this log worked')
self.do_math1()
def do_math1(self):
log.warning('this is a warning')
当我使用do_something.py运行此程序时,什么都没有记录。但是,当我自己运行do_something.py时,将获得所有日志的预期输出。另外,如果我删除了实例化根记录器并运行RF文件的python文件中的logger.make_logging()行,RF将输出所有日志,但显然不是所需的格式。
想出了一些解决方法。我要做的就是在logger.py中添加一个函数attach_to_logger(),该函数获取并返回一个全局日志变量,然后以任何登录do_something.py的方法调用该函数。感觉有点乱,但对我来说很好。
logger.py:
#attach_to_logger() has been added
def instantiate_logger(name):
named_logging_config = _get_named_logging_config(
''.join([
'robot_',
name,
])
)
return named_logging_config
def make_logging():
named_logging_config = instantiate_logger('do_math')
logging.config.dictConfig(named_logging_config)
log = logging.getLogger('')
def attach_to_logger(name):
global log
make_logging()
log = logging.getLogger(name)
然后,只要需要进行任何日志记录,我在模块中要做的就是调用attach_to_logger()。
do_something.py:
import logger
import logging
class do_math(object):
def do_logging(self):
log = logger.attach_to_logger(__name__)
log.info('Starting {!s}'.format('Do Something test!'))
log.info('this log worked')
self.do_math1()
def do_math1(self):
log = logger.attach_to_logger(__name__)
log.warning('this is a warning')
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。