您的问题可能是由import public
调用logging.debug(...)
或类似的语句引起的。然后发生的事情是这样的:
- 你
import public
。作为副作用,这会调用 eglogging.debug
或类似的方法,它会自动调用basicConfig
,将 a 添加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...
这似乎证实了上述分析。