Logging System
使用户 在需要记录debugging notes、一般信息、warnings、errors等 的方法上 创建一个或多个logger对象;不同的logging 'levels’可以用来区分重要和非重要的信息;
存在不同的逻辑日志流,使得:1.不用四处传递日志对象引用;2. 在运行过程中系统is configurable,允许在不影响运行程序的前提下调整日志记录的类型和级别;
不同级别由低到高:DEBUG、INFO、WARN、ERROR(exception抛出)、CRITICAL
举例:如何产生简单的logging output on stderr
#mymodule.py
import logging
#表示用logging对当前文件的执行进行记录
log = logging.getLogger('Mymodule')
def doIt():
#在程序运行过程总记录debug类型,记录为:DEBUG:MyModule: Doin' stuff...
log.debug("Doin' stuff...")
#do stuff...
#手动抛出异常 类型 TypeError 具体信息“...”
raise TypeError,'Bogus type erroe for testing'
#myapp.py
import mymodule,logging
#使用基本格式记录信息 basicConfig
logging.basicConfig()
#表示记录的是MyApp文件的信息
log=logging.getLogger('MyApp')
#记录Info类型: INFO:MyApp: Starting my app
log.info("Starting my app")
try:
mymodule.doIt()
#将mymodule.doIt中抛出的异常作为 e
except Exception as e:
#记录exception:ERROR:MyApp: There was a problem. 回溯到MyModule文件中error发生的位置
log.exception("There was a problem.")
#写入信息:INFO:MyApp: Ending my app
log.info("Ending my app")
MyApp.py的log记录结果为:
INFO:MyApp: Starting my app
DEBUG:MyModule: Doin' stuff...
ERROR:MyApp: There was a problem.
Traceback (most recent call last):
File "myapp.py", line 9, in ?
mymodule.doIt()
File "mymodule.py", line 7, in doIt
raise TypeError, "Bogus type error for testing"
TypeError: Bogus type error for testing
INFO:MyApp: Ending my app
MyApp.py在spyder中的实际运行结果为: 且之后的程序仍能正常运行
输入一个数:a
ERROR:MyApp:There was a problem.
Traceback (most recent call last):
File "C:\Users\10700\.spyder-py3\temp.py", line 28, in <module>
raise ValueError("a 必须是数字")
ValueError: a 必须是数字
相关函数说明:
# raise:实现 手动 抛出程序正常运行中产生异常的函数 具体使用:
raise #引发当前上下文中捕获的异常
raise + 异常类名称 #表示 引发执行类型的异常
raise + 异常类名称 (描述信息)# 表示 引发执行类型的异常,附带更具体的异常描述信息
#举例:
>>> raise
Traceback (most recent call last):
File "<pyshell#1>", line 1, in <module>
raise
RuntimeError: No active exception to reraise
>>> raise ZeroDivisionError
Traceback (most recent call last):
File "<pyshell#0>", line 1, in <module>
raise ZeroDivisionError
ZeroDivisionError
>>> raise ZeroDivisionError("除数不能为零")
Traceback (most recent call last):
File "<pyshell#2>", line 1, in <module>
raise ZeroDivisionError("除数不能为零")
ZeroDivisionError: 除数不能为零
#直接使用raise抛出异常会导致程序崩溃,无法运行下去,因此常将raise和try except异常处理结构连用来捕获并进行处理
try:
a = input("输入一个数:")
#判断用户输入的是否为数字
if(not a.isdigit()):
raise ValueError("a 必须是数字")
d=3
except ValueError as e:
print("引发异常:",repr(e))
c=5
#这一段程序运行的输出是 c=5 没有d的值;在try中执行“raise”,即手动抛出异常后,try的执行终止,转而执行except代替try后面的语句;
#except代替raise抛出异常,后面的语句正常执行
#参考:http://c.biancheng.net/view/2360.html
Summary:Logging的作用在于记录,重点是记录异常
[参考:https://peps.python.org/pep-0282/]