您的位置:首页 > 编程语言 > Python开发

python 中logging模块的使用方法

2018-08-22 12:37 471 查看

目录

 

1 简单介绍:

 2 使用方法介绍:

1.日志级别

2.部分名词解释

3.创建控制台 及 文件 日志输出

4. 记录异常 traceback

5.日志滚动和过期删除 按时间

 简单介绍:

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: 表示日志文件的保留个数

 

参考:

1.python中logging模块的一些简单用法

https://www.cnblogs.com/CJOKER/p/8295272.html

2.Python中的logger和handler到底是个什么鬼

https://www.geek-share.com/detail/2661159202.html

阅读更多
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: