django[十一] Django综合篇 - 迁

综合篇

Django日志

Django使用Python内置的logging模块实现它自己的日志系统。

在Python的logging模块中,主要包含下面四大金刚:

  • Loggers: 记录器
  • Handlers:处理器
  • Filters: 过滤器
  • Formatters: 格式化器

在Django视图中使用logging

# 导入logging库
import logging

# 获取一个logger对象
logger = logging.getLogger(__name__)

def my_view(request, arg1, arg):
    ...
    if bad_mojo:
        # 记录一个错误日志
        logger.error('Something went wrong!')

  

每满足bad_mojo条件一次,就写入一条错误日志。

实际上,logger对象有下面几个常用内置方法:

  • logger.debug()  = 10  
  • logger.info()      =  20
  • logger.warning()   = 30
  • logger.error()     = 40
  • logger.critical()   = 50

如果设置日志级别为WARNING,则通过日志记录器则输入WARNING级别以下的信息是不会被处理的,会输出 >=30 等级的日志

在Django中配置logging

通常,只是像上面的例子那样简单的使用logging模块是远远不够的,我们一般都要对logging的四大金刚进行一定的配置。

Python的logging模块提供了好几种配置方式。默认情况下,Django使用dictConfig format。也就是字典方式。

例一:

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'handlers': {
        'file': {
            'level': 'DEBUG',
            'class': 'logging.FileHandler',
            'filename': '/path/to/django/debug.log',
        },
    },
    'loggers': {
        'django': {
            'handlers': ['file'],
            'level': 'DEBUG',
            'propagate': True,
        },
    },
}

将全部日志写入单个文件中

例二:

下面这个示例配置,让Django将日志打印到控制台,通常用做开发期间的信息展示。

import os

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'handlers': {
        'console': {
            'class': 'logging.StreamHandler',
        },
    },
    'loggers': {
        'django': {
            'handlers': ['console'],
            'level': os.getenv('DJANGO_LOG_LEVEL', 'INFO'),
        },
    },
}

  

例三:

下面是一个相当复杂的logging配置:

LOGGING = {
    "version": 1,
    "disable_existing_loggers": False,

    "loggers":{
        "webResty2": {
            "level": "DEBUG",
            "handlers": ["file_handle", "console"],
            "propagate": True, # 选择关闭继承,不然这个logger继承自默认,日志就会被记录2次了('django'一次,自己一次)
        },
        "django.request": {
            "level": "DEBUG",
            "handlers": ["django_request_handler"],
            "propagate": True,
        },
        "django":{
            "level": "DEBUG",
            "handlers": [ "django_handle"],
            "propagate": False,
        },
        "report":{
            "level": "ERROR",
            "handlers": [ "mail"],
            "propagate": True,
        }
    },

    "filters": {
        "require_debug_true": {
            "()": "django.utils.log.RequireDebugTrue",
        },
    },

    "handlers": {
        "console": {
            "level": "DEBUG",
            "filters": ["require_debug_true"],
            "class": "logging.StreamHandler",
            "formatter": "simple"
        },
        "file_handle": {
            "class": "logging.FileHandler",
            "filename": os.path.join(BASE_DIR, "logs", "webResty2.log"),
            "formatter": "console"
        },

        "django_handle": {
            "class": "logging.FileHandler",
            "filename": os.path.join(BASE_DIR, "logs", "django.log"),
            "formatter": "console"
        },

        "django_request_handler": {
            "level": "DEBUG",
            "class": "logging.handlers.RotatingFileHandler",
            "filename": os.path.join(BASE_DIR, "logs", "request.log"),
            "maxBytes": 1024 * 1024 * 5,
            "backupCount": 5,
            "formatter": "console",
        },

        "mail":{
            "class": "logging.handlers.SMTPHandler",
            "level": "ERROR",
            "formatter": "simple",
            "mailhost":("smtp.139.com", 25),
            "fromaddr":"xxxxx@139.com",
            "toaddrs":["xxxxx@qq.com"],
            "subject" : "devops mail",
            "credentials" :("xxxx@139.com","password")
        }
    },

    'formatters': {
        'console':{
            'format': '[%(asctime)s] [%(process)d] [%(thread)d] [%(filename)8s:%(lineno)4d] [%(levelname)-6s] %(message)s'
        },
        'simple': {
            'format': '%(asctime)s %(levelname)s %(message)s'
        }
    },
}

   

上面的logging配置主要定义了这么几件事情:

  • 定义了配置文件的版本,当前版本号为1.0

  • 定义了两个formatter:simple和console,分别表示两种文本格式。

  • 定义了一个过滤器:RequireDebugTrue  ,提供更细粒度的日志过滤功能,用于决定哪些日志记录将会被输出(其它的日志记录将会被忽略)

  • 定义了五个处理器handlers:
    • console
    • file_handler
    • django_handler
    • django_request_handler
    • mail
  • 配置了三个logger:
    •   webresty2: 我定义的处理器,记录一些我需要看到的日志,在模块中指定logger: 
      logger = logging.getLogger('webResty2') 
    •   django.request: :django的request发生error会自动记录,然后使用debug将信息记录到文件,还有mail_admins将信息通过邮件发送给管理员。这里邮件的功能非常棒!并不是一个纯文本信息,而是一个html文件,和我们在浏览器看到的错误页面一模一样!要正常使用邮件功能需要像我一样配置一下上面的邮件发件人信息。我是直接去网易申请了一个邮箱。要格外注意三点:1.一定要去邮件服务商开启SMTP服务;2.不同的邮件服务商可能有一些特殊的设置,比如网易,会给你一个客户端授权码,这个才是密码,而不是网页的登录密码。3 注意服务商有没有对发信频率的限制。
    •        django: 全部的日志信息,

配置django-auto-ldap

安装

pip install python-ldap  
pip install pyldap # py3 

# 安装
pip install django-auth-ldap

  

源码安装

python-ldap-2.4.12.tar.gz 
django-auth-ldap-1.1.4.tar.gz

  

问题:
1  error: Setup script exited with error: command 'x86_64-linux-gnu-gcc' failed with exit status 
$ sudo apt-get install python-dev
$ sudo apt install python3-dev  # py3 环境

2 can only concatenate tuple (not "NoneType") to tuple
"Previous versions of Celery required a separate library to work with Django, but since 3.1 this is no longer the case. Django is supported out of the box now"
4+版本之后就不能使用 python manage.py celery 启动了,所以请看下一celery的版本,保持在3.1.26.post2

  

在线文档: https://django-auth-ldap.readthedocs.io/en/latest/install.html

 

posted @ 2019-01-19 11:53  richardzgt  阅读(232)  评论(0编辑  收藏  举报