1

使用する必要があるモジュールをインポートした後、余分なログ メッセージが表示されます。私はこれが起こらないようにするための正しい方法を見つけようとしています。次のコードは、問題を最もよく示しています。

import os
import logging
import flickrapi

class someObject:
    def __init__(self):
        self.value = 1
        logger = logging.getLogger(__name__)
        print logger.handlers
        logger.info("value = " + str(self.value))

def main():
    # Set up logging
    logger = logging.getLogger(__name__)
    logger.setLevel(logging.DEBUG)
    formatter = logging.Formatter('[%(asctime)-15s] %(name)-8s %(levelname)-6s %message)s')
    fh = logging.FileHandler(os.path.splitext(os.path.basename(__file__))[0]+".log")
    fh.setLevel(logging.DEBUG)
    fh.setFormatter(formatter)
    logger.addHandler(fh)
    ch = logging.StreamHandler()
    ch.setLevel(logging.INFO)
    ch.setFormatter(formatter)
    logger.addHandler(ch)
    logger.debug("Debug message")
    logger.info("Info message")

    thingy = someObject()

if __name__ == "__main__":
    main()

flickrapi インポートを使用すると、次の出力が表示されます。

DEBUG:__main__:Debug message
[2013-05-03 12:10:47,755] __main__ INFO   Info message
INFO:__main__:Info message
[<logging.FileHandler instance at 0x1676dd0>, <logging.StreamHandler instance at 0x1676ea8>]
[2013-05-03 12:10:47,755] __main__ INFO   value = 1
INFO:__main__:value = 1

flickrapi のインポートを削除すると、正しい出力が表示されます。

[2013-05-03 12:10:47,755] __main__ INFO   Info message
[<logging.FileHandler instance at 0x1676dd0>, <logging.StreamHandler instance at 0x1676ea8>]
[2013-05-03 12:10:47,755] __main__ INFO   value = 1

ロギングを使用するのはこれが初めてで、少し困惑しています。ドキュメントを数回読みましたが、理解に何かが欠けていると思います。

を見るとlogging.Logger.manager.loggerDict、他のロガーがありますが、それぞれ.handlersが空です。ロガーには__main__私が追加した 2 つのハンドラーしかありませんが、これらのメッセージはどこから来るのでしょうか?

私が壁にぶつかったので、これをどのように解決できるかについての指針は大歓迎です。

ありがとう

4

1 に答える 1

3

これは、使用している flickrapi ライブラリのバグです。その中でlogging.basicConfig()を呼び出しています。これは、ルートロガーに標準エラー出力にデフォルト設定されている StreamHandler を追加するため、ライブラリに対して行うのは間違っています__init__.py

おそらく、作成者にバグ レポートを開く必要があります。ライブラリが logging を設定する方法については、python logging docs に HOWTO があります

バグが修正されるまでこの問題を回避するには、次のことを実行できる必要があります。

# at the top of your module before doing anything else
import flickrapi
import logging
try:
    logging.root.handlers.pop()
except IndexError:
    # once the bug is fixed in the library the handlers list will be empty - so we need to catch this error
    pass
于 2013-05-03T12:40:38.037 に答える