在Json中格式化Flask应用程序日志

我正在使用 Python / Flask应用程序并尝试在json中对日志进行格式化(按行).

使用python-json-logger包,我修改了app.logger的格式化程序,如下所示:

from pythonjsonlogger import jsonlogger
formatter = jsonlogger.JsonFormatter(
    '%(asctime) %(levelname) %(module) %(funcName) %(lineno) %(message)')
app.logger.handlers[0].setFormatter(formatter)

这按预期工作.传递给app.logger的任何消息都在json中正确格式化.

但是,应用程序也会自动记录所有请求.此信息显示在stdout中,如下所示:

127.0.0.1 - - [19/Jun/2015 12:22:03] "GET /portal/ HTTP/1.1" 200 -

我希望这些信息也可以在json中格式化.我一直在寻找负责创建此输出但没有成功的记录器/代码.

这个输出在哪里生成
是否有机制更改此记录信息的格式?

解决方法

当您第一次使用app.logger属性时,Flask会设置一些日志处理程序:

>一个调试记录器,设置为日志级别DEBUG,并且app.debug上的过滤器为true.
>生产记录器,设置为ERROR.

您可以通过运行以下方式再次删除这些处理程序:

app.logger.handlers[:] = []

但是,您看到的日志行不是由Flask记录的,而是由Wsgi服务器记录的.内置的Werkzeug服务器(在使用app.run()时使用)和其他各种Wsgi服务器都可以执行此操作.例如,Gunicorn使用认的Python记录器来记录访问.

永远不应该在生产中使用内置的Wsgi服务器(它不能很好地扩展,并且不会针对恶意攻击者加强攻击).

对于Gunicorn,您可以禁用日志传播以使日志记录分离:

logging.getLogger('gunicorn').propagate = False

相关文章

前言 做过web项目开发的人对layer弹层组件肯定不陌生,作为l...
前言 前端表单校验是过滤无效数据、假数据、有毒数据的第一步...
前言 图片上传是web项目常见的需求,我基于之前的博客的代码...
前言 导出Excel文件这个功能,通常都是在后端实现返回前端一...
前言 众所周知,js是单线程的,从上往下,从左往右依次执行,...
前言 项目开发中,我们可能会碰到这样的需求:select标签,禁...