Django-python-日志记录-参数设置-logging模块

1.日志等级

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

2.logging模块

Django的日志模块其实就是python的logging模块。它由4部分组成:
Logger 记录仪:生成和记录每条日志信息及级别
Handler处理程序: 根据日志信息级别交由相应处理程序处理(比如生成文件或发送邮件)
Filters 过滤器:日志交由处理程序处理前需要满足的过滤条件(比如Debug=True或False)
Formaters 格式化程序:决定每条日志的打印输出格式,可以有完整版的,也有简单版的

在Django下,在settings中,写入日志范例代码如下:

LOGGING = {
  'version': 1, # 保留字
  'disable_existing_loggers': False, # 是否禁用已经存在的日志实例
  'formatters': { # 定义日志的格式
    'standard': {
      'format': '[%(asctime)s][%(threadName)s:%(thread)d][task_id:%(name)s][%(filename)s:%(lineno)d]'
           '[%(levelname)s][%(message)s]'
    },
    'simple': {
      'format': '[%(levelname)s][%(asctime)s][%(filename)s:%(lineno)d]%(message)s'
    },
    'collect': {
      'format': '[%(asctime)s][%(filename)s:%(lineno)d]%(message)s'
    }
  },
  'filters': { # 定义日志的过滤器
    'require_debug_true': {
      '()': 'django.utils.log.RequireDebugTrue',
    },
  },
  'handlers': { # 日志处理程序
    'console': {
      'level': 'DEBUG',
      'filters': ['require_debug_true'], # 只有在Django debug为True时才在屏幕打印日志
      'class': 'logging.StreamHandler',
      'formatter': 'simple'
    },
    'SF': {
      'level': 'INFO',
      'class': 'logging.handlers.RotatingFileHandler', # 保存到文件,根据文件大小自动切
      'filename': os.path.join(BASE_LOG_DIR, "zhiliao_info.log"), # 日志文件
      'maxBytes': 1024 * 1024 * 500, # 日志大小 50M(最好不要超过1G)
      'backupCount': 3, # 备份数为3 xx.log --> xx.log.1 --> xx.log.2 --> xx.log.3
      'formatter': 'standard',
      'encoding': 'utf-8', # 文件记录的编码格式
    },
    'TF': {
      'level': 'INFO',
      'class': 'logging.handlers.TimedRotatingFileHandler', # 保存到文件,根据时间自动切
      'filename': os.path.join(BASE_LOG_DIR, "zhiliao_info.log"), # 日志文件
      'backupCount': 3, # 备份数为3 xx.log --> xx.log.2018-08-23_00-00-00 --> xx.log.2018-08-24_00-00-00 --> ...
      'when': 'D', # 每天一切, 可选值有S/秒 M/分 H/小时 D/天 W0-W6/周(0=周一) midnight/如果没指定时间就默认在午夜
      'formatter': 'standard',
      'encoding': 'utf-8',
    },
    'error': {
      'level': 'ERROR',
      'class': 'logging.handlers.RotatingFileHandler', # 保存到文件,自动切
      'filename': os.path.join(BASE_LOG_DIR, "zhiliao_err.log"), # 日志文件
      'maxBytes': 1024 * 1024 * 5, # 日志大小 50M
      'backupCount': 5,
      'formatter': 'standard',
      'encoding': 'utf-8',
    },
    'collect': {
      'level': 'INFO',
      'class': 'logging.handlers.RotatingFileHandler', # 保存到文件,自动切
      'filename': os.path.join(BASE_LOG_DIR, "zhiliao_collect.log"),
      'maxBytes': 1024 * 1024 * 50, # 日志大小 50M
      'backupCount': 5,
      'formatter': 'collect',
      'encoding': "utf-8"
    }
  },
  'loggers': { # 日志实例
    '': { # 默认的logger应用如下配置
      'handlers': ['SF', 'console', 'error'], # 上线之后可以把'console'移除
      'level': 'DEBUG',
      'propagate': True, # 是否向上一级logger实例传递日志信息
    },
    'collect': { # 名为 'collect' 的logger还单独处理
      'handlers': ['console', 'collect'],
      'level': 'INFO',
    }
  },
}

