use*_*113 21 python logging flask
我有一个Python Flask应用程序,该条目文件在应用程序上配置了一个记录器,如下所示:
app = Flask(__name__)
handler = logging.StreamHandler(sys.stdout)
app.logger.addHandler(handler)
app.logger.setLevel(logging.DEBUG)
Run Code Online (Sandbox Code Playgroud)
然后我做了一堆日志记录
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))
Run Code Online (Sandbox Code Playgroud)
我想知道的是如何在该Service模块/ python类中进行日志记录.我必须将应用程序传递给它吗?这似乎是一个不好的做法,但我不知道如何从主Flask文件外部获取app.logger的句柄...
Cas*_*mon 22
即使这是一个可能的重复,我想写出一点点的python日志记录知识.
不要传递记录器.您始终可以访问任何给定的记录器logging.getLogger(<log name as string>).默认情况下,*flask使用您为Flask类提供的名称.
因此,如果您的主模块名为"my_tool",您可能希望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()
Run Code Online (Sandbox Code Playgroud)
模块2
import logging
log = logging.getLogger('tester.sub')
def hi():
log.warning('warning test')
Run Code Online (Sandbox Code Playgroud)
输出
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
Run Code Online (Sandbox Code Playgroud)
编辑2:与子记录器混淆
完全不需要,只是为了一般知识.
通过定义一个孩子记录仪,通过添加完成.something根记录器名称之后logging.getLogger('root.something')它给你basiclly不同的命名空间的工作.
我个人喜欢用它来记录日志功能.所以有一些.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")
Run Code Online (Sandbox Code Playgroud)
产量
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
Run Code Online (Sandbox Code Playgroud)