如何将大请求记录为文件?

时间:2018-11-27 12:08:29

标签: python logging

我正在使用Flask应用程序来解决车辆路线问题。它收到大量我希望在常规日志消息(例如app.logger.info(..))之外进行记录的请求(每个请求约5MB),因为它们只会使日志变得不可读。

我的想法是将最后一个 n 请求作为带有时间戳的json文件保存在一个单独的文件夹中。我将编写自己的函数来执行此操作。我想知道您之前是否使用过这种类型的设置以及如何实现它。我在Python的模块logging中找不到任何东西可以帮我完成这个任务。

3 个答案:

答案 0 :(得分:1)

我不建议使用记录器模块来保存大型json文件,尤其是如果您还希望格式化它们以供人类使用时。

我实际上曾经遇到过与您相同的问题,并通过编写以下函数解决了该问题:

def json_to_file(file_to_write, json_to_dump):
    max_files = 10
    file_list = sorted(glob.glob("your pattern here"))
    if len(file_list) > max_files:
        os.remove(file_list[0])

    with open(file_to_write, "w+") as my_file:
        json.dump(json_to_dump, my_file, indent=4)

您可以将file_to_write变量设置为unix或utc时间戳-无论如何,这就是我要做的事情。

编辑:添加了“最大n个文件”部分。 只需确保您使用的glob模式正确!

答案 1 :(得分:1)

在这种情况下,我认为您应该忽略日志记录模块。

建立目录并在该目录中创建文件。

您可以使用当前日期时间作为文件名。

它具有创建唯一名称的偏执方式:

import datetime
import os
import random

request_dir = '/tmp'
content =':-)'
now = datetime.datetime.now()
file_name = '%s_%s_%s.json' % (now.strftime('%Y-%m-%d_%H%M%S'), '%06d' % now.microsecond,
                          random.randint(100000000, 999999999))
with open(os.path.join(request_dir, file_name), 'wb') as fd:
    fd.write(content)

“删除目录中的旧条目”部分保留不变。因为文件名可以排序,所以这并不困难。

答案 2 :(得分:0)

如果要使用python记录器,可以使用FileHandler指定它的写入位置,如下所示:

fh = logging.FileHandler(filename=os.path.join(path_to_log_directory, log_filename))
fh.setLevel(LOG_LEVEL)