python之路--day15--常用模块之logging模块

时间:2021-03-26 04:20:47

常用模块

  1 logging模块

  日志级别:Noset (不设置)

      Debug---(调试信息)----也可用10表示

      Info--(消息信息)----也可用20表示

      Warning---(警告信息)----也可用30表示

      Error------(错误消息)----也可用40表示

      Critical---(严重错误)---也可用50表示

  默认级别是Warning,默认打印到终端 

 import logging

 logging.debug('调试debug')
logging.info('消息info')
logging.warning('警告warn')
logging.error('错误error')
logging.critical('严重critical') '''
WARNING:root:警告warn
ERROR:root:错误error
CRITICAL:root:严重critical
'''

2,logging模块全局配置,针对所有logger有效

  logging模块的四个对象:  

Logger:产生日志的对象
Filter:过滤日志的对象(不常用,可以忽略)
Handler:接受日志然后控制打印到不同的地方,
FileHandler用来打印到文件中,StreamHandler用来打印到终端
Formatter对象:可以定制不同的日志格式对象,然后绑定给不同的Handler对象使用,以此来控制不同的Handler的日志格式

  

配置参数:

  filename:用指定的文件名创建FiledHandler,这样日志会被存储在文件中

  filemode:文件打开方式,在指定了filename时使用这个参数,默认值为‘a’,还可以指定为‘w’

  format:指定handler使用的日志显示格式

  datafmt:指定日期时间格式

  level:设置rootlogger的日志级别

  stream:用指定的stream创建StreamHandler,可以指定输出到sys.stderr,sys.stdout或者文件,默认为sys.stderr。如果同时列出filename和stream两个参数,那么stream参数会被忽略

  格式:

%(name)s:Logger的名字,并非用户名,详细查看

%(levelno)s:数字形式的日志级别

%(levelname)s:文本形式的日志级别

%(pathname)s:调用日志输出函数的模块的完整路径名,可能没有

%(filename)s:调用日志输出函数的模块的文件名

%(module)s:调用日志输出函数的模块名

%(funcName)s:调用日志输出函数的函数名

%(lineno)d:调用日志输出函数的语句所在的代码行

%(created)f:当前时间,用UNIX标准的表示时间的浮 点数表示

%(relativeCreated)d:输出日志信息时的,自Logger创建以 来的毫秒数

%(asctime)s:字符串形式的当前时间。默认格式是 “2003-07-08 16:49:45,896”。逗号后面的是毫秒

%(thread)d:线程ID。可能没有

%(threadName)s:线程名。可能没有

%(process)d:进程ID。可能没有

%(message)s:用户输出的消息

Logger与Handler的级别

  logger是第一级过滤,然后才能到handler,我们可以给logger和handler同时设置level,但是需要主要的是:

  无法通过logger级别过滤,日志就不会打印;

  无法通过handler级别过滤,日志也不会打印

  只有同时通过logger级别,和handler级别过滤的日志才能打印

定义好的logging配置文件(修改相关信息之后就可以在其他地方使用)

 """
logging配置
""" import os
import logging.config # 定义三种日志输出格式 开始 standard_format = '[%(asctime)s][%(threadName)s:%(thread)d][task_id:%(name)s][%(filename)s:%(lineno)d]' \
'[%(levelname)s][%(message)s]' #其中name为getlogger指定的名字 simple_format = '[%(levelname)s][%(asctime)s][%(filename)s:%(lineno)d]%(message)s' id_simple_format = '[%(levelname)s][%(asctime)s] %(message)s' # 定义日志输出格式 结束 logfile_dir = os.path.dirname(os.path.abspath(__file__)) # log文件的目录 logfile_name = 'all2.log' # log文件名 # 如果不存在定义的日志目录就创建一个
if not os.path.isdir(logfile_dir):
os.mkdir(logfile_dir) # log文件的全路径
logfile_path = os.path.join(logfile_dir, logfile_name) # log配置字典
LOGGING_DIC = {
'version': 1,
'disable_existing_loggers': False,
'formatters': {
'standard': {
'format': standard_format
},
'simple': {
'format': simple_format
},
},
'filters': {},
'handlers': {
#打印到终端的日志
'console': {
'level': 'DEBUG',
'class': 'logging.StreamHandler', # 打印到屏幕
'formatter': 'simple'
},
#打印到文件的日志,收集info及以上的日志
'default': {
'level': 'DEBUG',
'class': 'logging.handlers.RotatingFileHandler', # 保存到文件
'formatter': 'standard',
'filename': logfile_path, # 日志文件
'maxBytes': 1024*1024*5, # 日志大小 5M
'backupCount': 5,
'encoding': 'utf-8', # 日志文件的编码,再也不用担心中文log乱码了
},
},
'loggers': {
#logging.getLogger(__name__)拿到的logger配置
'': {
'handlers': ['default', 'console'], # 这里把上面定义的两个handler都加上,即log数据既写入文件又打印到屏幕
'level': 'DEBUG',
'propagate': True, # 向上(更高level的logger)传递
},
},
} def load_my_logging_cfg():
logging.config.dictConfig(LOGGING_DIC) # 导入上面定义的logging配置
logger = logging.getLogger(__name__) # 生成一个log实例
logger.info('It works!') # 记录该文件的运行状态 if __name__ == '__main__':
load_my_logging_cfg() logging配置文件

注意:

    logger字典定义一个空key的原因:

    

 #我们的解决方式是,定义一个空的key
'loggers': {
'': {
'handlers': ['default', 'console'],
'level': 'DEBUG',
'propagate': True,
}, } 这样我们再取logger对象时
logging.getLogger(__name__),不同的文件__name__不同,这保证了打印日志时标识信息不同,但是拿着该名字去loggers里找key名时却发现找不到,于是默认使用key=''的配置