Django日志配置

Posted zzqit

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django日志配置相关的知识,希望对你有一定的参考价值。

在我们的实际开发过程中,我们有时候需要记录一些重要操作,或者程序运行情况,我们就需要在程序里面写入日志,来达到更快的排错跟记录重要操作的目的。以前也讲过python中logging模块进行相应的日志配置,在这里简单讲一下Django项目中如何配置与使用日志logging模块。

1.日志配置

在Django项目的settings.py文件中加入loggings配置

LOGGING = {
    version: 1,
    disable_existing_loggers: False,  # 是否禁用logger
    # formatters(日志格式,可以自己根据需求配置),提供给handler格式化日志输出使用(默认打印传入的消息体)
    formatters: {
        # ================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   用户输出的消息

        simple: {format: %(asctime)s %(message)s},  # 输出时间跟消息体(简单日志格式)
        standard: {
            format: %(asctime)s [%(threadName)s:%(thread)d] [%(name)s:%(lineno)d] [%(module)s:%(funcName)s] [%(levelname)s]- %(message)s  # 标准日志输出
        },
    },

    # 过滤器,提供给handler使用(可以不使用),也可以自定义过滤函数(https://docs.python.org/3/library/logging.html#filter-objects)
    filters: {
        # 过滤debug为True
        require_debug_true: {
            (): django.utils.log.RequireDebugTrue,
        },
        # 过滤debug为True
        require_debug_false: {
            (): django.utils.log.RequireDebugFalse,
        },
        # ‘special‘: {
        #     ‘()‘: ‘project.logging.SpecialFilter‘,
        #     ‘foo‘: ‘bar‘,
        # },
    },
    # 处理器,设置日志记录方式
    handlers: {
        # =================class设置分类(根据需求设置)=================
        # ‘logging.StreamHandler‘  # 控制台打印
        # ‘logging.FileHandler‘  # 保存到文件
        # ‘logging.handlers.RotatingFileHandler‘  # 保存到文件,根据文件大小自动切
        # ‘logging.handlers.TimedRotatingFileHandler‘  # 保存到文件,根据时间自动切
        # ‘django.utils.log.AdminEmailHandler‘  # 管理员发送错误电子邮件()

        console: {
            level: DEBUG,
            filters: [require_debug_true],  # 设置过滤器,多个用逗号分割
            class: logging.StreamHandler,  # 控制台打印
            formatter: simple  # 选用格式化样式
        },
        error: {
            level: ERROR,
            class: logging.handlers.RotatingFileHandler,  # 保存到文件,根据文件大小自动切
            filename: logs/error.log,  # 日志文件名
            maxBytes: 1024 * 1024 * 20,  # 日志大小 20M
            backupCount: 5,  # 保留的日志份数,默认为0表示都保存
            formatter: simple,  # 选用格式化样式
            encoding: utf-8
        },
        search: {
            level: INFO,
            class: logging.handlers.RotatingFileHandler,
            filename: logs/search.log,
            maxBytes: 1024 * 1024 * 50,
            backupCount: 10,
            formatter: simple,
            encoding: utf-8
        },
        push: {
            level: INFO,
            class: logging.handlers.TimedRotatingFileHandler,  # 按时间切割日志
            filename: logs/push.log,  # 日志输出文件
            when: D,  # 按天分割(S/秒 M/分 H/小时 D/天 W0-W6/(周一到周天) midnight/如果没指定时间就默认在午夜)
            backupCount: 7,
            formatter: standard,
        },
        request: {
            level: ERROR,
            class: logging.handlers.RotatingFileHandler,
            filename: logs/request_error.log,
            maxBytes: 1024 * 1024 * 20,
            backupCount: 5,
            formatter: simple,
            encoding: utf-8
        },
        # 给管理员发送邮件
        # ‘mail_admins‘: {
        #     ‘level‘: ‘ERROR‘,
        #     ‘class‘: ‘django.utils.log.AdminEmailHandler‘,
        #     ‘filters‘: [‘special‘]
        # }
    },

    loggers: {  # 日志记录器
        # 默认的logging应用
        ‘‘: {
            handlers: [console],
            propagate: True,
            level: os.getenv(DJANGO_LOG_LEVEL, DEBUG),  # 只有设置DEBUG为True时,该配置才会打印sql信息
        },
        # 内置logger,与请求处理有关的日志消息(可用作监控使用),5XX响应作为ERROR消息引发,出现4XX响应作为WARNING消息
        django.request: {
            ‘‘‘
            status_code:与请求关联的HTTP响应代码。
            request:生成日志消息的请求对象。
            ‘‘‘
            handlers: [request],  # 可配置为mail_admins
            level: WARNING,
            propagate: False,
        },
        # 内置logger,数据库orm语句执行情况
        django.db.backends: {
            ‘‘‘
            duration:执行SQL语句所花费的时间。
            sql:执行的SQL语句。
            params:SQL调用中使用的参数
            ‘‘‘
            handlers: [console],
            level: DEBUG,
        },
        # 创建logger对象,logging.getLogger(‘my_logger‘)
        my_logger: {
            handlers: [error, search],
            level: INFO,  # 设置对象的最低等级,不能高于handlers设置的日志级别
            propagate: False  # propagate是设定是否向父logger传播信息。必须设置为False,否则会打印两次
        },
        push: {
            handlers: [push],
            level: INFO,
            propagate: False
        },
    },
}

更多配置可参考官方文档

2.日志调用方式

 1 import logging
 2 
 3 add_log = logging.getLogger(my_logger)
 4 
 5 
 6 def test(request):
 7     try:
 8         add_log.info("查找test")
 9         a = b
10     except SyntaxError as e:
11         add_log.error(str(e))
12     return JsonResponse({state: 0})

 

以上是关于Django日志配置的主要内容,如果未能解决你的问题,请参考以下文章

Django日志配置

Django的日志如何配置?

如何在 Django Summernote 中显示编程片段的代码块?

argparse 代码片段只打印部分日志

Django日志配置

常用python日期日志获取内容循环的代码片段