• Django 系统日志logging


    Django使用Python内建的logging模块去建造自己的系统日志的,如果你想详细了解这个模块的话,请自己去看python的说明文档,这里仅仅介绍Django中的日志系统。

    日志配置包括四个部分:格式器(formatters),过滤器(filters),处理器(handlers),记录器(loggers),下面我们来一一讲解。

    格式器

    控制日志输出的格式,格式使用python的字符串控制格式。

    属性格式描述
    asctime %(asctime)s 日志产生的时间,默认格式为2003-07-08 16:49:45,896
    created %(created)f time.time()生成的日志创建时间戳
    filename %(filename)s 生成日志的程序名
    funcName %(funcName)s 调用日志的函数名
    levelname %(levelname)s 日志级别 ('DEBUG', 'INFO', 'WARNING', 'ERROR', 'CRITICAL')
    levelno %(levelno)s 日志级别对应的数值
    lineno %(lineno)d 日志所针对的代码行号(如果可用的话)
    module %(module)s 生成日志的模块名
    msecs %(msecs)d 日志生成时间的毫秒部分
    message %(message)s 具体的日志信息
    name %(name)s 日志调用者
    pathname %(pathname)s 生成日志的文件的完整路径
    process %(process)d 生成日志的进程ID(如果可用)
    processName %(processName)s 进程名(如果可用)
    thread %(thread)d 生成日志的线程ID(如果可用)
    threadName %(threadName)s 线程名(如果可用)

    过滤器

    过滤器是用来提供额外的控制,控制哪些日志记录可以被传给处理器处理。

    默认情况下,只要日志消息符合相应的等级要求就会传给对应的处理器处理,然而,通过安装过滤器,你可以在日志记录过程中设置额外的内容,例如,你可以安装一个过滤器使得某个源只有error级别的消息才会被发送。你也可以使用过滤器修改之前会被发送的消息,例如,你可以写一个过滤器使得符合某些条件的error等级的消息降级为warning等级。

    过滤器可以给处理器和记录器使用,多个过滤器可以级联使用。

    处理器

    处理器是决定日志记录器中对应的实体消息发生了什么的引擎,描述了一个具体的日志行为,比如输出到屏幕,或者一个文件,抑或一个网络socket。

    和记录器一样,没有到达相应等级的消息会被忽略。

    一个记录器可以有多个处理器,一个处理器可以有不同的日志等级,因此你可以根据消息的重要性而提供不同的提示。

    记录器

    一个记录器是日志系统的一个实体,每一个记录器是一个已经命名好的可以将消息为进程写入的"容器"。

    每一个记录器都会有一个日志等级,每个等级描述了记录器即将处理的信息的严重性,python定义了以下五个等级:

    debug:出于调试目的的低层次系统信息

    • info:普通的系统信息
    • warning:描述已经发生的小问题
    • error:描述已经发生的主要问题
    • critical:描述已经发生的严重问题

    每一条被写入记录器的信息成为一条日志记录,每条日志记录都有一个表明该记录严重性的日志等级,每条日志信息也会包含一些有用的元信息表明已经被记录的事件,比如栈追溯和错误代码。

    当一条信息被发往记录器的时候,消息的记录等级会和记录器的等级相比较,如果符合甚至超越当前等级,则被发往处理器处理,否则会被忽略掉。

    使用日志

    在settings.py中配置

    LOGGING = {
        'version': 1,   # 指明dictConnfig的版本,目前就只有一个版本
        'disable_existing_loggers': False,   # 禁用所有的已经存在的日志配置
    
        # 格式器
        'formatters': {
            'standard': {  # 详细
                'format': '
    时间:[%(asctime)s] | 级别:[%(levelname)s] | 路径:[%(pathname)s] | 文件名:[%(filename)s] | 方法:[%(funcName)s] | 行数:[%(lineno)d] | 日志消息:
    [%(message)s]
    
    ------------------------------------------------------------',
             },
            'simple': {  # 简单
                'format': '时间:%(asctime)s | %(levelname)s | %(message)s',
             },
        },
    
        # 过滤器
        'filters': {
            'require_debug_true': {
                '()': 'django.utils.log.RequireDebugTrue',       # 此过滤器仅在settings.DEBUG为True时传递记录
             },
            'require_debug_false': {
                '()': 'django.utils.log.RequireDebugFalse',      # 此过滤器仅在settings.DEBUG为False时传递记录
            },
        },
    
        # 处理器,在这里定义了三个处理器。主要指明:处理引擎类、格式器、过滤器、日志等级
        'handlers': {
            'file_handler': {   # 文件处理器,所有高于(包括)debug的消息会被传到"E:/Djlog/file.log"
                'level':'DEBUG',
                'class':'logging.handlers.TimedRotatingFileHandler',
                'formatter':'standard',
                'filename': 'E:/Djlog/file.log',
             },
            'console':{     # 流处理器(控制台),所有的高于(包括)debug的消息会被传到stderr,使用的是simple格式器
                'level':'INFO',
                'class':'logging.StreamHandler',
                'formatter': 'standard',
             },
            'mail_admins': {    # AdminEmail处理器,所有高于(包括)而error的消息会被发送给站点管理员,使用的是special格式器
                'level': 'ERROR',
                'class': 'django.utils.log.AdminEmailHandler',
                'formatter':'standard',
                'include_html':False,   # 是否发送那些回溯信息,因为这些都是很敏感的系统系统,如果被人截获,可能会发生危险,所以要谨慎
                'filters': ['require_debug_false'],  # 当settings.DEBUG=False的时候,AdminEmailHandler才生效
             },
        },
    
        # 记录器。主要指明:处理器、日志等级
        'loggers': {
            'django': {     # 使用file_handler处理器,所有高于(包括)info的消息会被发往console和file_handler处理器,向父层次传递信息
                'handlers': ['file_handler','console'],
                'level':'INFO',
                'propagate': False,  # 是否继承父类的log信息
             },
            'django.request': {     # 所有高于(包括)error的消息会被发往console和mail_admins处理器,消息不向父层次发送
                'handlers': ['mail_admins','console'],
                'level': 'DEBUG',
                'propagate': False,
             },
            'myproject.custom': {   # 所有高于(包括)info的消息同时会被发往console和mail_admins处理器
                'handlers': ['mail_admins','console'],
                'level': 'INFO',
                'propagate': False,
             },
        }
    }

     程序中

    配置格式器,过滤器,处理器和记录器后,需要将日志记录调用放入代码中。使用日志框架非常简单,这是一个例子:

    # import the logging library
    import logging
    
    # Get an instance of a logger
    logger = logging.getLogger(__name__)      # 获得实例对象。__name__模块名,可以传入其他
    
    def my_view(request, arg1, arg):
        ...
        if bad_mojo:
            # Log an error message
            logger.error('Something went wrong!')

    禁用日志配置

    LOGGING_CONFIG=None,禁用。

    Django自带的记录器

    django记录器

    django记录器是捕捉所有消息的记录器,没有消息是直接发往django记录器的,而是使用下面的记录器。

    django.request记录器

    5XX会引发一个error消息,4XX会引发一个warning消息,这个记录器还附带有额外的上下文:

    • status_code:HTTP响应吗
    • request:生成这个消息的request对象

    django.db.backends记录器

    所有的由请求运行的sql语句都会记录一条debug的消息,每个记录器还附带有额外的上下文:

    • duration:sql语句运行的时间
    • sql:运行的sql语句
    • params:sql语句调用的参数

    处于网站运行的表现原因,仅当settings.DEBUG=True的时候,这个处理器才生效,否则即使配置了也无效。

    Django自带的过滤器

    class CallBackFilter(callback)

    这个过滤器接受一个回调函数(这个函数接受一个参数,被记录的信息),每个记录通过过滤器的时候都会调用这个回调函数,当回调函数返回False的时候,不处理这个记录。下面是一个示例:

    from django.http import UnreadablePostError
    
    def skip_unreadable_post(record):
        if record.exc_info:
            exc_type, exc_value = record.exc_info[:2]
            if isinstance(exc_value, UnreadablePostError):
                return False
        return True
    'filters': {
        'skip_unreadable_posts': {
            '()': 'django.utils.log.CallbackFilter',
            'callback': skip_unreadable_post,
        }
    },
    'handlers': {
        'mail_admins': {
            'level': 'ERROR',
            'filters': ['skip_unreadable_posts'],
            'class': 'django.utils.log.AdminEmailHandler'
        }
    },

    class RequireDebugFalse

    此过滤器仅在settings.DEBUG为False时传递记录。

    class RequireDebugTrue

    此过滤器仅当settings.DEBUG为True时传递记录。

      至此,转载请注明出处。

    本站相关链接:>>Django部署 ]

  • 相关阅读:
    c++中 . 和 -> 的区别是什么?
    codeblocks中一个简单的程序的创建。
    将牛客中的代码在codeblocks中进行实现
    (全代码)输入一颗二叉树的跟节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。(注意: 在返回值的list中,数组长度大的数组靠前)
    解决You are using pip version 10.0.1, however version 18.1 is available. You should consider upgrading via the 'python -m pip install --upgrade pip' command.
    mysql 表复制(表备份)
    Scrapy 抓取股票行情
    去哪儿网数据爬取
    用API爬取天气预报数据
    爬虫防封IP
  • 原文地址:https://www.cnblogs.com/wcwnina/p/8516785.html
Copyright © 2020-2023  润新知