flask在控制台打印出来的请求日志如何记录到日志文档?

想把flask在开发环境跑的时候的控制台输出的日志也保存到文件。
参考了网上,基本上都是先配置logger然后自己在代码中加入logger.info('xxx')来记录日志。

我想实现的效果是,控制台输出的一些请求以及默认打印出来的日志都直接写到log文件。

我配置的logger代码如下:

#app.__init__.py

def create_app(config_name):
    ...
    filehandler = logging.handlers.TimedRotatingFileHandler("flask.log", "M", 1, 0)
    filehandler.setLevel('DEBUG')
    app.logger.addHandler(filehandler
    ...
    

按理效果应该是有一个flask.log文件生成,然后每分钟另存一个。实际效果是有flask.log文件产生,但是控制台打印出来的一些请求和其他信息都没有,也不会按时间自动生成新的日志。

求大神解惑

阅读 21.9k
4 个回答

参考回答中 悦轩 的,把logger加在工厂函数外面,可以记录,加在工厂函数内部,仅会记录你自己在flask工程中显式输出的日志。

可以参考flask官网日志说明,在工厂函数中初始化

# app.__init__.py

def create_app(config_name):
    ...
    filehandler = logging.handlers.TimedRotatingFileHandler("flask.log", "M", 1, 0)
    filehandler.setLevel('DEBUG')
    app.logger.addHandler(filehandler
    ...

在其他模块中要输出日志的时候需要import current_app这个对象:

# some module
from flask import current_app
...
def tast():
    ...
    current_app.logger.info('msg')
    ...

这样就会有日志的输出了。

我理解是这样的:

如果log的配置写在工厂函数内部,那仅app这个对象的日志才会输出,也就是我们在代码中手动输出的日志才有输出,而运行flask控制台产生的日志是flask框架本省的日志,不会输出,所以会产生log文件,但自己没有手动输出日志,日志就是空的。

当log的配置写在工厂函数外面,那就对整个工程有效,所以flask框架的日志也就会输出了。

TimedRotatingFileHandler,你这个拼写错了,你这种写法,我测试半天也找不出原因,毕竟才工作半年,要是找到原因了麻烦告诉下,我把这个写到工厂函数外面可以记录:

import logging
logging.basicConfig(level=logging.DEBUG)
filehandler = logging.handlers.TimedRotatingFileHandler("flask.log", "M", 1, 0)
# filehandler.setLevel('DEBUG')
logging.getLogger().addHandler(filehandler)

好像有把终端输出输出到文件的方法,可以百度看看。
我是使用nohup命令,执行nohub python main.py runserver &, 终端日志就会输出到nohup.out文件中。可以使用tail -f nohup.out 动态观察文件变化。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