# -*- coding:utf-8 -*-
'''
Python中自带的logging 模块提供了日志功能,它将logger 的level 分为5 个级别
DEBUG 详细的信息,在追踪问题的时候使用
INFO 正常的信息
WARNING 一些不可预见的问题发生,或者将要发生,如磁盘空间低等,但不影响程序的运行
ERROR 由于某些严重的问题,程序中的一些功能受到影响
CRITICAL 严重的错误,或者程序本身不能够继续运行
logging lib 包含以下4 个主要对象:
1)logger。logger 是程序信息输出的接口,它分散在不同的代码中,使得程序可以在
运行的时候记录相应的信息,并根据设置的日志级别或filter 来决定哪些信息需要输出,并
将这些信息分发到其关联的handler。常用的方法有Logger.setLevel()、Logger.addHandler()、
Logger.removeHandler()、Logger.addFilter()、Logger.debug()、Logger.info()、Logger.
warning()、Logger.error()、etLogger() 等。
2)Handler。Handler 用来处理信息的输出,可以将信息输出到控制台、文件或者网络。
可以通过Logger.addHandler() 来给logger 对象添加handler,常用的handler 有StreamHandler
和FileHandler 类。StreamHandler 发送错误信息到流,而FileHandler 类用于向文件输出日志
信息,这两个handler 定义在logging 的核心模块中。其他的handler 定义在logging.handles
模块中,如HTTPHandler、SocketHandler。
3)Formatter。决定log 信息的格式,格式使用类似于%(< dictionary key >)s 的形式来
定义,如'%(asctime)s - %(levelname)s - %(message)s',支持的key 可以在Python 自带的文档
LogRecord attributes 中查看。
4)Filter。用来决定哪些信息需要输出。可以被handler 和logger 使用,支持层次关系,
比如,如果设置了filter 名称为A.B 的logger,则该logger 和其子logger 的信息会被输出,
如A.B、A.B.C.
logging.basicConfig([**kwargs]) 提供对日志系统的基本配置,默认使用StreamHandler 和
Formatter 并添加到root logger,该方法自Python2.4 开始可以接受字典参数,参数如下:
filename 指定FileHandler 的文件名,而不是默认的StreamHandler
filemode 打开文件的模式,同open 函数中的同名参数,默认为’a’
format 输出格式字符串
datefmt 日期格式
level 设置根logger 的日志级别
stream 指定StreamHandler。这个参数若与filename 冲突,忽略stream
'''
import traceback
import sys
import logging
gList = ['a','b','c','d','e','f','g']
logging.basicConfig( # 配置日志的输出方式及格式
level=logging.DEBUG,
filename='C:\log.txt',
filemode='a',
format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',
)
def f():
gList[5]
logging.info('[INFO]:calling method g() in f()')# 记录正常的信息
return g()
def g():
logging.info('[INFO]:calling method h() in g()')
return h()
def h():
logging.info('[INFO]:Delete element in gList in h()')
del gList[2]
logging.info('[INFO]:calling method i() in h()')
return i()
def i():
logging.info('[INFO]:Append element i to gList in i()')
gList.append('i')
print gList[7]
if __name__ == '__main__':
logging.debug('Information during calling f():')
try:
f()
except IndexError as ex:
print "Sorry,Exception occured,you accessed an element out of range"
traceback.print_exc()
ty,tv,tb = sys.exc_info()
logging.error("[ERROR]:Sorry,Exception occured,you accessed an
element out of range")# 记录异常错误信息
logging.critical('object info:%s' %ex)
logging.critical('Error Type:{0},Error Information:{1}'.format(ty, tv))
# 记录异常的类型和对应的值
logging.critical(''.join(traceback.format_tb(tb)))# 记录具体的trace 信息
sys.exit(1)