Python logging模块原理解析及应用
程序员文章站
2022-03-25 11:35:42
一、logging日志模块等级常见log级别从高到低:critical 》error 》warning 》info 》debug,默认等级为warning,即>=warning级别的log才输出...
一、logging日志模块等级
常见log级别从高到低:
critical 》error 》warning 》info 》debug,默认等级为warning,即>=warning级别的log才输出。
日志等级(level) | 描述 |
critical | 当发生严重错误,导致应用程序不能继续运行时记录的信息 |
error | 由于一个更严重的问题导致某些功能不能正常运行时记录的信息 |
warning | 当某些不期望的事情发生时记录的信息(如,磁盘可用空间较低),但是此时应用程序还是正常运行的 |
info | 信息详细程度仅次于debug,通常只记录关键节点信息,用于确认一切都是按照我们预期的那样进行工作 |
debug | 最详细的日志信息,典型应用场景是 问题诊断 |
二、logging模块的使用方式介绍
logging模块提供了两种记录日志的方式:
- 第一种方式是使用logging提供的模块级别的函数
- 第二种方式是使用logging日志系统的四大组件
其实,logging所提供的模块级别的日志记录函数也是对logging日志系统相关类的封装而已。
(1)logging模块定义的模块级别的常用函数
函数 | 说明 |
---|---|
logging.debug(msg, *args, **kwargs) | 创建一条严重级别为debug的日志记录 |
logging.info(msg, *args, **kwargs) | 创建一条严重级别为info的日志记录 |
logging.warning(msg, *args, **kwargs) | 创建一条严重级别为warning的日志记录 |
logging.error(msg, *args, **kwargs) | 创建一条严重级别为error的日志记录 |
logging.critical(msg, *args, **kwargs) | 创建一条严重级别为critical的日志记录 |
logging.log(level, *args, **kwargs) | 创建一条严重级别为level的日志记录 |
logging.basicconfig(**kwargs) | 对root logger进行一次性配置 |
其中logging.basicconfig(**kwargs)函数用于指定“要记录的日志级别”、“日志格式”、“日志输出位置”、“日志文件的打开模式”等信息,其他几个都是用于记录各个级别日志的函数。
(2)logging模块的四大组件
组件 | 说明 |
---|---|
loggers | 提供应用程序代码直接使用的接口 |
handlers | 用于将日志记录发送到指定的目的位置 |
filters | 提供更细粒度的日志过滤功能,用于决定哪些日志记录将会被输出(其它的日志记录将会被忽略) |
formatters | 用于控制日志信息的最终输出格式 |
三、自定义logger模块类
# testlog1.py import logging import time class logger(): def __init__(self, logger, level=logging.debug): ''' : 自定义logger模块类 : logger: logger名 : level: 日志级别 ''' # 创建一个logger self.logger = logging.getlogger(logger) self.logger.setlevel(level) # 定义handler的输出格式 curr_time = time.strftime("%y-%m-%d") self.logfilename = 'log' + curr_time + '.txt' fmt = logging.formatter('%(asctime)s - %(filename)s:[%(lineno)s] - [%(levelname)s] - %(message)s') # asctime: 日志事件发生的时间 # filename: 源文件的名称部分,包含文件后缀 # lineno: 调用日志记录函数的源代码所在的行号 # evelname: 该日志记录的文字形式的日志级别 # message: 日志记录的文本内容 # 创建一个handler, 用于写入日志文件 fh = logging.filehandler(self.logfilename) fh.setlevel(logging.debug) fh.setformatter(fmt) # 再创建一个handler,用于输出到控制台 ch = logging.streamhandler() ch.setlevel(logging.debug) ch.setformatter(fmt) # 给logger添加handler self.logger.addhandler(fh) self.logger.addhandler(ch) # level优先级 # logger.setlevel > handler.setlevel > logging.basicconfig if __name__ == "__main__": log = logger(__name__, level=logging.debug) log.logger.debug('debug') log.logger.log(logging.debug, 'debug')# 执行testlog1.py,则控制台输出如下:2020-08-03 20:36:47,104 - testlog1.py:[117] - [debug] - debug2020-08-03 20:36:47,104 - testlog1.py:[118] - [debug] - debug# 日志文件记录如下:2020-08-03 20:36:15,982 - testlog1.py:[117] - [debug] - debug2020-08-03 20:36:15,982 - testlog1.py:[118] - [debug] - debug
# testlog2.py from testlog1 import logger import traceback log = logger(__name__) def func(): try: assert 1==2 except exception: log.logger.info('测试失败,输出信息如下:{}'.format(traceback.format_exc())) # traceback.format_exc() 会返回异常信息的字符串 if __name__ == "__main__": func()# 执行testlog2.py,则控制台输出如下:2020-08-03 20:43:44,907 - testlog2.py:[11] - [info] - 测试失败,输出信息如下:traceback (most recent call last): file "e:/imooc/testlog.py", line 9, in func assert 1==2assertionerror# 日志文件记录如下:2020-08-03 20:43:44,907 - testlog2.py:[11] - [info] - 测试失败,输出信息如下:traceback (most recent call last): file "e:/imooc/testlog.py", line 9, in func assert 1==2assertionerror
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。