八.django日志配置

Django 日志
 Django 使用Python 内建的logging 模块打印日志,Python 的logging 配置由四个部分组成: 
记录? —— Logger 
处理程序 —— Handler 
过滤? —— Filter 
格式化 —— Formatter
1.记录? —— Logger
Logger 为日志系统的入口。每个logger命名都是bucket,你可以向这个bucket写入需要处理的消息。
每个logger 都有一个日志级别。日志级别表示该logger 将要处理的消息的严重性。Python
定义以下几种日志级别:
DEBUG:用于调试目的的底层系统信息
INFO:普通的系统信息
WARNING:表示出现一个较小的问题。
ERROR:表示出现一个较大的问题。
CRITICAL:表示出现一个致命的问题。
写入logger 的每条消息都是一条日志。每条日志也具有一个日志级别,它表示对应的消息的严重性。每个日志记录还可以包含描述正在打印的事件的元信息。
当一条消息传递给logger 时,消息的日志级别将与logger 的日志级别进行比较。如果消息的日志级别大于等于logger 的日志级别,该消息将会往下继续处理。如果小于,该消息将被忽略。
Logger 一旦决定消息需要处理,它将传递该消息给一个Handler。

 

 2.Logger配置

logger 对应的值是个字典,其每一个键都是logger的名字,每一个值又是个字典,描述了如何配置对应的Logger实例。

- level (可选的)。logger的级别。 
- propagate (可选的)。logger的传播设置。 
- flters (可选的)。logger的Òlter的标识符的列表。 
- handlers (可选的)。logger的handler的标识符的列表。
 

Logger配置示例:参考https://docs.djangoproject.com/en/3.0/topics/logging/


LOGGING = { 
  ‘loggers‘: { 
    ‘reboot‘: { 
      ‘handlers‘: [‘file_handler‘, ‘console_handler‘], 
      ‘level‘: ‘DEBUG‘, 
     }, 
   }, 

}3.处理程序 —— Handler 


Handler 决定如何处理logger 中的每条消息。它表示一个特定的日志行为,例如将消息写 
到屏幕上、写到文件中或者写到网络socket 
与logger 一样,handler 也有一个日志级别。如果消息的日志级别小于handler 的级别, 
handler 将忽略该消息 
Logger 可以有多个handler,而每个handler 可以有不同的日志级别。利用这种方式,可以 
根据消息的重要性提供不同形式的处理
4.过滤?——Filters 
Filter 用于对从logger 传递给handler 的日志记录进行额外的控制。 
默认情况下,满足日志级别的任何消息都将被处理。通过安装一个Òlter,你可以对日志处 
理添加额外的条件。例如,你可以安装一个Òlter,只允许处理来自特定源的ERROR 消息 
Filters 还可以用于修改将要处理的日志记录的优先级。例如,如果日志记录满足特定的条 
件,你可以编写一个Òlter 将日志记录从ERROR 降为WARNING 
Filters 可以安装在logger 上或者handler 上;多个Òlter 可以串联起来实现多层Òlter 行为
5.格式化——Formatters 
最后,日志记录需要转换成文本。Formatter 表示文本的格式。Fomatter 通常由包含日志记录 
属性的Python 格式字符串组成;你也可以编写自定义的fomatter 来实现自己的格式 
LOGGING = { 
  ‘formatters‘: { 
    ‘reboot‘:{ 
      ‘format‘: ‘%(asctime)s - %(pathname)s:%(lineno)d[%(levelname)s] - %(message)s‘ 
    }
    ‘simple‘: { 
      ‘format‘: ‘%(asctime)s %(levelname)s %(message)s‘ 
    }, 
  }, 
}
 
 6.Django 内置logger
django 获取所有日志 
django.request 处理与请求相关的日志,5xx响应报出error日志,4xx报出WARNING日志 
django.db.backends 处理与数据库之间交互的日志, 
django.security.* 处理与安全相关的日志 
django.db.backends.schemea 处理数据库迁移时的日志 

示例:django中的log需要在settings.py中配置

import time

cur_path = os.path.dirname(os.path.realpath(__file__))  # log_path是存放日志的路径
log_path = os.path.join(os.path.dirname(cur_path), ‘logs‘)
if not os.path.exists(log_path): os.mkdir(log_path)  # 如果不存在这个logs文件夹,就自动创建一个

