zoukankan      html  css  js  c++  java
  • 建议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)
            

     

  • 相关阅读:
    Linux iptables 配置规则
    Java之品优购课程讲义_day06(7)
    TCP的三次握手与四次挥手
    区块链挖矿演变史,一键挖矿逐渐成主流
    Java KeyStore 用命令生成keystore文件
    SpringBoot | 第六章:常用注解介绍及简单使用
    PHP开发模式之-单例模式
    Ansible笔记
    CentOS7中搭建cobbler自动装机服务
    号称“新至强,可拓展,赢当下”的Xeon可拓展处理器有多逆天?
  • 原文地址:https://www.cnblogs.com/tychyg/p/4935960.html
Copyright © 2011-2022 走看看