あなたの問題はおそらく、import public
ステートメントが呼び出しを行っているか、logging.debug(...)
または同様のものが原因で発生しています。次に何が起こるかはこれです:
- あなた
import public
。副作用として、これはeglogging.debug
または同様のものを呼び出します。これは自動的にを呼び出します。これはルートロガーにbasicConfig
を追加しますStreamHandler
が、レベルは変更しません。
- 次に、を呼び出します
basicConfig
が、ルートロガーには既にハンドラーがあるため、(文書化されているように)何もしません。
- デフォルトのログレベルは
WARNING
、であるため、info
およびdebug
呼び出しは出力を生成しません。
インポートの副作用を実際に回避する必要があります。たとえば、への呼び出しは句にbasicConfig
含める必要があります。if __name__ == '__main__'
これでpublic.py
:
import logging
def main():
logging.debug('Hello from public')
そしてこれmain.py
:
import logging
from bottle import run, debug
import public
def main():
logging.basicConfig(level=logging.DEBUG)
logging.info('Started')
debug(mode=True)
public.main()
run(host='localhost', port = 8080, reloader=True)
logging.info('Finished')
if __name__ == '__main__':
main()
次の出力が得られます。
$ python main.py
INFO:root:Started
DEBUG:root:Hello from public
INFO:root:Started
DEBUG:root:Hello from public
Bottle server starting up (using WSGIRefServer())...
Listening on http://localhost:8080/
Hit Ctrl-C to quit.
^CINFO:root:Finished
$ Shutdown...
INFO:root:Finished
このことから、Bottleは実際には別のプロセスでスクリプトを再実行し、メッセージの倍増を説明していることがわかります。これは、プロセスIDを示すフォーマット文字列を使用して説明できます。
logging.basicConfig(level=logging.DEBUG,
format='%(process)s %(levelname)s %(message)s')
次に、次のような出力が得られます
$ python main.py
13839 INFO Started
13839 DEBUG Hello from public
13840 INFO Started
13840 DEBUG Hello from public
Bottle server starting up (using WSGIRefServer())...
Listening on http://localhost:8080/
Hit Ctrl-C to quit.
^C13839 INFO Finished
$ Shutdown...
13840 INFO Finished
次のように副作用を生成するステートメントを追加する場合は注意してくださいpublic.py
。
logging.debug('Side-effect from public')
モジュールレベルでは、ログ出力はまったく得られません。
$ python main.py
Bottle server starting up (using WSGIRefServer())...
Listening on http://localhost:8080/
Hit Ctrl-C to quit.
^C$ Shutdown...
これは、上記の分析を確認するように見えます。