【问题标题】:Will below code of logging will mess the log file?下面的日志记录代码会弄乱日志文件吗?
【发布时间】: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


【解决方案1】:

Flask 什么都不做。 Python 日志记录的默认值是输出到sys.stdout。当使用 uWSGI 或 Gunicorn 之类的东西时,它们会将每个工作人员的标准输出收集到您配置的日志文件中。或者,您可以配置 Python 的日志记录系统以输出您想要的位置和方式,尽管这将不那么简单。一般来说,让 WSGI 服务器从工作人员那里收集和输出标准输出是最简单的。

【讨论】:

    【解决方案2】:

    您可以使用app.logger 在 Flask 中记录内容。即使在运行多个 Flask 进程时它也能正常工作。

    from flask import Flask, render_template
    
    app = Flask(__name__)
    
    @app.route('/'):
    def index():
       app.logger.info("Hit the main route !")
       return render_template('index.html')
    

    如果您想自定义日志消息,您还可以使用 Python 的 logging 库,它是无限可自定义的日志。

    只需在文件顶部添加以下内容:

    import logging
    log = logging.getLogger(__name__)
    

    以及,记录消息:

    log.debug("complex mathematical equations and heavy outputs")
    log.info("the sky is blue")
    log.error("something's not right")
    log.critical("dangeeeer ! its's blowing up !")
    

    您可以在网上搜索许多教程来使用 Python 进行日志记录(例如设置文件处理程序、格式化程序、记录器等)。

    【讨论】:

    • 对不起,我没有问清楚。你能再看看我的问题吗?
    • 无论您选择哪种方法,在多进程条件下写入同一个日志文件都不会有任何问题。在生产环境中运行 Flask 2 年,但从未发生过,我正在使用这两种方法,并使用 gunicorn 或 wsgi 作为网络服务器。
    猜你喜欢
    • 1970-01-01
    • 2012-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-12
    • 2015-03-11
    • 1970-01-01
    相关资源
    最近更新 更多