python 中logging模块的使用方法
目录
简单介绍:
logging模块是Python内置的标准模块,主要用于输出运行日志,可以设置输出日志的等级、日志保存路径、日志文件回滚等;相比print,具备如下优点:
- 可以通过设置不同的日志等级,在release版本中只输出重要信息,而不必显示大量的调试信息;
- print将所有信息都输出到标准输出中,严重影响开发者从标准输出中查看其它数据;logging则可以由开发者决定将信息输出到什么地方,以及怎么输出;
2 使用方法介绍:
1.日志级别
[code]import logging # 引入logging模块 logging.debug("1") logging.info("2") logging.warning("3") logging.error("4") logging.critical("5")
输出:
[code]WARNING:root:3 ERROR:root:4 CRITICAL:root:5
上面可以看到只有后面三个能打印出来
默认生成的root logger的level是logging.WARNING,低于该级别的就不输出了
级别排序:CRITICAL > ERROR > WARNING > INFO > DEBUG
debug : 打印全部的日志,详细的信息,通常只出现在诊断问题上
info : 打印info,warning,error,critical级别的日志,确认一切按预期运行
warning : 打印warning,error,critical级别的日志,一个迹象表明,一些意想不到的事情发生了,或表明一些问题在不久的将来(例如。磁盘空间低”),这个软件还能按预期工作
error : 打印error,critical级别的日志,更严重的问题,软件没能执行一些功能
critical : 打印critical级别,一个严重的错误,这表明程序本身可能无法继续运行
这时候,如果需要显示低于WARNING级别的内容,可以引入NOTSET级别来显示,或者设置较低的权限即可:
[code]#logging.basicConfig(level=logging.NOTSET) #二者选其一 logging.basicConfig(level=logging.DEBUG)
输出:
[code]DEBUG:root:1 INFO:root:2 WARNING:root:3 ERROR:root:4 CRITICAL:root:5
2.部分名词解释
Logging.Formatter:这个类配置了日志的格式,在里面自定义设置日期和时间,输出日志的时候将会按照设置的格式显示内容。
Logging.Logger:Logger是Logging模块的主体,进行以下三项工作:
- 为程序提供记录日志的接口
- 判断日志所处级别,并判断是否要过滤
- 根据其日志级别将该条日志分发给不同handler
常用函数有:
Logger.setLevel() 设置日志级别
Logger.addHandler() 和 Logger.removeHandler() 添加和删除一个Handler
Logger.addFilter() 添加一个Filter,过滤作用
Logging.Handler:Handler基于日志级别对日志进行分发,如设置为WARNING级别的Handler只会处理WARNING及以上级别的日志。常用函数有:
setLevel() 设置级别
setFormatter() 设置Formatter
3.创建控制台 及 文件 日志输出
[code]import logging # 1、创建一个logger logger = logging.getLogger('mylogger') logger.setLevel(logging.DEBUG) # 2、创建一个handler,用于写入日志文件 fh = logging.FileHandler('test.log') fh.setLevel(logging.DEBUG) # 再创建一个handler,用于输出到控制台 ch = logging.StreamHandler() ch.setLevel(logging.ERROR) # 3、定义handler的输出格式(formatter) formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') # 4、给handler添加formatter fh.setFormatter(formatter) ch.setFormatter(formatter) # 5、给logger添加handler logger.addHandler(fh) logger.addHandler(ch) logger.debug("1") logger.info("2") logger.warning("3") logger.error("4") logger.critical("5")
控制台输出为:
日志文件输出记录:
[code]2018-08-22 11:17:23,943 - mylogger - DEBUG - 1 2018-08-22 11:17:23,943 - mylogger - INFO - 2 2018-08-22 11:17:23,943 - mylogger - WARNING - 3 2018-08-22 11:17:23,943 - mylogger - ERROR - 4 2018-08-22 11:17:23,944 - mylogger - CRITICAL - 5
format 常用格式说明:
%(levelno)s: 打印日志级别的数值 %(levelname)s: 打印日志级别名称 %(pathname)s: 打印当前执行程序的路径,其实就是sys.argv[0] %(filename)s: 打印当前执行程序名 %(funcName)s: 打印日志的当前函数 %(lineno)d: 打印日志的当前行号 %(asctime)s: 打印日志的时间 %(thread)d: 打印线程ID %(threadName)s: 打印线程名称 %(process)d: 打印进程ID %(message)s: 打印日志信息
4. 记录异常 traceback
与上面代码差不多
[code]import logging # 1、创建一个logger logger = logging.getLogger('mylogger') logger.setLevel(logging.DEBUG) # 2、创建一个handler,用于写入日志文件 fh = logging.FileHandler('test.log') fh.setLevel(logging.DEBUG) # 再创建一个handler,用于输出到控制台 ch = logging.StreamHandler() ch.setLevel(logging.ERROR) # 3、定义handler的输出格式(formatter) formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') # 4、给handler添加formatter fh.setFormatter(formatter) ch.setFormatter(formatter) # 5、给logger添加handler logger.addHandler(fh) logger.addHandler(ch) try: open('luanluan.txt') except(SystemExit, KeyboardInterrupt): raise except FileNotFoundError as e: logger.error('Failed to open file', exc_info=True)
输出为:
当: exc_info=False时,输出:
5.日志滚动和过期删除 按时间
[code]import logging import time from logging.handlers import TimedRotatingFileHandler def backroll(): #日志打印格式 log_fmt = '%(asctime)s\tFile \"%(filename)s\",line %(lineno)s\t%(levelname)s: %(message)s' formatter = logging.Formatter 20000 (log_fmt) #创建TimedRotatingFileHandler对象 log_file_handler = TimedRotatingFileHandler(filename="ds_update", when="S", interval=5, backupCount=5) #注意日志名称、时间的设置 log_file_handler.suffix = "%Y-%m-%d_%H-%M-%S.log" log_file_handler.setFormatter(formatter) logging.basicConfig(level=logging.INFO) log = logging.getLogger() log.addHandler(log_file_handler) #循环打印日志 log_content = "test log" count = 0 while count < 30: log.error(log_content+str(count)) time.sleep(1) count = count + 1 log.removeHandler(log_file_handler)
输出的文件名称:
filename:日志文件名的prefix;
when:是一个字符串,用于描述滚动周期的基本单位,字符串的值及意义如下:
“S”: Seconds
“M”: Minutes
“H”: Hours
“D”: Days
“W”: Week day (0=Monday)
“midnight”: Roll over at midnight
interval: 滚动周期,单位有when指定,比如:when=’D’,interval=1,表示每天产生一个日志文件
backupCount: 表示日志文件的保留个数
参考:
https://www.cnblogs.com/CJOKER/p/8295272.html
阅读更多- python 的日志logging模块使用方法
- python标准日志模块logging的使用方法
- python标准日志模块logging的使用方法
- (转)python标准日志模块logging的使用方法
- Python使用logging模块实现打印log到指定文件的方法
- python标准日志模块logging的使用方法
- python中使用sys模板和logging模块获取行号和函数名的方法
- python标准日志模块logging的使用方法
- 解读python logging模块的使用方法
- 详解使用python的logging模块在stdout输出的两种方法
- python中使用sys模板和logging模块获取行号和函数名的方法
- python中使用sys模板和logging模块获取行号和函数名的方法
- Python日志(logging)模块使用方法简介
- logging in python: logging模块的简单使用
- 在python中使用cx_Oracle模块出现“DLL Load failed”的处理方法
- Python使用cx_Oracle模块将oracle中数据导出到csv文件的方法
- python logging 模块完整使用示例
- python —— 使用logging模块简单实现日志系统
- python使用smtplib模块通过gmail实现邮件发送的方法
- Python中time,datetime模块的常见使用方法