Почему Flask записывает логи в журнал логов? - PullRequest
0 голосов
/ 01 мая 2020

Я в процессе создания простого приложения, которое я запускаю в режиме отладки в flask. Я решил использовать ведение журнала для записи журналов.

    import logging
    dlog = logging
    dlog.basicConfig(filename='app.log', format='%(asctime)s %(message)s',
                     datefmt='[%Y-%m-%d | %H:%M:%S]', level=logging.INFO)
    ...
if __name__ == '__main__':
    app.run(debug=True, host='localhost', port='8002')

Но я обнаружил, что в app.log (и мое приложение не называется "app.py") Flask дополнительно записывает собственные журналы к моему. как:

[2020-05-01 | 21:36:04]  * Running on http://localhost:8002/ (Press CTRL+C to quit)
[2020-05-01 | 21:36:04]  * Restarting with stat
[2020-05-01 | 21:36:05]  * Debugger is active!
[2020-05-01 | 21:36:05]  * Debugger PIN: 290-968-029
[2020-05-01 | 21:36:15] 127.0.0.1 - - [01/May/2020 21:36:15] "[37mGET / HTTP/1.1[0m" 200 -
[2020-05-01 | 21:36:15] 127.0.0.1 - - [01/May/2020 21:36:15] "[36mGET /static/js/main.js HTTP/1.1[0m" 304 -

Почему это происходит и как я могу отделить flask логирование от моего собственного?

1 Ответ

1 голос
/ 01 мая 2020

Это потому, что logging.basicConfig настраивает регистратор root. Все созданные регистраторы передают сообщения журнала своим родителям , если только им явно не сказано:

app.logger.propagate = False

Отключение регистратора также возможно:

app.logger.disabled = True

или установка менее подробного режима

app.logger.setLevel(logging.WARNING)

Создание flask записи только в другой файл является более сложным. Вы должны удалить StreamHandler и создать FileHandler и Formatter вручную. Модуль logging дает вам большую гибкость, но может быть камнем преткновения:

# https://docs.python.org/3/library/logging.html#logrecord-attributes
formatter = logging.Formatter("{asctime:s} {name} [{levelname}] {filename}:{lineno} {msg}", style="{")
file_handler = logging.FileHandler("flask.log")
file_handler.setFormatter(formatter)
# set log level threshold for this handler
file_handler.setLevel(logging.INFO)
# flask creates StreamHandler for you, if you don't want that
# just set handlers to empty list
app.logger.handlers = []
app.logger.addHandler(file_handler)
# set log level on the flask logger
app.logger.setLevel(logging.INFO)
# don't propagate to parent logger (logging.root) to not duplicate
# the logs if you're handling log messages in root logger
app.logger.propagate = False

app.logger.info("spanish iniquisition")

# flask.log:
# 2020-05-02 09:12:31,631 t [INFO] t.py:16 spanish iniquisition
...