2016-08-18 3 views
1

私はworkflow.pyとして2つのpythonスクリプトを持っていて、他はtask.pyです。 workflow.pyはtask.pyのワークフローを定義しているため、内部にはtask.pyのコンストラクタをインスタンス化するためのメインだけがあります。次のようにworflow.pyの構造は以下の通りである:今ワークフローを定義する2つのスクリプトとすべての関数を含む1つのスクリプト用にPythonで単一ロガーを実装する方法は?

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コンストラクタがワークフロー内部呼び出され、各種印刷ステートメントは、両方のスクリプトであり、iはだろうことが示されているようにprintステートメントの代わりにロガーを持つようにして、その目的のためにログをlocation "build_dir"の中に入れたいが、その場所はtask.pyの中に設定されているので、workflow.pyの中に別の関数を追加したくない'build_dir'を取り戻します。 task.pyの中でset_logger()関数をtask.pyの中に追加しました。これは私の目的に役立つかもしれませんが、ログにはすべてNULL NULL NULLが入っています。だから、私はどのように私はこれらの2つのスクリプトですべての印刷ステートメントを含む1つのログを持つことができますと私は何を改善する必要が示唆?

答えて

-1

私はloggerをworkflow.pyの中に定義し、それをtask_Cのコンストラクタにパラメータとして渡すと思います。それは最も簡単な解決策に見えるでしょう。

+1

set_logger()の終わりにreturn lを追加すでにtask.pyに定義されているので、そこに位置を定義する必要はありません。ワークフローでは、すでにtask.pyに設定されているロガーと同じ場所を定義したくありません。 – newlearner

1

は、実際には行うことができますが、ポイントは がworkflow.pyで定義する必要があり、その場合のログの場所にあり、それはすでにtask.py.で定義されているように私は場所が を定義する必要はありません がすでに上記のコメントを1としてtask.py

に設定されているロガーの同じ場所を定義するためにワークフローでは、私はしたくない - は、次に、あなたのset_logger()worker.pyに電話しtask.pyすなわちにそれを渡すことができますタスクメソッドへの呼び出しについて

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

ロガーを渡す(方法はPARAMとしてそれを受け入れなければならない) - 例えば:worker.pyに次の行を有する

task_object.another_funct(log=log) 
01正常に動作していないロギング用

- 実際にそれを行うことができるが、「ポイントが、その場合には、ログの場所はworkflow.pyで定義する必要があり、私はドンtask.py

関連する問題