django项目中使用logging记录日志

news2025/1/13 10:17:45

前提

基于已有项目https://blog.csdn.net/qq_38122800/article/details/128583379?spm=1001.2014.3001.5502

1、修改settings.py

在这里插入图片描述
在settings.py文件中添加如下代码:

先导入模块:

import os,time
#配置日志

cur_path = os.path.dirname(os.path.realpath(__file__))  # log_path是存放日志的路径
log_path = os.path.join(os.path.dirname(cur_path), 'logs')
if not os.path.exists(log_path): os.mkdir(log_path)  # 如果不存在这个logs文件夹,就在启动服务时自动创建一个

LOGGING = {
    'version': 1,
    'disable_existing_loggers': True,
    'formatters': {
        # 日志格式
        'standard': {
            'format': '[%(asctime)s] [%(filename)s:%(lineno)d] [%(module)s:%(funcName)s] '
                      '[%(levelname)s]- %(message)s'},
        'simple': {  # 简单格式
            'format': '%(levelname)s %(message)s'
        },
    },
    # 过滤
    'filters': {
    },
    # 定义具体处理日志的方式
    'handlers': {
        # 默认记录所有日志
        'default': {
            'level': 'INFO',
            'class': 'logging.handlers.RotatingFileHandler',
            'filename': os.path.join(log_path, 'all-{}.log'.format(time.strftime('%Y-%m-%d'))),
            'maxBytes': 1024 * 1024 * 5,  # 文件大小
            'backupCount': 5,  # 备份数
            'formatter': 'standard',  # 输出格式
            'encoding': 'utf-8',  # 设置默认编码,否则打印出来汉字乱码
        },
        # 输出错误日志
        'error': {
            'level': 'ERROR',
            'class': 'logging.handlers.RotatingFileHandler',
            'filename': os.path.join(log_path, 'error-{}.log'.format(time.strftime('%Y-%m-%d'))),
            'maxBytes': 1024 * 1024 * 5,  # 文件大小
            'backupCount': 5,  # 备份数
            'formatter': 'standard',  # 输出格式
            'encoding': 'utf-8',  # 设置默认编码
        },
        # 控制台输出
        'console': {
            'level': 'DEBUG',
            'class': 'logging.StreamHandler',
            'formatter': 'standard'
        },
        # 输出info日志
        'info': {
            'level': 'INFO',
            'class': 'logging.handlers.RotatingFileHandler',
            'filename': os.path.join(log_path, 'info-{}.log'.format(time.strftime('%Y-%m-%d'))),
            'maxBytes': 1024 * 1024 * 5,
            'backupCount': 5,
            'formatter': 'standard',
            'encoding': 'utf-8',  # 设置默认编码
        },
    },
    # 配置用哪几种 handlers 来处理日志
    'loggers': {
        # 类型 为 django 处理所有类型的日志, 默认调用
        'django': {
            'handlers': ['default', 'console'],  #处理django自己的日志
            'level': 'INFO',
            'propagate': False
        },
        # log 调用时需要当作参数传入
        'log': {
            #哪里调用,就处理哪里的日志.这里其实是把info、error的日志分别写在了3个文件里,
            # info对应info,error对应error,并且all中也包含了info和error
            'handlers': ['info','error','default','console'],
            'level': 'INFO',
            'propagate': True
        },
    }
}

2、调用logging模块

在demo/views.py文件中导入logging模块,设置logger对象

import logging

#设置logger对象
log = logging.getLogger('log')

然后在需要打印日志的地方加上代码

log.info(f'查询结果是: {self.res}')

3、启动服务

启动服务时,可以看到项目目录中多了logs文件夹
在这里插入图片描述

4、触发打印日志的行为

通过接口请求,查询数据,可以看到终端有日志输出,且logs文件夹中的文件里有日志写入
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

5、修改日志处理方式

在这里插入图片描述
如果在settings.py文件中,只留下console,则实现的功能时:只在控制台打印日志,不会再写入到日志文件中
如果留下:info,则实现的功能时:只将info及以上级别的日志写入到info.log文件中,不会再在控制台打印

6、附录

日志级别

