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

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)

  • 这对Flask帮助了我,但也帮助了一些很好的常规测井技巧。 (3认同)
  • 非常感谢。你的解决方案确实有效。就我而言,我必须首先非常系统地修剪所有其他尝试。并且还必须在“app.logger.addHandler(handler)”之前使用“app.logger.handlers.clear()”以避免双重日志记录。 (3认同)
  • 一个问题 - tester.sub中的子部分是什么?sub是submodule的名字吗? (2认同)
  • @user4184113 在我为您提供的答案中添加了有关子记录器的信息。它确实不是您正在寻找的东西所需要的,只是分享有趣的知识。 (2认同)
  • 在花了两天的时间在 Flask 中进行日志记录之后,这就是为我解决问题的答案。非常感谢! (2认同)