logging 专门用于记录日志的模块,相对于print来讲,logging 提供了日志信息的分级、格式化、过滤等功能。在程序中定义丰富有条理的log信息,能够方便分析程序的运行状态,在发生问题是可有效定位和分析问题。函数
logging的几个部分:spa
1. Logger:进行日志记录时建立的对象,调用它的方法传入日志模板和信息 来生成日志记录logRecord线程
2. Handler:用来处理日志记录的类,指定输入日志位置和存储形式等debug
3. Formatter:指定日志的输出格式,返回字符串给 Handler 处理调试
4. Filter:经过级别或者关键字等过滤日志日志
5. Parent Handler: Handler 之间存在层级关系,使不一样的 Handler 间可共享相同功能的代码code
用法:orm
1:默认 Logger 和 basicConfig 格式输出对象
import logging import time # 返回一个默认的root Logger,默认level=warning,打印内容为每一个级别的信息
logger = logging.getLogger() # 格式化输出log信息,返回的是日志字符串,传回给 Handler 来处理。
logging.basicConfig( # 指定log级别:CRITICAL > ERROR > WARNING > INFO > DEBUG > NOTSET
# FATAL:致命错误;CRITICAL:内存磁盘空间耗尽等;ERROR:IO操做失败或链接有问题;WARNING:警告不是错误;INFO:处理请求或平常状态变化;DEBUG:调试信息中间状态等
level= logging.ERROR, # 指定保存log信息的文件名称
filename="logging.txt", # 设置文件的读写方式
# r 只读、w 建立覆盖写入、a 建立追加写入、
# rb 二进制格式打开只读、wb 二进制建立覆盖写入、ab 二进制建立追加写入、
# r+ 打开读写、w+ 建立覆盖读写、a+ 建立追加读写
# rb+ 二进制格式打开读写、wb+ 二进制建立覆盖读写;ab+ 二进制追加读写
filemode="w", # 格式化输出
format=" 日志时间:%(asctime)s \n"
" 日志级别数值:%(levelno)s \n"
" 日志级别名称:%(levelname)s \n"
" 打印日志信息:%(message)s \n"
" 当前执行程序的路径:%(pathname)s \n"
" 当前执行程序名:%(filename)s \n"
" 当前模块名:%(name)s \n"
" 当前执行函数:%(funcName)s \n"
" 日志的当前行号:%(lineno)s \n"
" 线程ID:%(thread)d \n"
" 线程名称:%(threadName)s \n"
" 进程ID:%(process)d \n"
"----------------------------------", # 设置 asctime 的输出格式
datefmt= time.strftime("%Y-%m-%d %X") ) logger.info("info message") logger.debug("debug message") logger.warning("warning message") logger.error("error message") logging.critical("critical error message") """ 运行结果:打印log到logging.txt文件中 日志时间:2019-03-19 16:23:10 日志级别数值:40 日志级别名称:ERROR 打印日志信息:error message 当前执行程序的路径:/Users/soumoemoe/Documents/pyAutoTest/log.py 当前执行程序名:log.py 当前模块名:root 当前执行函数:<module> 日志的当前行号:40 线程ID:140735671509888 线程名称:MainThread 进程ID:42144 ---------------------------------- 日志时间:2019-03-19 16:23:10 日志级别数值:50 日志级别名称:CRITICAL 打印日志信息:critical error message 当前执行程序的路径:/Users/soumoemoe/Documents/pyAutoTest/log.py 当前执行程序名:log.py 当前模块名:root 当前执行函数:<module> 日志的当前行号:41 线程ID:140735671509888 线程名称:MainThread 进程ID:42144 ---------------------------------- """
2:Logger、Handler、Formatter、addHandlerblog
import logging import sys # 声明 logger
logger = logging.getLogger(__name__) # 指定log级别
logger.setLevel(logging.DEBUG) # FileHandler log日志格式化输出到文件中
fileHandler = logging.FileHandler("logging.txt") formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s") fileHandler.setFormatter(formatter) logger.addHandler(fileHandler) # StreamHandler sys.stderr,sys.stdout 输出到控制台
streamHandler = logging.StreamHandler(sys.stderr) streamHandler.setLevel(level=logging.DEBUG) logger.addHandler(streamHandler) logger.info("This is a log info") logger.debug("Debugging") logger.warning("Warning exists") logger.error("Error Message") logger.critical("Critical message")
3:Parent Handler,logger配置服用,如下childlog.py复用了log.py文件中Logger的配置,注意两个文件中 getLogger的参数
#log.py
import logging import sys import childlog logger = logging.getLogger("log") logger.setLevel(logging.DEBUG) streamHandler = logging.StreamHandler(sys.stderr) streamHandler.setLevel(level=logging.DEBUG) formatter = logging.Formatter("%(asctime)s - %(filename)s - %(levelname)s - %(message)s") streamHandler.setFormatter(formatter) logger.addHandler(streamHandler) logger.info("Log Info") logger.debug("Log Debug") logger.warning("Log Warning") logger.error("Log Error") logger.critical("Log Critical") childlog.run()
# childlog.py
import logging logger = logging.getLogger("log.childlog") def run(): logger.info("Child Info") logger.debug("Child Debug") logger.error("Child Error")
运行log.py 结果为:
2019-03-19 17:10:13,951 - log.py - INFO - Log Info 2019-03-19 17:10:13,951 - log.py - DEBUG - Log Debug 2019-03-19 17:10:13,951 - log.py - WARNING - Log Warning 2019-03-19 17:10:13,951 - log.py - ERROR - Log Error 2019-03-19 17:10:13,951 - log.py - CRITICAL - Log Critical 2019-03-19 17:10:13,951 - childlog.py - INFO - Child Info 2019-03-19 17:10:13,951 - childlog.py - DEBUG - Child Debug 2019-03-19 17:10:13,951 - childlog.py - ERROR - Child Error
4:异常捕获,打印Traceback信息:或者用exception打印
list = [1,2] try: for i in range(3): print(list[i]) except Exception: logger.error("访问列表出错") """ 运行结果: 2019-03-19 17:16:42,608 - log.py - ERROR - 访问列表出错 1 2 """
#----------------------------------------------------------------- # 设置 exc_info = True,会输出完整的Traceback信息
list = [1,2] try: for i in range(3): print(list[i]) except Exception: logger.error("访问列表出错", exc_info = True)
#logger.exception("访问列表出错") """ 运行结果: 2019-03-19 17:18:37,204 - log.py - ERROR - 访问列表出错 Traceback (most recent call last): File "/Users/soumoemoe/Documents/pyAutoTest/log.py", line 68, in <module> print(list[i]) IndexError: list index out of range 1 2 """
5:Filter 经过Logger名称过滤log
import logging import sys logger = logging.getLogger("log") streamHandler = logging.StreamHandler(sys.stderr) streamHandler.setLevel(level=logging.DEBUG) formatter = logging.Formatter("%(asctime)s - %(filename)s - %(levelname)s - %(message)s") streamHandler.setFormatter(formatter) logger.addHandler(streamHandler) filter = logging.Filter(name = "log.a") streamHandler.addFilter(filter) logging.getLogger("log.a").warning("log.a") logging.getLogger("log.b").warning("log.b") #log.b没有输出
""" 运行结果: 2019-03-19 17:33:39,979 - log.py - WARNING - log.a """