日志模块
一、日志的介绍
1.1 日志与print的区别:
print:灵活打印,移除困难
loger:多种格式化方案,方便移除,方便输出到文本
1.2 日志的级别 与 单例模式
一、等级从低到高分为5个等级,默认的显示等级为warning
1. debug 详细信息,通常在诊断问题时感兴趣
2. info 确认事情的按期工作
3. warning 表示意外的发生,或者在不久的将来将要出现的问题(如:磁盘不足)
4. error 由于更严重的问题,程序无法执行
5. critical 一个严重的错误,指示程序本身可能无法继续执行
二、 loggin的默认显示等级
logging 是一个单列模式,如果在日志显示之后再去配置显示等级,则无作用。
只能在日志显示之前配置。
logging.basicConfig(level=logging.ERROR)
使用这个配置等级,包含这个等级与比等级高的日志
# logging 的配置只能在最开始配置
logging.basicConfig(level=logging.ERROR)
logging.disable(logging.ERROR)
logging.debug('1.基础调试信息')
logging.disable(logging.CRITICAL)
logging.info('2.输出信息')
logging.warning('3.告警信息')
logging.error('4.程序错误信息')
logging.critical('5.严重告警信息')
logging.basicConfig(level=logging.ERROR)
# 在此处配置无效,还是从3开始显示 。因为是单列模式
logging.debug('11.基础调试信息')
logging.info('22.输出信息')
logging.warning('33.告警信息')
logging.error('44.程序错误信息')
二、日志的配置
2.1 日志的格式化配置
单独使用的时候,使用logging.basicConfig这个函数
使用logging.getloger这个对象的时候。使用 logging.Formatter来配置
basicConfig 每个文件只配置一次,且放在最前面,重复配置只有第一条起作用
具体的format配置选项在
https://docs.python.org/3/library/logging.html#formatter-objects 中的LogRecord attributes
import logging
# 注意basciConfig 只能被写一次,多次配置,不是覆盖,只会第一条生效。
# 如果第一条没配置就使用默认的,在日志显示之后再配置无效,因为是单列模式
# 1. 修改显示格式
# logging.basicConfig(format='%(levelname)s:%(message)s', level=logging.DEBUG)
# 2.添加时间
# logging.basicConfig(format='%(asctime)s:%(levelname)s:%(message)s',level=logging.DEBUG)
# 3. 添加文件,行号
# logging.basicConfig(level=logging.DEBUG, format='%(lineno)d - %(filename)s - %(asctime)s - %(name)s - %(levelname)s - %(message)s')
# 4. 组合比较多
logging.basicConfig(level=logging.DEBUG,
format='%(lineno)d - %(filename)s - %(asctime)s - %(name)s - %(levelname)s - %(message)s')
de8ug = 'de8ug'
logging.warning('%s python', de8ug)
logging.debug('这一行跟着格式走')
logging.info('这行也是')
logging.warning('来吧')
logging.debug('看下多复杂')
2.2 封装成函数多次使用
import logging import os import sys BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) """ 工程使用需求: 1-不同日志名称 2-打印同时在控制台,也有文件 3-灵活控制等级 """ # 日志的控制开关,关闭最高级别的日志,就是关闭所有的 # logging.disable(logging.CRITICAL) def lh_log(logger_name='LH-LOG', log_file='lh-log.log', level=logging.DEBUG): log_file = os.path.join(BASE_DIR, 'log', log_file) # 创建 logger对象 logger = logging.getLogger(logger_name)
if logger.hasHandlers(): # 如果已经存在hander就直接返回,在一个模块中重复引用,会造成重复答应
return logger
logger.setLevel(level) # 添加等级 # 创建控制台 console handler ch = logging.StreamHandler() ch.setLevel(level) # 创建文件 handler fh = logging.FileHandler(filename=log_file, encoding='utf-8') # 创建 formatter formatter = logging.Formatter('%(asctime)s %(filename)s [line:%(lineno)d] %(name)s %(levelname)s %(message)s') # 添加 formatter ch.setFormatter(formatter) fh.setFormatter(formatter) # 把 ch, fh 添加到 logger logger.addHandler(ch) logger.addHandler(fh) return logger def main(): # 测试 logger = lh_log() logger.debug('debug message') logger.info('info message') logger.warning('warn message') logger.error('error message') logger.critical('critical message') if __name__ == '__main__': main()