首页 > 其他分享 >【Djngao基础】日志记录

【Djngao基础】日志记录

时间:2023-11-25 15:11:38浏览次数:28  
标签:Djngao logging handlers 对象 记录 django 日志

1.日志核心组件

1.1 记录器对象-logger

在日志系统中,根据日志的重要性,将日志换分为5个等级:

  • DEBUG:调试信息,也是最详细的日志信息,记录项目中任何发生的事,多用于调测;
  • INFO:重要信息,记录业务流程中的重要节点信息;
  • WARNING:警告日志,记录可能影响系统正常运行或可能出现的警告信息;
  • ERROR:错误日志,记录系统运行时异常信息和业务数据错误信息;
  • CRITICAL:严重错误信息,记录可能导致软件崩溃的信息。
    在操作日志中都会记录日志级别和描述信息。设置日志级别后,其中低于该日志级别的日志会被忽略。比如设置日志级别为INFO,则DEBUG信息会被忽略。

下面示例是logger对象的简单使用:

import logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
logger.debug("这是debug信息")
logger.info("这是info信息")
logger.warning("这是warning信息")
logger.error("这是error信息")
logger.critical("这是critical信息")

1.2 操作对象-handler

操作对象用于对记录到日志容器logger种的日志信息进行后续处理。

操作对象完全支持日志级别的处理方式,可以按照日志级别对象数据进行隔离处理。操作对象还支持多种操作同时进行,比如将日志信息打印到屏幕上、将日志信息存储到指定文件中和将日志信息提交到远程服务器上三种操作同时进行。

1.3 过滤器对象-filter

过滤器对象是工作在记录器对象和操作对象时间的一个中间组件,通过过滤器为日志记录添加更多额外功能。

1.4 格式化对象-formatter

格式化对象用于对日志信息进行自定义,优化日志文件内容。
重要的格式符如下:

  • %(levalno)s:打印日志级别对应的整数数值;
  • %(levelname)s:打印日志级别的名称信息;
  • %(pathname)s:打印当前正在执行程序的程序路径;
  • %(filename)s:打印当前正在执行程序的名称或文件名;
  • %(funcName):打印当前日志记录执行操作的函数名称;
  • %(lineno)d:打印当前日志记录执行操作的代码行号;
  • %(asctime)s:打印当前日志记录执行操作的时间;
  • %(thread)d:打印当前日志记录执行操作的线程编号;
  • %(threadName)s:打印正在执行的线程名称;
  • %(process)d:打印当前正在执行的进程编号;
  • %(message):打印日志描述信息。

2.Django中的日志操作

2.1 命名空间结构化管理

在Django中可以通过父子节点路径隔离方式来进行日志管理,不过是通过记录器对象的命名规则进行管理的,也就是记录器对象的命名空间节点。
一般日志记录器对象的命名规则是:项目名.模块名.类型名称
例如:
项目的根管理项目中,日志记录器对象的命名规则如下:

logger = logging.getLogger('project.root.views')

在项目的用户模块中,日志记录器对象的命名规则如下:

logger = logging.getLogger('project.user.User')
logger = logging.getLogger('project.user.UserProfile')
logger = logging.getLogger('project.user.UserStatus')

这样,根据不同的过滤器对象,可以得到不同模块输出的日志信息。

2.2 记录到控制台的日志配置规则
在Django项目中可以根据配置,将日志输出到指定的存储对象中。
如下配置,把日志输出控制台进行展示:

LOGGING = {
    # 版本
    'version': 1,
    # 禁用已经存在的日志
    'disable_existing_loggers': True,
    # 配置日志格式化对象
    'formatters': {
        # 配置标准日志格式
        'verbose': {
            'format': '{levelname} {asctime} {module} {process:d} {thread:d} {message}',
            'style': '{',
        },
      	# 配置简单格式
        'simple': {
            'format': '{levelname} {message}',
            'style': '{',
        },
    },
    # 配置日志操作对象
    'handlers': {
      	# 定义控制台操作选项,通过变量命名console
        'console': {
            # 'level': 'DEBUG',
          	# 指定操作类型
            'class': 'logging.StreamHandler',
            # 指定记录格式,使用verbose标准日志格式记录日志
            'formatter': 'verbose'
        },
    },
  	# 配置日志记录器对象
    'loggers': {
      	# 声明使用记录器django
        'django': {
          	# 指定操作对象,可以是一个或多个
            'handlers': ['console'],
            # 'propagate': True,
          	# 配置日志记录级别
            'level': 'DEBUG',
        },
    }
}

