2

私はPythonロギングに慣れていましたが、正常に動作します。1つのlogging.basicConfig(...)モジュール(some.pyファイル)にセットすればlogging、どこでも使用できます。明らかに、ロギングはグローバルです。

問題は、 basicConfig(...)が(some.pyファイルで)表示されたmodule場所を呼び出さない場合に、ロギングがその設定をどのように見つけるかです。ロギングはすべてのパッケージをスキャンしますか?

logging.basicConfig(...)入れてany.pyモジュール(any.py)をインポートしたり、どこにも使用しなかったりしても、ログ設定が有効になります

4

2 に答える 2

4

ロギングを理解するには、Pythonの標準ライブラリソースに飛び込みます。

トリックは次のとおりです。

#/usr/lib/python3.2/logging/__init__.py
...
root = RootLogger(WARNING)
Logger.root = root
Logger.manager = Manager(Logger.root)
...

# and 
def basicConfig(**kwargs):
    ...
        hdlr = StreamHandler(stream)
        fs = kwargs.get("format", BASIC_FORMAT)
        dfs = kwargs.get("datefmt", None)
        style = kwargs.get("style", '%')
        fmt = Formatter(fs, dfs, style)
        hdlr.setFormatter(fmt)
        root.addHandler(hdlr)

したがって、basicconfig()特定のパラメーターを使用して呼び出すと、rootロガーが設定されます。最後にgetLogger

def getLogger(name=None):
    """
    Return a logger with the specified name, creating it if necessary.

    If no name is specified, return the root logger.
    """
    if name:
        return Logger.manager.getLogger(name)
    else:
        return root
于 2012-04-04T07:46:52.740 に答える
2

ここには魔法のスキャンはないと思います。

  • test別のディレクトリで次のようにテストしてみてください。

    
    test/main.py:
        import logging
        logging.info('test')

    test/any.py: import logging logging.basicConfig(filename='test.log', level=logging.INFO)

    python main.py

    結果:ファイルがありtest.logません。

  • 次に、テストを更新しましょう。

    
    test/main.py:
        import logging
        import any
        logging.info('test')

    python main.py

    結果:文字列を含む新しいtest.logファイル。INFO:root:test

  • ですからany.py、あなたの場合、あなたの期待にもかかわらず、どういうわけか輸入されていると思います。

    方法any.pyを簡単にインポートできる場合があります。そこに数行追加するだけです。

    
    test/any.py:
        from traceback import print_stack
        print_stack()
        ...

    python main.py

    結果:

    
    File "main.py", line 2, in 
        import any
    File "any.py", line 2, in 
        print_stack()
    

    このスタックは、any.pyがからインポートされたことを示していますmain.py

    あなたの場合、それがどこから輸入されているかを見つけていただければ幸いです。

于 2012-04-05T05:25:47.450 に答える