如何在主Flask模块外部登录?

时间:2016-10-05 00:31:36

标签: python logging flask

我有一个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的句柄...

1 个答案:

答案 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
相关问题