2.3 记录到文件的日志配置规则

记录到控制台比较适合开发阶段,在生产环境通常将日志按照规则记录到文件中。
配置如下:

LOGGING = {
    # 日志记录配置版本信息
    'version': 1,
    # 启用已有日志配置信息
    'disable_existing_loggers': False,
    # 配置日志格式化对象:定义消息格式
    'formatters': {
        # 定义标准消息格式
        'verbose': {
            'format': '{levelname} {asctime} {module} {process:d} {thread:d} {message}',
            'style': '{',
        },
        # 定义简化消息格式,用于控制台操作
        'simple': {
            'format': '{levelname} {message}',
            'style': '{',
        },
    },
    # 配置日志操作对象
    'handlers': {
        # 配置文件日志处理程序
        'file': {
            # 记录DEBUG级别及以上日志
            'level': 'DEBUG',
            # 使用标准消息格式进行记录
            'formatter': 'standard',
            'class': 'logging.handlers.RotatingFileHandler',
            'filename': os.path.join(BASE_DIR, 'log/blog.log'),
            # 备份文件数量
            'backupCount': 10,
            # 设置每个文件存储的最大体积
            'maxBytes': 1024 * 1024 * 1024 * 10,
        },
    },
    # 配置日志记录器对象
    'loggers': {
        'django': {
            'handlers': ['console', 'file'],
            'propagate': True,
            'level': 'DEBUG'
        }
    }
}

在日志处理过程中,可以将所有日志记录到一个文件中,也可以按照时间间隔拆分文件记录,还可以按照文件大小拆分文件记录。具体的操作方式在handlers的file配置的class里。

Django提供了如下操作方式:

  • logging.FileHandler 普通日志,将日志记录到一个文件中
  • logging.handlers.RotatingFileHandler 按照文件大小拆分文件记录日志
  • logging.handlers.TimedRotatingFileHandler 按照时间间隔拆分文件记录日志
  • logging.handlers.WatchedFileHandler 按照日志是否被查看占用拆分文件记录日志
  • logging.handlers.SockerHandler 将日志添加到Socket管道中进行传输记录
  • logging.handlers.DatagramHandler 通过UDP对日志进行传输记录
  • logging.handlers.SMTPHandler 通过SMTP对日志进行传输记录
  • logging.handlers.HTTPHandler 通过GET/POST方式对日志进行网络记

2.4 日志模块API
2.4.1 记录器对象logger
上面的例子中我们使用的记录器对象是django、django.request、myproject.custom。其中django、django.request是内建的记录器对象。下面看看Django中有哪些内建的记录器对象。

  • django:抓取所有日志的顶层记录器对象。
  • django.request:处理与请求相关的日志信息。发送给这个记录器对象的消息区分上下文响应状态码和请求对象。比较特殊的是,5xx状态码记录ERROR级别的日志信息,4xx状态码记录WARNING级别的日志。
  • django.server:专门记录与开发服务器runserver接口请求相关的处理消息。比较特殊的是,5xx状态码记录ERROR级别的日志信息,4xx状态码记录WARNING级别的日志,其他记录INFO级别的日志信息。
  • django.template:专门记录与模板相关的日志信息。
  • django.db.backends:专门用于记录与数据交互相关的日志信息。SQL语句记录为DEBUG级别的日志,必须设置配置文件的调试模式settings.DEBUG=True,才能启用该记录器对象的日志信息,但是不包含框架初始化日志信息和实物管理查询信息。
  • django.security:安全认证日志记录器对象,用于记录与Suspiciousoperatio以及其他安全相关错误信息。

