建议47:使用logging记录日志信息

# -*-  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)
        

 

 

posted @ 2015-11-04 14:46  开心玩数据  阅读(307)  评论(0编辑  收藏  举报