django logger日志输出配置

django logger日志输出配置

django logger日志输出配置

1-前言

Django对于日志输出的信息是很完善的,request的信息,setting配置,trackback的信息,一应俱全,足够我们调试了。但是在线上环境,如果让用户看到这些信息,是很不安全的(暴露代码)。所以在线上我们要关闭Debug,但是又不能扔掉这些调试信息,这就要用到logging模块。

logging模块其实是Python的模块,在Django中有很多本地化的支持。

Python日志记录配置由四部分组成:

  • Logger(记录仪)
  • Handler处理程序
  • Filters过滤器
  • Formaters格式化程序

Logger

记录器是记录系统的入口点。每个记录器都是一个命名存储桶,可以将消息写入进行处理。

记录器配置为具有日志级别。此日志级别描述了记录器将处理的消息的严重性。Python定义了以下日志级别:

  • DEBUG:用于调试目的的低级系统信息
  • INFO:一般系统信息
  • WARNING:描述已发生的小问题的信息。
  • ERROR:描述已发生的主要问题的信息。
  • CRITICAL:描述已发生的严重问题的信息。

一旦记录器确定需要处理消息,它就会传递给处理程序

处理程序

处理程序是确定记录器中每条消息发生情况的引擎。它描述了特定的日志记录行为,例如将消息写入屏幕,文件或网络套接字。

与记录器一样,处理程序也具有日志级别。如果日志记录的日志级别未达到或超过处理程序的级别,则处理程序将忽略该消息。

记录器可以有多个处理程序,每个处理程序可以具有不同的日志级别。以这种方式,可以根据消息的重要性提供不同形式的通知。

过滤器

  • 过滤器用于提供对从记录器到处理程序的日志记录传递的额外控制。
  • 默认情况下,将处理满足日志级别要求的任何日志消息。但是,通过安装筛选器,您可以在日志记录过程中添加其他条件
  • 例如,您可以安装仅允许ERROR发出来自特定源的消息的过滤器。
  • 过滤器还可用于在发出之前修改日志记录。
  • 例如,如果满足一组特定条件,您可以编写一个过滤器,将ERROR日志记录降级 为WARNING记录。
  • 过滤器可以安装在记录器或处理器上; 可以在链中使用多个过滤器来执行多个过滤操作。

格式化程序

最终,日志记录需要呈现为文本。格式化程序描述该文本的确切格式。格式化程序通常由包含LogRecord属性的Python格式化字符串组成 ; 但是,您也可以编写自定义格式化程序来实现特定的格式化行为。

2-配置日志记录

django logger日志及邮箱配置

#管理员邮箱
ADMINS = (
 ('longge','*******@163.com'),
)

#非空链接,却发生404错误,发送通知MANAGERS
SEND_BROKEN_LINK_EMAILS = True
MANAGERS = ADMINS

#Email设置
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST= 'smtp.163.com'#QQ邮箱SMTP服务器(邮箱需要开通SMTP服务)
EMAIL_PORT= 25 #QQ邮箱SMTP服务端口
EMAIL_HOST_USER = '**********@163.com' #我的邮箱帐号
EMAIL_HOST_PASSWORD = '**************' #授权码
EMAIL_SUBJECT_PREFIX = 'website' #为邮件标题的前缀,默认是'[django]'
EMAIL_USE_TLS = True #开启安全链接
DEFAULT_FROM_EMAIL = SERVER_EMAIL = EMAIL_HOST_USER #设置发件人

#logging日志配置
LOGGING = {
    'version': 1,  # 保留字
    'disable_existing_loggers': False,  # 禁用已经存在的logger实例
    # 日志文件的格式
    'formatters': {
        # 详细的日志格式
        'standard': {
            # 'format': '[%(asctime)s][%(threadName)s:%(thread)d][task_id:%(name)s][%(filename)s:%(lineno)d]'
            #           '[%(levelname)s][%(message)s]'
            'format': '[%(levelname)s][%(asctime)s][%(pathname)s:%(lineno)d] %(message)s'
        },
        # 简单的日志格式
        'simple': {
            'format': '[%(levelname)s][%(asctime)s][%(filename)s:%(lineno)d]%(message)s'
        },
        # 定义一个特殊的日志格式
        'collect': {
            'format': '%(message)s'
        }
    },
    # 过滤器
    'filters': {
        'require_debug_true': {
            '()': 'django.utils.log.RequireDebugTrue',
        },
    },
    # 处理器
    'handlers': {
        # 在终端打印
        'console': {
            'level': 'INFO',
            # 'filters': ['require_debug_true'],  # 只有在Django debug为True时才在屏幕打印日志
            'class': 'logging.StreamHandler',  #
            'formatter': 'simple'
        },
        # 默认的
        'default': {
            'level': 'INFO',
            'class': 'logging.handlers.RotatingFileHandler',  # 保存到文件,自动切
            'filename': os.path.join('app/log/app.log'),  # 日志文件
            'maxBytes': 1024 * 1024 * 500,  # 日志大小 500M
            'backupCount': 3,  # 最多备份几个
            'formatter': 'standard',
            'encoding': 'utf-8',
        },
        # 专门用来记错误日志
        'error': {
            'level': 'ERROR',
            'class': 'logging.handlers.RotatingFileHandler',  # 保存到文件,自动切
            'filename': os.path.join('app/log/app_error.log'),  # 日志文件
            'maxBytes': 1024 * 1024 * 500,  # 日志大小 50M
            'backupCount': 5,
            'formatter': 'standard',
            'encoding': 'utf-8',
        },
        # 专门定义一个收集特定信息的日志
        'collect': {
            'level': 'INFO',
            'class': 'logging.handlers.RotatingFileHandler',  # 保存到文件,自动切
            'filename': os.path.join('app/log/app_collect.log'),
            'maxBytes': 1024 * 1024 * 500,  # 日志大小 50M
            'backupCount': 5,
            'formatter': 'collect',
            'encoding': "utf-8"
        },
        # celery 信息的日志
        'celery': {
            'level': 'INFO',
            'class': 'logging.handlers.RotatingFileHandler',  # 保存到文件,自动切
            'filename': os.path.join('app/log/app_celery.log'),
            'maxBytes': 1024 * 1024 * 500,  # 日志大小 50M
            'backupCount': 5,
            'formatter': 'simple',
            'encoding': "utf-8"
        },
    },
    'loggers': {
        # 默认的logger应用如下配置
        '': {
            'handlers': ['default', 'console', 'error'],  # 上线之后可以把'console'移除
            'level': 'DEBUG',
            'propagate': True,  # 向不向更高级别的logger传递
        },
        # 名为 'collect'的logger还单独处理
        'collect': {
            'handlers': ['console', 'collect'],
            'level': 'INFO',
        },
        # 名为 'celery' 的logger还单独处理
        'celery': {
            'handlers': ['celery'],
            'level': 'INFO',
        }
    },
}

3-使用日志记录

imprt logging
logger = logging.getLogger(__name__)
cl_logger = logging.getLogger('celery')

4-日志模块流程图

发布于 2022-11-19 21:08・IP 属地上海