1

basicConfig を使用してループ内で作成された別のログ ファイルに書き込もうとしています。これまでのところ、後続のすべてのログ呼び出しを含むログ ファイルを 1 つだけ作成することができました。ここで些細なことを見逃していますか?ファイルモードに関するヒントが含まれているドキュメントを確認しましたが、他には何もありませんでした。

import logging


class MultipleInstancesStarter:
    def __init__(self):
        pass


    def startMany(self):
        objs = [Main(str(i)) for i in xrange(1, 10)]
        print objs
        for obj in objs:
            obj._start()


class Main:
    def __init__(self, i):
        self.index = i


    def _start(self):
        name = self.index
        logging.basicConfig(
                        filename="log_" + name + ".log",
                        filemode="w",
                        format="%(asctime)s -  %(levelname)s - %(filename)s:%(module)s:%(lineno)d - %(message)s",
                        level=logging.DEBUG)

        logging.debug("%s Message Debug" % name)
        logging.info("%s Message Info" % name)
        logging.error("%s Message Error" % name)


if __name__ == '__main__':
    MultipleInstancesStarter().startMany()

これにより、2 回目の反復からのログ エントリを含む log_1.log のみが作成されます。ループの外側にオブジェクトを作成しようとしましたが、以下に示すように問題なく別のファイルが作成されます。

def startMany(self):
    obj2 = Main("sample")
    obj2._start()

    objs = [Main(str(i)) for i in xrange(1, 10)]
    print objs
    for obj in objs:
        obj._start()

私が間違っていることはわかりませんが、助けていただければ幸いです。乾杯

4

1 に答える 1

2

これはうまくいきます:

import logging


class MultipleInstancesStarter:
    def __init__(self):
        pass

    def startMany(self):
        objs = [Main(str(i)) for i in xrange(1, 10)]
        print objs
        for obj in objs:
            obj._start()


class Main:
    def __init__(self, i):
        self.index = i

    def _start(self):
        name = self.index
        logger = logging.getLogger('%s-%s' % (__name__, self.index))
        handler = logging.FileHandler('log_%s.log' % name)
        log_format = ('%(asctime)s -  %(levelname)s - %(filename)s:'
                      '%(module)s:%(lineno)d - %(message)s')
        formatter = logging.Formatter(log_format)
        handler.setFormatter(formatter)
        logger.addHandler(handler)

        logger.debug("%s Message Debug" % name)
        logger.info("%s Message Info" % name)
        logger.error("%s Message Error" % name)


if __name__ == '__main__':
    MultipleInstancesStarter().startMany()

これが出力です(ログファイルでテールを使用しました):

==> log_1.log <== 2013-11-12 21:08:15,866 - エラー - test.py:test:31 - 1 メッセージ エラー

==> log_2.log <== 2013-11-12 21:08:15,866 - エラー - test.py:test:31 - 2 メッセージ エラー

==> log_3.log <== 2013-11-12 21:08:15,866 - エラー - test.py:test:31 - 3 メッセージ エラー

==> log_4.log <== 2013-11-12 21:08:15,866 - エラー - test.py:test:31 - 4 メッセージ エラー

==> log_5.log <== 2013-11-12 21:08:15,866 - エラー - test.py:test:31 - 5 メッセージ エラー

==> log_6.log <== 2013-11-12 21:08:15,866 - エラー - test.py:test:31 - 6 メッセージ エラー

==> log_7.log <== 2013-11-12 21:08:15,867 - エラー - test.py:test:31 - 7 メッセージ エラー

==> log_8.log <== 2013-11-12 21:08:15,867 - エラー - test.py:test:31 - 8 メッセージ エラー

==> log_9.log <== 2013-11-12 21:08:15,867 - エラー - test.py:test:31 - 9 メッセージ エラー

基本的に、ロギングの部分がややこしくなった場合は、インスタンスごとに 1 つずつ、異なるロガーを使用します。Pythonのドキュメントで読むのに良い記事

編集:ログレベルを追加するのを忘れました。これを行うには、ハンドラーをロガーに追加する前にこれを追加できます

handler.setLevel(logging.DEBUG)
于 2013-11-12T21:10:43.057 に答える