一、日志的介绍
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 loggingimport osimport sysBASE_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 loggerdef 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()