LOGGING = {
    ‘version‘: 1,
    ‘disable_existing_loggers‘: True,
    ‘formatters‘: {
        # 日志格式
        ‘standard‘: {
            ‘format‘: ‘[%(asctime)s] [%(filename)s:%(lineno)d] [%(module)s:%(funcName)s] ‘
                      ‘[%(levelname)s]- %(message)s‘},
        ‘simple‘: {  # 简单格式
            ‘format‘: ‘%(levelname)s %(message)s‘
        },
    },
    # 过滤
    ‘filters‘: {
    },
    # 定义具体处理日志的方式
    ‘handlers‘: {
        # 默认记录所有日志
        ‘default‘: {
            ‘level‘: ‘INFO‘,
            ‘class‘: ‘logging.handlers.RotatingFileHandler‘,
            ‘filename‘: os.path.join(log_path, ‘all-{}.log‘.format(time.strftime(‘%Y-%m-%d‘))),
            ‘maxBytes‘: 1024 * 1024 * 5,  # 文件大小
            ‘backupCount‘: 5,  # 备份数
            ‘formatter‘: ‘standard‘,  # 输出格式
            ‘encoding‘: ‘utf-8‘,  # 设置默认编码,否则打印出来汉字乱码
        },
        # 输出错误日志
        ‘error‘: {
            ‘level‘: ‘ERROR‘,
            ‘class‘: ‘logging.handlers.RotatingFileHandler‘,
            ‘filename‘: os.path.join(log_path, ‘error-{}.log‘.format(time.strftime(‘%Y-%m-%d‘))),
            ‘maxBytes‘: 1024 * 1024 * 5,  # 文件大小
            ‘backupCount‘: 5,  # 备份数
            ‘formatter‘: ‘standard‘,  # 输出格式
            ‘encoding‘: ‘utf-8‘,  # 设置默认编码
        },
        # 控制台输出
        ‘console‘: {
            ‘level‘: ‘DEBUG‘,
            ‘class‘: ‘logging.StreamHandler‘,
            ‘formatter‘: ‘standard‘
        },
        # 输出info日志
        ‘info‘: {
            ‘level‘: ‘INFO‘,
            ‘class‘: ‘logging.handlers.RotatingFileHandler‘,
            ‘filename‘: os.path.join(log_path, ‘info-{}.log‘.format(time.strftime(‘%Y-%m-%d‘))),
            ‘maxBytes‘: 1024 * 1024 * 5,
            ‘backupCount‘: 5,
            ‘formatter‘: ‘standard‘,
            ‘encoding‘: ‘utf-8‘,  # 设置默认编码
        },
    },
    # 配置用哪几种 handlers 来处理日志
    ‘loggers‘: {
        # 类型 为 django 处理所有类型的日志, 默认调用
        ‘django‘: {
            ‘handlers‘: [‘default‘, ‘console‘],
            ‘level‘: ‘INFO‘,
            ‘propagate‘: False
        },
        # log 调用时需要当作参数传入
        ‘log‘: {
            ‘handlers‘: [‘error‘, ‘info‘, ‘console‘, ‘default‘],
            ‘level‘: ‘INFO‘,
            ‘propagate‘: True
        },
    }
}

脚本中调用views.py:

import logging

logger = logging.getLogger(‘log‘)
记录? —— Logger
Logger 为日志系统的入口。每个logger命名都是bucket,你可以向这个bucket写入需要处
理的消息。
每个logger 都有一个日志级别。日志级别表示该logger 将要处理的消息的严重性。Python
定义以下几种日志级别:
DEBUG:用于调试目的的底层系统信息
INFO:普通的系统信息
WARNING:表示出现一个较小的问题。
ERROR:表示出现一个较大的问题。
CRITICAL:表示出现一个致命的问题。
写入logger 的每条消息都是一条日志。每条日志也具有一个日志级别,它表示对应的消息
的严重性。每个日志记录还可以包含描述正在打印的事件的元信息。
当一条消息传递给logger 时,消息的日志级别将与logger 的日志级别进行比较。如果消息
的日志级别大于等于logger 的日志级别,该消息将会往下继续处理。如果小于,该消息将
被忽略。
Logger 一旦决定消息需要处理,它将传递该消息给一个Handler

相关推荐