python - 如何在主 Flask 模块之外登录?

标签 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("日志消息")

效果很好。但是,我有一些 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/

相关文章:

java - SLF4J 和记录器工厂

elasticsearch - 如何解决elasticsearch的这个 "Content type detection for rest requests is deprecated"问题?

python - 如何获取包含另一个集合中的键的文档计数

python - 从 pandas apply() 函数中获取前一行值

python - 显示更多有效数字的系数

数据库设计 : storing many large reports for frequent historical analysis

python - 从 GCP 安装文档运行 "[CRITICAL] WORKER TIMEOUT"时,日志中的 "Hello Cloud Run with Python"

javascript - 使用flask将所有输入框中的输入提取到列表中

python - UUIDField 可以用作 Django 3.2.^ 中的 default_auto_field 吗?

python - 如何检查以下项目之一是否在列表中?