Django中的日志处理

日志处理

1.日志级别

级别(Level)表示日志消息的优先级,从低到高分为以下几个级别:

DEBUG: 详细的日志信息,通常用于调试。

INFO: 一般的信息性消息,用于说明程序运行情况。

WARNING: 警告消息,表明可能出现问题,但程序仍然可以继续运行。

ERROR: 错误消息,表明出现了一个严重的问题,程序可能无法继续正常运行。

CRITICAL: 严重错误消息,通常表示程序无法继续执行。

通过设置 level,你可以控制只有达到指定级别或更高级别的日志消息才会被处理。

例如,如果将 level 设置为 INFO,那么所有 INFO、WARNING、ERROR 和 CRITICAL 级别的日志消息都会被处理,而 DEBUG 级别的消息将被忽略。

2.propagate消息传播

如果 propagate 被设置为 True,那么日志消息将会传递给父级 logger。如果设置为 False,则不会传递给父级 logger。见下示例 settings.py

3.Django 内置的 logger

django 获取所有日志

django.server 用于记录 Django 开发服务器的日志消息,例如 HTTP 请求、响应、静态文件服务等

django.request 处理与请求相关的日志,5xx 响应报出 error 日志,4xx 报出 warning 日志

django.db.backends 处理与数据库之间交互的日志

django.security.* 处理与安全相关的日志

django.db.backends.schemea 处理数据库迁移时的日志

python 复制代码
import logging
获取Django内置的logger
logger = logging.getLogger('django')
记录不同级别的日志消息
logger.debug('This is a debug message')
logger.info('This is an info message')
logger.warning('This is a warning message')
logger.error('This is an error message')
logger.critical('This is a critical message')
python 复制代码
LOG_PATH = BASE_DIR / "logs"

if not os.path.exists(LOG_PATH):
    os.mkdir(LOG_PATH)

# 日志配置
LOGGING = {
    "version": 1,
    "disable_existing_loggers": False, # 为True表示会打印Django源码中内置的日志
    "formatters": {  #  定义日志的显示格式
        # 日志格式
        "standard": {"format": "%(asctime)s [%(levelname)s] %(filename)s::%(funcName)s:%(lineno)d: %(message)s"},
        "simple": {"format": "%(levelname)s %(message)s"},  # 简单格式
    },

    # 过滤
    "filters": {},
  
	# 配置用哪几种 handlers 来处理日志
    "handlers": {

        "request": {
            "level": "INFO",  # level表示只有达到指定级别或更高级别的日志消息才会被处理。
            "class": "logging.handlers.RotatingFileHandler",
            "filename": LOG_PATH / f'request-{time.strftime("%Y-%m-%d")}.log',  # 日志文件名,包含日期
            "maxBytes": 1024 * 1024 * 5,  # 单个日志文件大小为 5 MB
            "backupCount": 5,  # 最多保留 5 个备份文件
            "formatter": "simple",   # 使用 'simple' 格式化器
            "encoding": "utf-8",  # 设置默认编码
        },

        "db": {
            "level": "DEBUG",
            "class": "logging.handlers.RotatingFileHandler",
            "filename": LOG_PATH / f'db-{time.strftime("%Y-%m-%d")}.log',
            "maxBytes": 1024 * 1024 * 5,  # 文件大小
            "backupCount": 5,  # 备份数
            "formatter": "simple",  # 输出格式
            "encoding": "utf-8",  # 设置默认编码
        },

        "file": {
            "level": "ERROR",
            "class": "logging.handlers.RotatingFileHandler",
            "filename": LOG_PATH / f'file-{time.strftime("%Y-%m-%d")}.log',
            "maxBytes": 1024 * 1024 * 5,  # 文件大小
            "backupCount": 5,  # 备份数
            "formatter": "simple",  # 输出格式
            "encoding": "utf-8",  # 设置默认编码
        },

        # 控制台输出
        "console": {
            "level": "DEBUG",
            "class": "logging.StreamHandler",
            "formatter": "standard",
        },

    },

    # 定义具体处理日志的方式
    "loggers": {

        "root": {
            "level": "ERROR",  # level表示只有达到指定级别或更高级别的日志消息才会被处理。
            "handlers": ["file"],  # handlers可以写多个
        },

        "django": {
            "level": "INFO",
            "handlers": ["request"],
            "propagate": True,
        },

        # django.request一般处理warning及更高级别的日志,
        # 好像没有上面django的时候,才会处理一般的请求:debug或者info
        "django.request": {
            "level": "DEBUG",
            "handlers": ["console"],
            "propagate": False,
        },

        # 对于django.db.backends 如果propagate=True,会传递到上一级django.db,
        # 如果django.db中propagate=True,还会再传递到django,依次类推会传递到最高级root中...
        "django.db": {
            "level": "DEBUG",
            "handlers": ["console"],
            "propagate": True,
        },

        "django.db.backends": {
            "level": "DEBUG",
            "handlers": ["db"],
            "propagate": True,
        },
    },
}
python 复制代码
import logging

logger = logging.getLogger("django")

class BookListAPIView(APIView):
    # 局部认证
    # authentication_classes = [JWTAuthentication]

    def get(self, request):
        logger.info("打印info级别的日志")
        logger.error("打印error级别的日志")
        book = BookInfo.objects.all()
        serializer = BookModelSerializer(instance=book, many=True)
        return Response(serializer.data)
相关推荐
爱喝白开水a1 小时前
LangChain 基础系列之 Prompt 工程详解:从设计原理到实战模板_langchain prompt
开发语言·数据库·人工智能·python·langchain·prompt·知识图谱
默默coding的程序猿3 小时前
3.git的分支携带问题是什么?怎么解决?
java·git·python·svn·gitee·github·intellij-idea
新子y4 小时前
【小白笔记】PyTorch 和 Python 基础的这些问题
pytorch·笔记·python
我是李武涯4 小时前
PyTorch DataLoader 高级用法
人工智能·pytorch·python
Lynnxiaowen4 小时前
今天我们开始学习python语句和模块
linux·运维·开发语言·python·学习
ThreeAu.5 小时前
pytest 实战:用例管理、插件技巧、断言详解
python·单元测试·pytest·测试开发工程师
资源补给站5 小时前
服务器高效操作指南:Python 环境退出与 Linux 终端快捷键全解析
linux·服务器·python
一苓二肆5 小时前
代码加密技术
linux·windows·python·spring·eclipse
青春不败 177-3266-05206 小时前
AI+Python驱动的无人机生态三维建模与碳储、生物量、LULC估算技术
人工智能·python·无人机·生态学·遥感·多光谱遥感
将车2446 小时前
selenium实现自动化脚本的常用函数
python·selenium·自动化