开发者社区> 问答> 正文

在机器人框架中使用python根记录器

我正在使用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将输出所有日志,但显然不是所需的格式。

展开
收起
祖安文状元 2020-02-23 16:12:32 802 0
1 条回答
写回答
取消 提交回答
  • 想出了一些解决方法。我要做的就是在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')
    
    2020-02-23 16:12:51
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
From Python Scikit-Learn to Sc 立即下载
Data Pre-Processing in Python: 立即下载
双剑合璧-Python和大数据计算平台的结合 立即下载