【发布时间】:2018-01-04 08:57:16
【问题描述】:
下面是一些非常简单的烧瓶代码。如果您向http://127.0.0.1:5000/hello 发送请求,我编写了一个http api,它将返回'hello' 并将字符串'hello' 记录到/tmp/mylog.log 中
我被告知如果多个进程将日志写入一个文件会出现问题。因为文件上没有进程级锁。所以日志的内容可能会乱七八糟。
但是如果我在 uwsgi 中运行以下烧瓶代码,将会有多个工人。所以多进程。那我觉得会有问题。
但我在测试时没有发现任何问题。 那么为什么没有问题呢?它应该有问题吗?
import logging
from flask import Flask
app = Flask(__name__)
# The only important thing here is to specify the log file /tmp/mylog.log
file_handler = logging.FileHandler(filename='/tmp/mylog.log')
formatter = logging.Formatter('%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s')
file_handler.setFormatter(formatter)
logger = logging.getLogger()
logger.addHandler(file_handler)
logger.setLevel(logging.INFO)
@app.route('/hello')
def hello():
logger.info('hello')
return 'hello'
【问题讨论】:
-
不要直接从 Flask 打开记录器,将记录留给 WSGI 服务器。如果您的 WSGI 服务器配置为使用多个进程来处理请求,您现在 将 尝试从多个 worker 写入同一个文件。一个好的 WSGI 服务器会为你处理 Python 的日志配置,并在一个由主配置控制的文件中收集来自多个子进程的日志。
标签: python logging flask uwsgi