版权声明: https://blog.csdn.net/Geroge_lmx/article/details/83900510
logging模块是Python内置的标准模块,主要用于输出运行日志,可以设置输出日志的等级、日志保存路径、日志文件回滚等;相比print,具备如下优点:
- 可以通过设置不同的日志等级,在release版本中只输出重要信息,而不必显示大量的调试信息;
- print将所有信息都输出到标准输出中,严重影响开发者从标准输出中查看其它数据;logging则可以由开发者决定将信息输出到什么地方,以及怎么输出。
一.logging模块的日志级别
日志等级(level) | 描述 |
---|---|
DEBUG | 最详细的日志信息,典型应用场景是问题诊断 |
INFO | 记录关键节点信息,用于确认一切都是按照我们预期的那样进行工作 |
WARNING | 当某些不期望的事情发生时记录的信息(如,磁盘可用空间较低),但是此时应用程序还是正常运行的 |
ERROR | 由于一个更严重的问题导致某些功能不能正常运行时记录的信息 |
CRITICAL | 当发生严重错误,导致应用程序不能继续运行时记录的信息 |
【1】上面列表中的日志等级是从上到下依次升高的,即:DEBUG < INFO < WARNING < ERROR < CRITICAL,而日志的信息量是依次减少的;
【2】当为某个应用程序指定一个日志级别后,应用程序会记录所有日志级别大于或等于指定日志级别的日志信息
二.logging日志模块四大组件
组件名称 | 类名 | 功能描述 |
日志器 | Logger | 提供了应用程序可一直使用的接口 |
处理器 | Handler | 将logger创建的日志记录发送到合适的目的输出 |
过滤器 | Filter | 提供了更细粒度的控制工具来决定输出哪条日志记录,丢弃哪条日志记录 |
格式器 | Formatter | 决定日志记录的最终输出格式 |
三.logging模块的使用
3.1 基本用法
import logging
"""logging.basicConfig函数各参数:
filename:指定日志文件名;
format:指定输出的格式和内容
filemode:和file函数差不多,指定日志文件的打开格式w或者a
"""
"""format参数作用:
%(levelno)s:打印日志级别的数值
%(levelname)s:打印日志级别名称
%(name)s:logger的名称,此处设置为了__name__
%(pathname)s:打印当前执行程序的路径,其实就是sys.argv[0]
%(filename)s:打印当前执行程序名
%(funcName)s:打印日志的当前函数
%(lineno)d:打印日志的当前行号
%(asctime)s:打印日志的时间
%(threadName)s:打印线程名称
%(process)d:打印进程id
%(message)s:打印日志信息
"""
logging.basicConfig(level=logging.INFO,format='%(asctime) - %(name)s - %(levelname)s - %(message)s')
logger = logging.getLogger(__name__)
logger.info("Start pring log")
logger.debug("Do something")
3.2 使用Handler组件
import logging
def log():
#创建logger,如果参数为空则返回root logger
logger = logging.getLogger("nick")
logger.setLevel(logging.DEBUG) #设置logger日志等级
#这里进行判断,如果logger.handlers列表为空,则添加,否则,直接去写日志
if not logger.handlers:
#创建handler
fh = logging.FileHandler("test.log",encoding="utf-8")
ch = logging.StreamHandler()
#设置输出日志格式
formatter = logging.Formatter(
fmt="%(asctime)s - %(levelname)s - %(filename)s[:%(lineno)d] - %(message)s",
datefmt="%Y/%m/%d %X"
)
#为handler指定输出格式
fh.setFormatter(formatter)
ch.setFormatter(formatter)
#为logger添加的日志处理器
logger.addHandler(fh)
logger.addHandler(ch)
return logger #直接返回logger
logger = log()
logger.warning("泰拳警告")
logger.info("提示")
logger.error("错误")
logger.debug("查错")
3.3 捕获traceback
"""python中的traceback模块用于捕获异常信息,可以在logging中记录下traceback"""
import logging
def fun_set_logger(log_file, logger):
logger.setLevel(logging.DEBUG)
LOG_FORMAT = "[%(asctime)s]-[%(levelname)s] %(message)s"
DATE_FORMAT = "%Y-%m-%d %H:%M:%S"
# output log to file
logger_FileHandler = logging.FileHandler(log_file)
logger_FileHandler.setFormatter(logging.Formatter(fmt=LOG_FORMAT, datefmt=DATE_FORMAT))
logger_FileHandler.setLevel(logging.DEBUG)
logger.addHandler(logger_FileHandler)
# output log to command-line console
logger_StreamHandler = logging.StreamHandler()
logger_StreamHandler.setFormatter(logging.Formatter(fmt=LOG_FORMAT, datefmt=DATE_FORMAT))
logger_StreamHandler.setLevel(logging.INFO)
logger.addHandler(logger_StreamHandler)
if __name__ == "__main__":
logger = logging.getLogger()
fun_set_logger("log.txt", logger)
try:
open("notexist,txt","rb")
except (SystemExit,KeyboardInterrupt):
raise
except Exception:
#等价于 logger.exception(message)
logger.error("Failed to open file",exc_info=True)
参考: