我正在使用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中正确格式化。
但是,应用程序也会自动记录所有请求。此信息显示在标准输出中,如下所示:
127.0.0.1 - - [19/Jun/2015 12:22:03] "GET /portal/ HTTP/1.1" 200 -
我希望这些信息也可以在json中格式化。我一直在寻找负责创建此输出但没有成功的记录器/代码。
此输出在哪里生成? 是否有更改此记录信息格式的机制?
答案 0 :(得分:4)
第一次使用app.logger
属性时,Flask会设置一些日志处理程序:
DEBUG
,并且app.debug
上的过滤器为真。ERROR
的生产记录器。您可以通过运行以下方式再次删除这些处理程序:
app.logger.handlers[:] = []
但是,您看到的日志行不是由Flask记录的,而是由WSGI服务器记录的。内置的Werkzeug服务器(在您使用app.run()
时使用)和其他各种WSGI服务器都可以执行此操作。例如,Gunicorn使用默认的Python记录器来记录访问权。
内置的WSGI服务器永远不应该用于生产(它不能很好地扩展,并且不会对恶意攻击者进行战斗强化)。
对于Gunicorn,您可以禁用日志传播以使日志记录分开:
logging.getLogger('gunicorn').propagate = False
答案 1 :(得分:0)
烧瓶内部使用werkzeug server
。这些日志由它而不是烧瓶打印。您可以使用logging.getLogger('werkzeug')
访问werkzeug记录器,并根据需要进行配置。例如:
werkzeug = logging.getLogger('werkzeug')
if len(werkzeug.handlers) == 1:
formatter = logging.Formatter('%(message)s', '%Y-%m-%d %H:%M:%S')
werkzeug.handlers[0].setFormatter(formatter)