zoukankan      html  css  js  c++  java
  • Django中的日志详解

    1.日志

    1.1 日志的作用

    简单总结为以下3点:

    • 用于程序调试
    • 了解软件程序运行情况,是否正常
    • 软件程序运行故障分析与问题定位

    1.2 日志的等级

    不同的应用程序所定义的日志等级可能会有所差别,分的详细点的会包含以下几个等级:

    • DEBUG

    • INFO

    • NOTICE

    • WARNING

    • ERROR

    • CRITICAL

    • ALERT

    • EMERGENCY

    1.3 日志信息与格式

    一条日志信息对应的是一个事件的发生,而一个事件通常需要包括以下几个内容:

    • 事件发生时间
    • 事件发生位置
    • 事件的严重程度--日志级别
    • 事件内容

    2.Django中的日志

    2.1 日志器 Logger

    日志器提供应用程序代码直接使用的接口,是整个日志系统的入口。

    一个日志器设定了日志级别,只有达到这个日志级别的信息才会被日志器处理,在这个日志级别以下的信息将会被日志器忽略。当日志器处理一条达到级别的信息时,它将会把这个信息传给处理器。

    Python中定义了五个日志级别(从低到高):

    • DEBUG: Low level system information for debugging purposes
    • INFO: General system information
    • WARNING: Information describing a minor problem that has occurred.
    • ERROR: Information describing a major problem that has occurred.
    • CRITICAL: Information describing a critical problem that has occurred.

    2.2 处理器 Handler

    处理器是日志处理的引擎,用于将日志记录发送到指定的目的位置。它决定了要将怎样的日志行为信息写入到哪里,如控制台、文件或socket端口。

    同日志器一样,处理器也有日志级别,也只会处理达到设定的日志级别的信息。一个日志器可以有多个处理器,每个处理器都设定有一个日志级别。你可以给每个处理器设定不同的日志级别。

    2.3 过滤器 Filter

    过滤器作为日志器和处理器之间额外的控制,用于控制哪些信息应该从日志器传送到处理器。

    系统默认任何达到日志级别要求的日志都会被处理,但通过增加过滤器,你可以在日志记录过程中增加额外的标准要求,以决定自己想要的日志级别。

    过滤器可以被增加在日志器中或者处理器中,同时也可以增加多个过滤器形成多个过滤操作。

    2.4 格式器 Formatter

    一个日志记录最终需要被记录为文本,格式器用于决定这个文本的格式。一个格式器通常由包含了LogRecord attributes的Python自带的格式化字符串组成。当然,我们也可以自定义特定的格式。

    常用的LogRecord Attributes有:

    Attribute name Format Description
    asctime %(asctime)s Human-readable time when the LogRecord was created. 默认格式为:2003-07-08 16:49:45,896.
    filename %(filename)s Filename portion of pathname.
    levelname %(levelname)s Text logging level for the message ('DEBUG', 'INFO', 'WARNING', 'ERROR', 'CRITICAL').
    levelno %(levelno)s Numeric logging level for the message (DEBUG, INFO, WARNING, ERROR, CRITICAL).
    lineno %(lineno)d Source line number where the logging call was issued (if available).
    message %(message)s The logged message, computed as msg % args. This is set when Formatter.format() is invoked.
    module %(module)s Module (name portion of filename).
    pathname %(pathname)s Full pathname of the source file where the logging call was issued (if available).
    process %(process)d Process ID (if available).
    processName %processName)s Process name (if available).
    thread %(thread)d Thread ID (if available).
    threadName %(threadName)s Thread name (if available).

    2.5 日志的工作流程图

    3.日志的使用范例

    在setting中增加日志配置,LOGGING字典中对日志器、处理器、过滤器、格式器进行配置

    # 日志配置
    LOGGING = {
        'version': 1,
        'disable_existing_loggers': False,              # 是否禁用日志器
        
        # 日志格式
        'formatters': {
            # 详细格式,名字可随意取
            'verbose': { 
                # 格式:	报错等级	       报错时间	   模块	       行号	  信息
                'format': '%(levelname)s %(asctime)s %(module)s %(lineno)d %(message)s'
            },
            # 简单格式
            'simple': { 
                'format': '%(levelname)s %(module)s %(lineno)d %(message)s'
            },
        },
        
        # 过滤器
        'filters': {
            'require_debug_true': {
                '()': 'django.utils.log.RequireDebugTrue',                              # 过滤掉调试信息
            },
        },
        
        # 处理错误信息的对象
        'handlers': {
            'console': {                              # 处理错误信息的控制台对象,即我们在pycharm中看到的调试信息由此控制
                'level': 'DEBUG',                     # DEBUG以上级别报错信息都会出现在控制台
                'filters': ['require_debug_true'],    # 设定过滤器
                'class': 'logging.StreamHandler',     # 日志处理器
                'formatter': 'verbose'                # 日志格式设为详细格式
            },
            'file': {                                 # 处理错误信息的file对象
                'level': 'INFO',                      # 记录INFO级别以上的报错信息
                'class': 'logging.handlers.RotatingFileHandler',                        # 日志处理器
                'filename': os.path.join(os.path.dirname(BASE_DIR), "logs/luffy.log"),  # 日志位置,日志文件名,日志保存目录logs必须手动创建,一般创建在项目根目录下      
                'maxBytes': 300 * 1024 * 1024,        # 日志文件的最大值,这里我们设置300M        
                'backupCount': 10,                    # 日志文件的数量,设置最大日志数量为10        
                'formatter': 'verbose'                # 日志格式:详细格式,日志格式在上面定义了
            },
        },
        
        # 日志对象
        'loggers': {
            # 日志器名
            'django': {      
                'handlers': ['console', 'file'],    # 处理对象有两个,一个conosle对象,一个file对象,这两个对象在上面的handlers中进行了定义和配置
                'propagate': True,                  # 是否让日志信息继续冒泡给其他的日志处理系统,子级向父级传播
            },
        }
    }
    

    在视图函数中使用日志器

    import logging
    logging = logging.getLogger('django')
    

    项目运行后,将可以看到达到INFO级别的日志信息被记录在logs目录中的luffy.log文件中

    4.本文参考:

    [1] Django 2.0 Logging

    [2] Python Logging HOWTO

    [3] Python and Django Logging in Plain English

    [4] django进阶之日志功能

    [5] Django 个人博客 - 日志器使用

    [6] Loggingrecord

    [7] 记录python脚本的日志

  • 相关阅读:
    IEEE 802.11p (WAVE,Wireless Access in the Vehicular Environment)
    齐夫定律, Zipf's law,Zipfian distribution
    信息中心网络 ,Information-centric networking, ICN
    Ubuntu 16.04安装QQ国际版图文详细教程
    IP多媒体子系统(IP Multimedia Subsystem,IMS)
    遗传算法
    再见, 软交换!又一个通信时代的落幕
    矩阵的核、特征向量、值域
    IPv4组播通信原理
    APIPA(Automatic Private IP Addressing,自动专用IP寻址)
  • 原文地址:https://www.cnblogs.com/sincere-ye/p/12184701.html
Copyright © 2011-2022 走看看