2.1.Formatters

格式化字符串的种类

%(name)s:记录器logger的名称
%(levelno)s:日志级别对应的数字
%(levelname)s:日志级别名称
%(pathname)s:日志记录调用的源文件的完整路径
%(filename)s:日志记录调用的源文件名
%(module)s:模块名
%(lineno)d:日志调用的行数
%(funcName)s:函数名
%(created)f:日志创建时间,time.time()
%(asctime)s:日志创建时间,文本类型
%(msecs)d:日志创建时间的毫秒部分
%(relativeCreated)d:日志创建时间 - 加载日志模块的时间 的 毫秒数
%(thread)d:线程ID
%(threadName)s:线程名
%(process)d:进程ID
%(processName)s:进程名
%(message)s:日志消息

2.2.Filters

过滤器filter用于提供对日志记录从logger传递到handler的附加控制。配置过滤器,在handler中使用。如下所示:

'filters': { # 定义日志的过滤器
    'require_debug_true': {
      '()': 'django.utils.log.RequireDebugTrue',
    },
  },

2.3.Handlers

这个类是确定logger中消息发生的引擎程序,描述特定的日志记录行为,譬如控制台打印、写入日志文件、通过网络进行发送等。与logger一样,handler也具有日志级别,如果日志记录的日志级别未达到或超过handler的级别,则handler将忽略该消息。一个logger可以有多个handler,每个handler可以有不同的日志级别和记录方法,settings中配置,4个参数(如下),加上对应class类的初始化参数:
class(必需):处理程序类的名称
level(可选的):处理程序的级别
formatter(可选的):处理程序的格式化程序
filters(可选的):处理程序的过滤器的列表

2.4.Loggers

level:指定记录日志的级别,没有配置则处理所有级别的日志
propagate:设置该记录器的日志是否传播到父记录器,不设置则是True
filters:指定过滤器列表
handlers:指定处理器列表

3.使用范例

import logging

# 实例化logging对象,并以当前文件的名字作为logger实例的名字
logger = logging.getLogger(__name__);#默认日志参数

# 生成一个名字叫做 collect 的日志实例
logger_collect = logging.getLogger('collect');#指定名称日志参数

4.在Python中使用日志

4.1.简单易用的logging

import logging

# 输出到控制台,设置格式
logging.basicConfig(level=logging.INFO, format='%(asctime)s %(message)s', datefmt='%Y/%m/%d %H:%M:%S')  
# 输出到文件,默认是追加模式
# logging.basicConfig(filename='test.log', filemode="a", level=logging.INFO)  

logging.debug("输出debug")
logging.info("输出info")
logging.warning("输出warning")
logging.error("输出error")
logging.critical("输出critical")

4.2.复杂一些的logging

import logging

# 创建logger对象
logger = logging.getLogger('my_logger')

# 设置日志等级
logger.setLevel(logging.INFO)
# 输出的日志信息格式
formatter = logging.Formatter('%(asctime)s-%(filename)s-line:%(lineno)d-%(levelname)s-%(process)s: %(message)s')

# 写到控制台
console_handler = logging.StreamHandler()
console_handler.setLevel(logging.INFO)
console_handler.setFormatter(formatter)

# 写到文件
file_handler = logging.FileHandler('test.log', encoding='utf-8')
file_handler.setLevel(logging.INFO)
file_handler.setFormatter(formatter)

# 设置到logger对象中
logger.addHandler(file_handler)
logger.addHandler(console_handler)

if __name__ == "__main__":
    logger.debug('this is debug message')
    logger.info('this is info message')
    logger.error("errorxxxxxxx")

5.作者答疑

如有疑问,敬请留言。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值