我有一个 Python Flask 应用程序,入口文件在应用程序上配置一个记录器,如下所示:
app = Flask(__name__)
handler = logging.StreamHandler(sys.stdout)
app.logger.addHandler(handler)
app.logger.setLevel(logging.DEBUG)
然后我使用
进行大量日志记录app.logger.debug("日志消息")
效果很好。但是,我有一些 API 函数,例如:
@app.route('/api/my-stuff', methods=['GET'])
def get_my_stuff():
db_manager = get_manager()
query = create_query(request.args)
service = Service(db_manager, query)
app.logger.debug("Req: {}".format(request.url))
我想知道的是如何在 Service
模块/python 类中进行日志记录。我必须将应用程序传递给它吗?这似乎是一个不好的做法,但我不知道如何从主 Flask 文件之外获取 app.logger 的句柄......
最佳答案
尽管这可能是重复的,但我还是想写出一点点 Python 日志知识。
不要传递记录器。您始终可以通过 logging.getLogger(<log name as string>)
访问任何给定的记录器.默认情况下,它看起来像* flask 使用您提供给 Flask
的名称类(class)。
所以如果你的主模块被称为“my_tool”,你会想要做logger = logging.getLogger('my_tool')
在 Service
模块。
补充一点,我喜欢明确地命名我的记录器和包,所以我会这样做 Flask('my_tool')
** 在其他模块中,有类似的子级别记录器。 logger = logging.getLogger('my_tool.services')
都使用相同的根记录器(和处理程序)。
* 没有经验,基于其他答案。
** 同样,不要使用 flask ,如果这是好的做法,请使用 dk
编辑: super 简单的愚蠢示例
主 Flask 应用
import sys
import logging
import flask
from module2 import hi
app = flask.Flask('tester')
handler = logging.StreamHandler(sys.stdout)
handler.setFormatter(logging.Formatter(
'%(asctime)s - %(name)s - %(levelname)s - %(message)s'))
app.logger.addHandler(handler)
app.logger.setLevel(logging.DEBUG)
@app.route("/index")
def index():
app.logger.debug("TESTING!")
hi()
return "hi"
if __name__ == '__main__':
app.run()
模块2
import logging
log = logging.getLogger('tester.sub')
def hi():
log.warning('warning test')
输出
127.0.0.1 - - [04/Oct/2016 20:08:29] "GET /index HTTP/1.1" 200 -
2016-10-04 20:08:29,098 - tester - DEBUG - TESTING!
2016-10-04 20:08:29,098 - tester.sub - WARNING - warning test
编辑 2:与子记录器混在一起
完全不需要,仅用于一般知识。
通过定义子记录器,通过添加 .something
来完成在 logging.getLogger('root.something')
中的根记录器名称之后它基本上为您提供了一个不同的命名空间来使用。
我个人喜欢使用它来对日志记录中的功能进行分组。所以有一些.tool
或 .db
知道正在记录什么类型的代码。但它也允许这些子记录器可以拥有自己的处理程序。因此,如果您只想将部分代码打印到 stderr
, 或者你可以这样做的日志。这是一个修改后的示例 module2
.
模块2
import logging
import sys
log = logging.getLogger('tester.sub')
handler = logging.StreamHandler(sys.stderr)
handler.setFormatter(logging.Formatter('%(name)s - %(levelname)s - %(message)s'))
log.addHandler(handler)
log.setLevel(logging.INFO)
def hi():
log.warning("test")
输出
127.0.0.1 - - [04/Oct/2016 20:23:18] "GET /index HTTP/1.1" 200 -
2016-10-04 20:23:18,354 - tester - DEBUG - TESTING!
tester.sub - WARNING - test
2016-10-04 20:23:18,354 - tester.sub - WARNING - test
关于python - 如何在主 Flask 模块之外登录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39863718/