Возможно, ваша проблема вызвана оператором import public
, который звонит на logging.debug(...)
или что-то подобное. Что тогда происходит, это:
- Вы
import public
. В качестве побочного эффекта это вызывает, например, logging.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 фактически повторно запускает скрипт в отдельном процессе, который учитывает удвоение количества сообщений. Вы можете проиллюстрировать это, используя строку формата, которая показывает идентификатор процесса: если вы используете
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...
, который, по-видимому, подтверждает приведенный выше анализ.