2.4.2 handler处理程序
除了上述日志模块提供的日志处理程序,Django框架内建一些原生都得日志处理功能,提供了基本的日志数据处理方式。比如django.utils.log.AdminEmailHandler类型的实例可以将重要信息发送到管理员邮箱。
2.4.3 Django的默认日志配置
在不进行任何编码和配置的情况下,Django框架中的默认日志生效。
通常Django框架中的错误日志输出与DEBUG配置相关:
如果设置DEBUG=True,则表示将所有的日志信息都传送到django记录器对象,并输出INFO级别或高于INFO级别的日志信息。
如果设置DEBUG=False,则表示django记录器对象将ERROR或者CRITICAL级别的日志信息传送到AdminEmailHandler邮件处理程序中进行处理,并将该级别日志发送到管理员邮箱。
3.日志实战
在实际开发中,会将多种日志处理方式合理添加到真个业务流程中。以我们前面的博客项目为例,日志配置如下:

LOGGING = {
    # 日志记录配置版本信息
    'version': 1,
    # 启用已有日志配置信息
    'disable_existing_loggers': False,
    # 配置日志格式化对象:定义消息格式
    'formatters': {
        # 定义标准消息格式
        'standard': {
            'format': '{levelname} {asctime} {module} {process:d} {thread:d} {message}',
            'style': '{',
        },
        # 定义简化消息格式,用于控制台操作
        'simple': {
            'format': '{levelname} {message}',
            'style': '{',
        },
    },
    # 配置过滤器
    'filters': {
        'require_debug_true': {
            '()': 'django.utils.log.RequireDebugTrue',
        },
    },
    # 配置定义处理程序
    'handlers': {
        # 配置控制台日志处理程序
        'console': {
            # 记录INFO级别及以上日志
            'level': 'INFO',
            'filters': ['require_debug_true'],
            'class': 'logging.StreamHandler',
            # 使用建议日志格式消息
            'formatter': 'simple'
        },
        # 配置文件日志处理程序
        'file': {
            # 记录DEBUG级别及以上日志
            'level': 'DEBUG',
            # 使用标准消息格式进行记录
            'formatter': 'standard',
            'class': 'logging.handlers.RotatingFileHandler',
            'filename': os.path.join(BASE_DIR, 'log/blog.log'),
            # 备份文件数量
            'backupCount': 10,
            # 设置每个文件存储的最大体积 10G
            'maxBytes': 1024 * 1024 * 1024 * 10,
        },
        # 配置邮件处理程序
        'mail_admins': {
            # 记录ERROR级别及以上日志
            'level': 'ERROR',
            'class': 'django.utils.log.AdminEmailHandler'
        }
    },
    # 配置日志记录器对象
    'loggers': {
        'django': {
            'handlers': ['console', 'file'],
            'propagate': True,
            'level': 'DEBUG'
        },
        'django.request': {
            'handlers': ['mail_admins', 'file'],
            'level': 'ERROR',
            'propagate': False,
        },
        'myproject.custom': {
            'handlers': ['console', 'mail_admins', 'file'],
            'level': 'INFO',
        }
    }
}

案例:

日志配置

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'formatters': {
        'verbose': {
            'format': '%(levelname)s %(asctime)s %(module)s %(lineno)d %(message)s'
        },
        'simple': {
            'format': '%(levelname)s %(module)s %(lineno)d %(message)s'
        },
    },
    'filters': {
        'require_debug_true': {
            '()': 'django.utils.log.RequireDebugTrue',
        },
    },
    'handlers': {
        'console': {
            'level': 'DEBUG',
            'filters': ['require_debug_true'],
            'class': 'logging.StreamHandler',
            'formatter': 'simple'
        },
        'file': {
            'level': 'INFO',
            'class': 'logging.handlers.RotatingFileHandler',
            # 日志位置,日志文件名,日志保存目录必须手动创建
            'filename': os.path.join(os.path.dirname(BASE_DIR), "logs/luffy.log"),
            # 日志文件的最大值,这里我们设置300M
            'maxBytes': 300 * 1024 * 1024,
            # 日志文件的数量,设置最大日志数量为10
            'backupCount': 10,
            # 日志格式:详细格式
            'formatter': 'verbose'
        },
    },
    # 日志对象
    'loggers': {
        'django': {
            'handlers': ['console', 'file'],
            'propagate': True, # 是否让日志信息继续冒泡给其他的日志处理系统
        },
    }
}

