django内置的日志配置与使用

前言

        django的日志配置是比较简单的,通常是通过总配置文件 settings.py 文件中的LOGGING配置字典来完成的。

        LOGGING允许你定义日志的格式、处理器(handlers)以及日志记录器(loggers),配置好后,你就可以在django应用的任何地方通过Python的logging模块来调用日志功能了。

配置与使用

配置

        settings.py  - LOGGING 的配置

# ================================================= #
# ********************* 日志配置 ******************* #
# ================================================= #
SERVER_LOGS_FILE = os.path.join(BASE_DIR, "logs", "server.log")
ERROR_LOGS_FILE = os.path.join(BASE_DIR, "logs", "error.log")
LOGS_FILE = os.path.join(BASE_DIR, "logs")
if not os.path.exists(os.path.join(BASE_DIR, "logs")):  # 如果目录不存在就创建
    os.makedirs(os.path.join(BASE_DIR, "logs"))

# 格式:[2020-04-22 23:33:01][micoservice.apps.ready():16] [INFO] 这是一条日志:
# 格式:[日期][模块.函数名称():行号] [级别] 信息
STANDARD_LOG_FORMAT = (
    "[%(asctime)s][%(name)s.%(funcName)s():%(lineno)d] [%(levelname)s] %(message)s"
)
CONSOLE_LOG_FORMAT = (
    "[%(asctime)s][%(name)s.%(funcName)s():%(lineno)d] [%(levelname)s] %(message)s"
)
LOGGING = {
    "version": 1,  # 版本号
    "disable_existing_loggers": False,  # 是否禁用已经存在的日志器
    "formatters": { # 格式化器
        "standard": {"format": STANDARD_LOG_FORMAT},  # 标准日志输出格式
        "console": {  # 控制台输出日志配置
            "format": CONSOLE_LOG_FORMAT,  # 日志输出的格式
            "datefmt": "%Y-%m-%d %H:%M:%S",  # 时间格式
        },
        "file": {  # 文件输出日志配置
            "format": CONSOLE_LOG_FORMAT,
            "datefmt": "%Y-%m-%d %H:%M:%S",
        },
    },
    "handlers": {  # 处理器
        "file": {
            "level": "INFO",  # 日志文件,将设置为记录INFO级别及以上
            "class": "logging.handlers.RotatingFileHandler",  # 使用RotatingFileHandler处理服务器日志
            "filename": SERVER_LOGS_FILE,  # 写入文件的路径名称
            "maxBytes": 1024 * 1024 * 100,  # 100 MB
            "backupCount": 5,  # 最多备份5个
            "formatter": "standard",  # 使用标准日志格式(上面的 formatters有配置,引用名称即可)
            "encoding": "utf-8",
        },
        "error": {
            "level": "ERROR",
            "class": "logging.handlers.RotatingFileHandler",
            "filename": ERROR_LOGS_FILE,
            "maxBytes": 1024 * 1024 * 100,  # 100 MB
            "backupCount": 3,  # 最多备份3个
            "formatter": "standard",
            "encoding": "utf-8",
        },
        "console": {
            "level": "INFO",
            "class": "logging.StreamHandler",   # 使用StreamHandler处理服务器日志,控制台一般用 StreamHandler
            "formatter": "console",
        },

    },
    "loggers": {  # 日志器,配置这个可以在其他模块通过logging模块调用使用
        "": {
            "handlers": ["console", "error", "file"],  # 将日志发送到 console、error和file处理器(console控制台输出 file日志写入文件,以上有配置)
            "level": "INFO",  # 日志记录等级 INFO 及以上
        },
        "django": {
            "handlers": ["console", "error", "file"],
            "level": "INFO",
            "propagate": False,
        },
        'django.db.backends': {
            'handlers': ["console", "error", "file"],
            'propagate': False,
            'level': "INFO"
        },
        "uvicorn.error": {
            "level": "INFO",
            "handlers": ["console", "error", "file"],
        },
        "uvicorn.access": {
            "handlers": ["console", "error", "file"],
            "level": "INFO"
        },
    },
}

调用日志器

        其他模块调用日志器,自定义输出日志的内容,帮助排查定位

from django.http import HttpResponse
from rest_framework.views import APIView


class LogTestView(APIView):
    permission_classes = []

    def get(self, request):
        import logging
        
        # 获取日志记录器 这个是在settings.py配置的
        django_logger = logging.getLogger('django')
        backends_logger = logging.getLogger('django.db.backends')
        uvicorn_error_logger = logging.getLogger('uvicorn.error')

        django_logger.info("调用django日志器输出")
        backends_logger.info("调用django.db.backends日志器输出")
        uvicorn_error_logger.info("调用uvicorn.error日志器输出")

        return HttpResponse("测试")

日志输出示例: 

补充说明:

        1. django是有内置的标准日志输出,我们在settings中配置LOGGING是覆盖了django的默认日志

        2. 我们在settings中配置的控制台输出日志格式,如果项目部署在docker下,可以使用docker logs 查看日志,和在控制台看日志是一致的

补充日志格式

1. 日志等级

DEBUG : 10
INFO:20
WARN:30
ERROR。40
CRITICAL:50

数字越大,等级越高!!

2. 日志用处

        DEBUG(调试):用于开发阶段的调试,开启后,会记录程序运行过程中的所有详细信息,用于排查代码逻辑问题;在生产环境一般不建议长期开启,会产生大量的日志数据
        INFO(信息)::通常用来记录系统运行的关键事件或正常流程信息,或者是自定义输出日志帮助自己排查问题
        WARN(警告):记录可能潜在的问题或者非预期情况,但不影响系统整体运行的情况;可以提前发现可能存在的风险,避免小问题逐渐恶化成严重故障
        ERROR(错误):记录系统出现错误或异常情况,这些情况可能会导致功能无法正常使用或部分服务中断
        CRITICAL(致命): 显示应用程序中发生了严重的错误,比如程序失败

3. 日志格式

示例:format='%(asctime)s - %(name)s - %(levelname)s -%(module)s:  %(message)s'

filename:用指定的文件名创建FiledHandler,这样日志会被存储在指定的文件中
pathname:打印当前执行程序的路径,其实就是sys.argv[0]
filemode:文件打开方式,在指定了filename时使用这个参数,默认值为“a”还可指定为“w”
format:指定handler使用的日志显示格式。
datefmt:指定日期时间格式。
level:设置rootlogger(后边会讲解具体概念)的日志级别
stream:用指定的stream创建StreamHandler。可以指定输出到sys.stderr,sys.stdout或者文件(f=open(‘test.log’,’w’)),默认为sys.stderr。若同时列出了filename和stream两个参数,则stream参数会被忽略。

4. format参数中的格式化串

%(name)s Logger的名字
%(levelno)s 数字形式的日志级别
%(levelname)s 文本形式的日志级别
%(pathname)s 调用日志输出函数的模块的完整路径名,可能没有
%(filename)s 调用日志输出函数的模块的文件名
%(module)s 调用日志输出函数的模块名
%(funcName)s 调用日志输出函数的函数名
%(lineno)d 调用日志输出函数的语句所在的代码行
%(created)f 当前时间,用UNIX标准的表示时间的浮 点数表示
%(relativeCreated)d 输出日志信息时的,自Logger创建以 来的毫秒数
%(asctime)s 字符串形式的当前时间。默认格式是 “2003-07-08 16:49:45,896”。逗号后面的是毫秒
%(thread)d 线程ID。可能没有
%(threadName)s 线程名。可能没有
%(process)d 进程ID。可能没有
%(message)s用户输出的消息

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值