我有一个Python Flask应用程序,该条目文件在应用程序上配置了一个记录器,如下所示:
app = Flask(__name__)
handler = logging.StreamHandler(sys.stdout)
app.logger.addHandler(handler)
app.logger.setLevel(logging.DEBUG)
然后我使用
进行一堆日志记录 app.logger.debug("Log Message")
工作正常。但是,我有一些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的句柄...
答案 0 :(得分:15)
尽管这可能是重复的,但我想写出一些python日志记录知识。
DON&#39; T传递记录器。您始终可以logging.getLogger(<log name as string>)
访问任何给定的记录器。默认情况下,* flask使用您为Flask
类提供的名称。
因此,如果您的主模块被调用为“my_tool&#39;”,您可以在logger = logging.getLogger('my_tool')
模块中执行Service
。
为了添加它,我喜欢明确命名我的记录器和包,所以我会做Flask('my_tool')
**,在其他模块中,有子级记录器,如。所有使用相同根记录器(和处理程序)的logger = logging.getLogger('my_tool.services')
。
*没有经验,基于其他答案。
**再次,如果这是一个好习惯,请不要使用烧瓶,dk
编辑:超级简单的愚蠢示例
主要烧瓶应用
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
。
module2
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