标签:Djngao,logging,handlers,对象,记录,django,日志
From: https://www.cnblogs.com/fuchangjiang/p/17855542.html

相关文章

  • 2023.11.25-2023.12.31 模拟赛记录
    苟。11.25多校dream给定N,求\(\sum_{i\in\left[1,2^N\right]}\log_2\left(\prod_{j\in[1,i]}\text{lowbit}(j)\right)\)。(N<=1e18)找个规律发现\(\log_2\left(\prod_{j\in[1,i]}\text{lowbit}(j)\right)\)就是\(i-\text{popcount}(i)\)。不难移值域,算贡献。ca......
  • git使用记录
    #新人福利#git是一个版本控制器,主要是用来对代码进行版本管理,可以方便地查到git的不同版本和修改。目前接触到的场景包括:新建分支(很少),提交修改,分支合并等。常用的git命令#使用带有hook的git时,一般的代码提交过程如下gitcheckoutmain#切换到主分支gitpull#同步主干分支......
  • 记录Java对象修改前和修改后的变化
    一、记录跟变信息对象/***@authorFengQing*@programyf-client*@description*@date2023/11/01*/@Getter@Setter@ToStringpublicclassChangePropertyMsg{/***变更信息*/privateStringchangeMsg;/***变更属性集合......
  • 可观测性建设实践之 - 日志分析的权衡取舍
    指标、日志、链路是服务可观测性的三大支柱,在服务稳定性保障中,通常指标侧重于发现故障和问题,日志和链路分析侧重于定位和分析问题,其中日志实际上是串联这三大维度的一个良好桥梁。但日志分析往往面临成本和效果之间的权衡问题,没有完美的方案只有适合的方案,本文将结合实战经验,介绍一......
  • 可观测性建设实践之 - 日志分析的权衡取舍
    指标、日志、链路是服务可观测性的三大支柱,在服务稳定性保障中,通常指标侧重于发现故障和问题,日志和链路分析侧重于定位和分析问题,其中日志实际上是串联这三大维度的一个良好桥梁。但日志分析往往面临成本和效果之间的权衡问题,没有完美的方案只有适合的方案,本文将结合实战经验,介绍......
  • AJAX记录
    AJAX目录AJAX1.绑定事件点击判断类名的2.事件文件列表3.关联标签4.转义符号5.耦合性6.事件循环经典面试题1.绑定事件点击判断类名的document.querySelector('.list').addEventListener('click',(e)=>{if(e.target.classList.contains('edit')){editModal.sh......
  • Web API(一些记录)
    WebAPI(一些记录)1.注意当使用间隔函数的时候做轮播图,点点的效果,删除需要放在间隔函数内,不能在函数外面声明,在外面的话删的点就固定了,放里面就是每执行一次就再选择一次2.i--在事件点击函数里面也是立马执行吗,不是先把函数里面的其他东西执行完,再执行i--吗?答:是的因为i--它是独......
  • git bisect 查找引入bug的提交记录
    它的原理就是将代码提交的历史,按照两分法不断缩小定位。就是将代码历史一分为二,确定问题出在前半部分,还是后半部分,不断执行这个过程,直到范围缩小到某一次代码提交。step1:查找提交记录,找到可能引入错误的提交记录区间gitlog--pretty=onelinestep2:开始使用gitbisect......
  • 西北电专电院_数据结构上机报告记录_第三次上机报告
    内容比较简单,和其他院的上机比起来说是这样的实现二叉树的基本操作,二叉树使用链式结构建立,基本操作基本用递归实现 1.问题描述二叉树的基本操作;(1)创建二叉树,需注意此处是按照先序法输入(2)通过先序遍历、中序遍历、后序遍历分别输出二叉树(3)求取二叉树的结点总数、树的深度......
  • 【刷题记录】20231124 线段树分治
    做题记录:注意到每次相当于\(0\)后面加\(1\),\(1\)后面加\(0\),因此每次可以合并01和10然后将问题规模减半。黑白染色,白格子=lcm+1,黑格子=prime相乘。发现横着竖着有六个质数,斜着只用四个质数。调整一下顺序即可。状压DP。考虑S作为前缀max时S与U-S的排列方案数。S每......