Django 创建并存储一个自定义的日志文件

需求

在处理数据导入任务时,产生了大量处理错误的信息,需要把他们记录下来,供日后审计

  • 在第一版中,采用了json的形式存在在mysql数据库中,这就会造成一个页面难以审阅的问题
  • 这次计划改成存储到文件,这就需要考虑如何避免傻白甜的先创建一个文件、再存储、再写入的繁琐操作。这里使用ContentFile,ContentFile可以提供给你一个不存在的文件,让你先写入一些内容,

具体实现

  • 将日志写入文件的主要代码 task.py
from django.core.files.base import ContentFile
# 主要逻辑:如果不存在日志文件,则创建一个日志文件;否则,直接追加写入一条日志
def write_import_log(obj, phone, error, header_index):
    while True:
        if not obj.error_log:
            error_file = ContentFile("")
            error_file.name = "erro_log.txt"
            obj.error_log = error_file
            obj.save()
            continue
        else:
            with open(obj.error_log.path, "a", encoding="utf-8") as error_file_obj:
                error_file_obj.write(f"index: {header_index};msg: {str(error)};phone:{str(phone)}
")
            break
  • 将此表也放在这里供参考 models.py:
class StatusChoices(models.IntegerChoices):
    AA = 1, "已上传,等待处理"
    BB = 2, "正在处理导入"
    DD = 3, "导入完成"


class ImportData(models.Model):
    date = models.DateTimeField(auto_now_add=True,null=True,verbose_name="文件上传时间")
    status_date = models.DateTimeField(auto_now=True,verbose_name="状态更新时间")
    file = models.FileField(upload_to="import", verbose_name="文件")
    status = models.PositiveSmallIntegerField(choices=StatusChoices.choices,null=True,verbose_name="程序状态")
    error_log = models.FileField(upload_to="import_log", null=True, verbose_name="错误日志")

    class Meta:
        verbose_name_plural = verbose_name = '数据导入'
        ordering = ["-date"]
  • 最终效果:
    image
原文地址:https://www.cnblogs.com/lisicn/p/15439254.html