日志一共分成5个等级﹐从低到高分别是︰

1.DEBUG
2. INFO
3. WARNING
4. ERROR
5. CRITICAL

说明:

DEBUG∶详细的信息,通常只出现在诊断问题上
INFO∶确认一切按预期运行
WARNING∶一个迹象表明,一些意想不到的事情发生了,或表明一些问题在不久的将来(例如"磁盘空间低")。这个软件还能按预期工作。
ERROR︰更严重的问题,软件没能执行一些功能
CRITICAL:一个严重的错误,这表明程序本身可能无法继续运行

这5个等级﹐也分别对应5种打日志的方法∶debug 、 info 、warning 、error 、critical。默认的是WARNING﹐当在WARNING或之上时才被跟踪。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/153554.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Vue3——第九章(依赖注入:provide、inject)

一、Prop 逐级透传问题 通常情况下,当我们需要从父组件向子组件传递数据时,会使用 props。如果需要给深层子组件传递数据,会非常麻烦,如下图: provide 和 inject 可以帮助我们解决这一问题。一个父组件相对于其所有的…

【memcpy和memove函数的详解】

1.memcpy函数详解 模拟实现memcpy函数 2.memmove函数详解 模拟实现memmove函数 memset函数详解 memcpy函数 了解一个函数,就查询该函数的相关信息 memcpy函数在库中的声明如下: void * memcpy ( void * destination, const void * source, size_…

Node.js安装与编写

Node.js是JavaScript运行环境,是可以让JavaScript运行在服务端的开发平台。 Node.js对一些特殊用例进行优化,提供替代的API。 Node.js本质上是为文件系统、数据库之类的资源提供接口。 Node.js是单线程的,通过事件循环(event l…

05【JSP-MVC】

文章目录05【JSP-MVC】一、JSP简介1.1 JSP概述1.1.1 HTML和Servlet的弊端1.1.1 什么是JSP1.2 JSP体验:1.2.2 JSP的执行过程1.2.2 JSP和Servlet是什么关系?二、JSP的脚本元素2.1 JSP中的注释:2.2 JSP脚本表达式2.3 JSP代码片段2.4 JSP声明2.5 …

数字音频接口DAI之I2S/PCM

I2S/PCM数字音频接口概述数字音频接口DAI,即Digital Audio Interfaces,顾名思义,DAI表示在板级或板间传输数字音频信号的方式。相比于模拟接口,数字音频接口抗干扰能力更强,硬件设计简单,DAI在音频电路设计…

深度学习——循环神经网络RNN(笔记)

循环神经网络RNN:对于序列模型的神经网络 1.回顾:潜变量自回归模型 使用潜变量ht总结过去的信息 ①xt跟当前的ht和x(t-1)相关 ②ht跟ht-1和xt-1相关 ③n元语法模型中,单词xt在时间t的条件概率取决于前面n-1个单词 隐藏层和隐藏状态的区别…

【ESP32Cam项目1】:ESP32Cam人脸检测(ArduinoESP32底层、Python版opencv)

人脸检测项目效果图: 人脸检测效果视频: 暮年的主页 - 抖音 (douyin.com) 人脸检测项目目标: 大家好!近期拿到了便宜的ESP32Cam开发板,摄像头让我想起来人脸识别,于是ESP32Cam人脸检测项目由此诞生。后期还…

一文总结ACE代码框架

一、前言ACE_Engine框架是OpenAtom OpenHarmony(简称“OpenHarmony”)的UI开发框架,为开发者提供在进行应用UI开发时所必需的各种组件,以及定义这些组件的属性、样式、事件及方法,通过这些组件可以方便进行OpenHarmony…

JavaScript面试题

目录1.★★ 介绍一下JS的内置类型有哪些?2.★★★★ 介绍一下 typeof 区分类型的原理3.★★★ 介绍一下类型转换4.★★★★ 说说你对 JavaScript 的作用域的理解。什么是作用域链?5.★★ 解释下 let 和 const 的块级作用域6.★★★★ 说说你对执行上下文…

用Vue+Nodejs+Axios+express连接Sqlserver做一个动态网页demo

文章目录一、主要工具二、流程2.1. 安装Node2.2. 新建Vue工程并启动2.3. 前后端通信2.3.1. 修改前端2.3.2. 用axios来发起请求2.3.3. 创建服务端程序一、主要工具 Vue做前端页面Nodejs做服务器后端(Nodejs是一个JS的运行环境,可以让JS像其它后端语言一样…

使用超体素上下文和基于图的优化从MLS点云对城市地区的树木进行实例分割

Abstract 在本文中,开发了一种用于从城市场景中的 MLS 数据集中提取树木的实例分割方法。所提出的方法利用超体素结构来组织点云,然后从超体素的局部上下文中提取去除趋势的几何特征。结合局部上下文的去趋势特征,将采用随机森林&#xff08…

Qt基于CTK Plugin Framework搭建插件框架--创建插件

文章目录一、前言二、工程搭建2.1、新建Qt工程2.2、CTK环境配置三、CTK Plugin Framework使用3.1、主函数启动插件框架3.2、插件的创建3.3、插件的使用一、前言 CTK保姆级编译教程:https://blog.csdn.net/Mr_robot_strange/article/details/128547331?spm1001.201…

JavaGUI:多功能计算器(五)--Swing实现双语数据包+菜单切换(完整源码)

JavaGUI:多功能计算器(五)–Swing实现双语数据包菜单切换(完整源码) 【背景提示】 “软件国际化”就是实现多种语言显示切换。 1.在前端网页上,可通过探测本地化语言环境实现自动切换; 2.在操…

C++ 20 原子引用 (一)

C 20 原子引用 (一) std::atomic_ref{} std::atomic_ref类型对其引用的对象进行原子操作。 使用std::atomic_ref 进行多线程读写时不会造成数据争用。被引用对象的生命周期必须超过std::atomic_ref 。操作std::atomic_ref 的子对象是未定义行为。 错…

Docker版RabbitMQ安装延迟队列插件及延迟队列项目应用实战

前言 在项目中经常有延迟业务处理的背景,此时可以借助于Rabbitmq的延迟队列进行实现,但Rabbitmq本身并不支持延迟队列,但可以通过安装插件的方式实现延迟队列 环境准备 首先确认目前项目使用的Rabbitmq的版本,这里博主的版本是3.…

STM32系列(HAL库)——使用ESP8266-01S物联网模块连接Onenet云平台上报DHT11温湿度

前言 本篇主要讲解如何使用ESP8266-01S物联网模块连接Onenet云平台,并上报DHT11模块的温湿度数据。本文单片机主控采用STM32F405RGT6,使用其他主控的话基本要求有2个串口,一个串口用于调试使用,另一个用于ESP模块通讯。 一、前…

SOLIDWORKS 2023工程图和出详图新功能 创建更智能化 更高精度的工程详图

工程图是传达您设计意图的重要文档,您设计的产品越复杂,越需要详细注释说明。SOLIDWORKS 2023增强的工程图和出详图功能将帮助您创建更智能化、更高精度的工程详图,并且扩展新功能使您的设计工作延伸到更多的业务领域。您现在可以从更高层级的…

C 程序设计教程(15)—— 选择结构程序设计练习题

C 程序设计教程(15)—— 选择结构程序设计练习题 该专栏主要介绍 C 语言的基本语法,作为《程序设计语言》课程的课件与参考资料,用于《程序设计语言》课程的教学,供入门级用户阅读。 目录C 程序设计教程(1…

20230110配置ubuntu18.04为开机自动登录

20230110配置ubuntu18.04为开机自动登录 百度搜索:ubuntu 18.04 开机自动登录 https://blog.csdn.net/yang1994/article/details/124446319 通过配置文件启用/禁用Ubuntu 18.04自动登录 超级用户可以通过编辑custom.conf配置文件的方式,来为自己或任何其…

计算机如何存储浮点数和定点数?

1 浮点数的不精确性 能不能用二进制表示所有实数,然后在二进制下计算它的加减乘除呢? 打开Chrome Console,输入0.3 0.6: 简单加法在js算出结果居然不是准确的0.9,而是0.8999999999999999,why&#xff1…