使用多个客户端登录烧瓶

时间:2021-03-08 14:29:08

标签: python logging

我构建了一个可同时处理多个请求的 Flask 应用程序。
每个请求都会生成特定于请求的日志,这些日志需要一个接一个地呈现,以便于理解。
但是,由于多线程,日志文件中没有维护顺序,导致日志文件不可读。

服务器代码:

from flask import Flask, request, Response
import logging
from logging.handlers import RotatingFileHandler
import sys
from datetime import datetime
import time
import random

app = Flask(__name__)

formatter = logging.Formatter('%(asctime)s.%(msecs)03d [%(levelname)s]: %(message)s', datefmt='%Y-%m-%d %H:%M:%S')
file_hdlr = RotatingFileHandler('debug_{}'.format(datetime.utcnow().strftime('%Y_%m_%d')), maxBytes= 5*1024*1024, backupCount= 10)
file_hdlr.setFormatter(formatter)
file_logger = logging.getLogger('file_logger')
file_logger.setLevel(logging.INFO)
file_logger.addHandler(file_hdlr)

@app.route('/get_results', methods=['POST'])
def get_results():
    file_logger.info('----------------------------------')
    file_logger.info('1')
    time.sleep(random.uniform(0,2))
    file_logger.info('2')
    time.sleep(random.uniform(0,2))
    file_logger.info('3')
    time.sleep(random.uniform(0,2))
    file_logger.info('4')
    time.sleep(random.uniform(0,2))
    file_logger.info('5')
    return "Successful"


if __name__ == "__main__":
    app.run(host="0.0.0.0", port=5000, debug=True, threaded = True)

在同时向 api 传递多个请求时,我得到一个如下所示的日志文件
日志文件:

2021-03-08 19:41:47.431 [INFO]: ----------------------------------
2021-03-08 19:41:47.431 [INFO]: 1
2021-03-08 19:41:48.587 [INFO]: 2
2021-03-08 19:41:49.811 [INFO]: 3
2021-03-08 19:41:50.407 [INFO]: 4
2021-03-08 19:41:51.260 [INFO]: ----------------------------------
2021-03-08 19:41:51.260 [INFO]: 1
2021-03-08 19:41:51.673 [INFO]: 5
2021-03-08 19:41:53.192 [INFO]: 2
2021-03-08 19:41:53.732 [INFO]: ----------------------------------
2021-03-08 19:41:53.732 [INFO]: 1
2021-03-08 19:41:53.953 [INFO]: 3
2021-03-08 19:41:54.931 [INFO]: 2
2021-03-08 19:41:54.951 [INFO]: 4
2021-03-08 19:41:55.482 [INFO]: 3
2021-03-08 19:41:55.863 [INFO]: 4
2021-03-08 19:41:56.237 [INFO]: 5
2021-03-08 19:41:56.738 [INFO]: 5
2021-03-08 19:41:57.002 [INFO]: ----------------------------------
2021-03-08 19:41:57.002 [INFO]: 1
2021-03-08 19:41:57.575 [INFO]: 2
2021-03-08 19:41:59.015 [INFO]: 3
2021-03-08 19:41:59.100 [INFO]: 4
2021-03-08 19:41:59.355 [INFO]: 5

预期输出为:

2021-03-08 19:51:37.462 [INFO]: ----------------------------------
2021-03-08 19:51:37.463 [INFO]: 1
2021-03-08 19:51:39.180 [INFO]: 2
2021-03-08 19:51:40.710 [INFO]: 3
2021-03-08 19:51:42.205 [INFO]: 4
2021-03-08 19:51:43.356 [INFO]: 5
2021-03-08 19:51:45.136 [INFO]: ----------------------------------
2021-03-08 19:51:45.136 [INFO]: 1
2021-03-08 19:51:45.207 [INFO]: 2
2021-03-08 19:51:46.534 [INFO]: 3
2021-03-08 19:51:46.661 [INFO]: 4
2021-03-08 19:51:47.697 [INFO]: 5
2021-03-08 19:51:49.803 [INFO]: ----------------------------------
2021-03-08 19:51:49.803 [INFO]: 1
2021-03-08 19:51:50.892 [INFO]: 2
2021-03-08 19:51:51.632 [INFO]: 3
2021-03-08 19:51:52.877 [INFO]: 4
2021-03-08 19:51:53.501 [INFO]: 5

关于名称还有一个问题。如果我向日志文件名添加 .log 扩展名,当缓冲区大小已满时,我会收到错误消息。有什么方法可以让旋转记录器与 .log 扩展一起工作。如果不提供扩展,代码就可以正常工作。

1 个答案:

答案 0 :(得分:0)

您的日志中的输出在我看来是正确的:

正如人们所期望的那样,每行 ---------------------------------- 后跟一个 1

其余的似乎是从各个线程随机进入的,正如人们所期望的那样,在每个后续日志条目之间使用随机睡眠间隔。

您可以将线程 ID 添加到每条日志消息中。

实现方式可能取决于您的代码是多线程的。

标准logging library has an identifier for this%(thread)d

或者你可以使用类似 threading.get_indent() 的东西。