logging模块
程序员文章站
2023-01-14 22:12:50
一 日志级别: 二 默认级别为warning,默认打印到终端: 四 logging模块的Formatter,Handler,Logger,Filter对象: 七 应用: ......
一 日志级别:
critical = 50 #fatal = critical
error = 40
warning = 30 #warn = warning
info = 20
debug = 10
notset = 0 #不设置
二 默认级别为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
'''
format参数中可能用到的格式化串:
%(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用户输出的消息
#========使用
import logging
logging.basicconfig(filename='access.log',
format='%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s',
datefmt='%y-%m-%d %h:%m:%s %p',
level=10)
logging.debug('调试debug')
logging.info('消息info')
logging.warning('警告warn')
logging.error('错误error')
logging.critical('严重critical')
#========结果
access.log内容:
2017-07-28 20:32:17 pm - root - debug -test: 调试debug
2017-07-28 20:32:17 pm - root - info -test: 消息info
2017-07-28 20:32:17 pm - root - warning -test: 警告warn
2017-07-28 20:32:17 pm - root - error -test: 错误error
2017-07-28 20:32:17 pm - root - critical -test: 严重critical
四 logging模块的formatter,handler,logger,filter对象:
#logger:产生日志的对象
#filter:过滤日志的对象
#handler:接收日志然后控制打印到不同的地方,filehandler用来打印到文件中,streamhandler用来打印到终端
#formatter对象:可以定制不同的日志格式对象,然后绑定给不同的handler对象使用,以此来控制不同的handler的日志格式
'''
critical=50
error =40
warning =30
info = 20
debug =10
'''
import logging
#1、logger对象:负责产生日志,然后交给filter过滤,然后交给不同的handler输出
logger=logging.getlogger(__file__)
#2、filter对象:不常用,略
#3、handler对象:接收logger传来的日志,然后控制输出
h1=logging.filehandler('t1.log') #打印到文件
h2=logging.filehandler('t2.log') #打印到文件
h3=logging.streamhandler() #打印到终端
#4、formatter对象:日志格式
formmater1=logging.formatter('%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s',
datefmt='%y-%m-%d %h:%m:%s %p',)
formmater2=logging.formatter('%(asctime)s : %(message)s',
datefmt='%y-%m-%d %h:%m:%s %p',)
formmater3=logging.formatter('%(name)s %(message)s',)
#5、为handler对象绑定格式
h1.setformatter(formmater1)
h2.setformatter(formmater2)
h3.setformatter(formmater3)
#6、将handler添加给logger并设置日志级别
logger.addhandler(h1)
logger.addhandler(h2)
logger.addhandler(h3)
logger.setlevel(10)
#7、测试
logger.debug('debug')
logger.info('info')
logger.warning('warning')
logger.error('error')
logger.critical('critical')
七 应用:
'''# 定义三种日志输出格式 开始'''
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'
'''# 定义日志输出格式 结束'''
'''定义日志文件的路径'''
log_path=r'a3.log'
'''# 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': log_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)传递
},
},
}
logging.config.dictconfig(logging_dic) # 导入上面定义的logging配置
logger = logging.getlogger(__name__) # 生成一个log实例
logger.debug('测试') # 记录该文件的运行状态