zoukankan      html  css  js  c++  java
  • 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})
  • 相关阅读:
    java实现第四届蓝桥杯组素数
    java实现第四届蓝桥杯组素数
    java实现第五届蓝桥杯斐波那契
    java实现第五届蓝桥杯斐波那契
    java实现第五届蓝桥杯斐波那契
    java实现第五届蓝桥杯斐波那契
    Spring boot随时获取ApplicationContex
    JAVA数据库连接池的革命 -- 从BoneCP到HikariCP(转)
    spring boot自动配置之jdbc(转)
    spring boot 的 ApplicationContext 及 getbean
  • 原文地址:https://www.cnblogs.com/zzqit/p/11899643.html
Copyright © 2011-2022 走看看