如何在python中为两个脚本实现单个记录器,一个定义工作流,一个包含所有功能?

时间:2016-08-18 05:40:09

标签: python python-2.7 logging

我有两个python脚本,一个作为workflow.py,另一个是task.py. workflow.py定义了task.py的工作流,因此它只有一个main,它实例化task.py的构造函数。 worflow.py的结构如下:

workflow.py
from optparse import OptionParser
from optparse import OptionGroup
from task import *
def main():
        dir = os.path.dirname(os.path.abspath(sys.argv[0]))

    try:
        parser = parse_options(parser, dir)
        (options, args) = parser.parse_args()
        print ("everything working fine in workflow")
    except SystemExit:
        return 0
    task_object = task_C(options.source_dir, options.target, options.build_dir)
    print ("workflow is reached")
    task_object.another_funct()
    ##following 3 lines is when set_logger is defined
    log = task_object .set_logger()
    log.info(""workflow is reached"")
    log.info("more info if required")


def parser(parser, dir):
        group = OptionGroup(parser, "Prepare")
        group.add_option("-t", "--target",action="store", dest="target",
                      help="Specifies the target.")
        group.add_option("-s", "--Source",action="store", dest="source_dir",
                      help="Specifies the source dir.")
        group.add_option("-b", "--build",action="store", dest="build_dir",
                      help="Specifies the build dir.")
        parser.add_option_group(group)


task.py
class task_C():
   def __init__(self, source_dir, target, build_dir):
     self.target = self.settargetplatform(target)
     self.source_dir = self.setsourcedir(source_dir)
     self.build_dir = self.setbuilddir(build_dir)

   def settargetplatform( target):
    ...sets target dir
   def setsourcedir(source_dir ):
    ...sets source_dir
   def setbuilddir(build_dir):
    ..sets build_dir
   def another_funct( ):
    print ("inside the another funct")
    print ("some usefull info")
    print ("...")
   ##following part after adding set_logger then using logger
    log = self.set_logger()
    log.info( "inside the another funct")
    log.info( " some usefull info")
    log.info ("...")
    .
  def set_logger(self):
        logging.basicConfig()
        l = logging.getLogger('root')
        l.setLevel(logging.DEBUG)
        formatter = logging.Formatter(' %(levelname)s : %(message)s')
        fileHandler = logging.FileHandler(self.build_dir+"/root.log", mode='w')
        fileHandler.setFormatter(formatter)    
        l.addHandler(fileHandler)

现在,如上面的脚本所示,在工作流内部调用了task.py构造函数,两个脚本中都有各种print语句,我希望有一个logger而不是print语句,为此目的我想将日志放在位置" build_dir"但是该位置是在task.py中设置的,我不想在workflow.py中添加另一个函数来检索' build_dir'。我在task.py中添加了set_logger()函数,你可以在task.py中看到它可以满足我的目的但是我得到的日志包含所有NULL NULL NULL ...等等。那么,建议我如何在这两个脚本中包含一个包含所有打印语句的日志,以及我需要做出哪些改进?

2 个答案:

答案 0 :(得分:1)

  

实际上可以这样做,但重点是日志位置   必须在workflow.py中定义,我不想定义位置   因为它已在task.py中定义。在工作流程中我不想   定义已在task.py中设置的记录器的相同位置

根据您的上述评论 - 然后,您可以在set_logger()中拨打worker.py并将其传递给task.py,即worker.py中包含以下内容:

task_object = task_C(options.source_dir, options.target, options.build_dir)
log = task_object .set_logger()

对于对任务方法的任何调用,传递记录器(方法必须接受它作为参数) - 例如:

task_object.another_funct(log=log)

要使记录无法正常工作,请在return l

中的set_logger()末尾添加task.py

答案 1 :(得分:-1)

我想我会在<div class="wrapperShortOuter" style="width: 300px;"> <div class="wrapperLongInner" style="width: 600px;"> <div class="content" id="first" style="width: 300px"> <div style="background-color: turquoise; width: 300px; height: 200px;"></div> </div> <div class="content" id="second" style="width: 0px;"> <div style="background-color: burlywood; width: 300px; height: 150px;"></div> </div> <div class="content" id="third" style="width: 0px;"> <div style="background-color: yellowgreen; width: 300px; height: 250px;"></div> </div> </div> </div> <div style="background-color: red; width:50px; height: 100px;"></div>中定义记录器,并将其作为参数传递给workflow.py的构造函数。这似乎是最简单的解决方案。