IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    [原]13.5 logging--Python灵活的日志功能

    caimouse发表于 2016-06-29 08:36:30
    love 0

    本模块主要提供了一些函数和类来支持灵活地输出日志,实现日志系统相应的功能,可以使用到应用程序和库里。主要提供了类Logger、Handler、Filter和Formatter。

    class logging.Logger

    Logger类从来不要直接构造一个实例,它都是通过模块级别的函数logging.getLogger(name)来获取到实例,多次调用时提供一样的名称,总是返回一个实例。

    例子:

    #python 3.4

    import logging

    logging.warning('http://blog.csdn.net/caimouse')

    logging.info('no see')

     

    # create logger

    logger = logging.getLogger('simple_example')

    logger.setLevel(logging.DEBUG)

     

    # create console handler and set level to debug

    ch = logging.StreamHandler()

    ch.setLevel(logging.DEBUG)

     

    # create formatter

    formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')

     

    # add formatter to ch

    ch.setFormatter(formatter)

     

    # add ch to logger

    logger.addHandler(ch)

     

    # 'application' code

    logger.debug('debug message')

    logger.info('info message')

    logger.warn('warn message')

    logger.error('error message')

    logger.critical('critical message')

    结果输出如下:

    WARNING:root:http://blog.csdn.net/caimouse

    2016-03-15 08:47:45,694 - simple_example - DEBUG - debug message

    DEBUG:simple_example:debug message

    2016-03-15 08:47:45,709 - simple_example - INFO - info message

    INFO:simple_example:info message

    2016-03-15 08:47:45,709 - simple_example - WARNING - warn message

    WARNING:simple_example:warn message

    2016-03-15 08:47:45,709 - simple_example - ERROR - error message

    ERROR:simple_example:error message

    2016-03-15 08:47:45,709 - simple_example - CRITICAL - critical message

    CRITICAL:simple_example:critical message

     

    Logger.propagate

    如果这个标志为True,事件会向父类的处理函数传送,否则不会向上传送。

     

    Logger.setLevel(lvl)

    设置日志输出的级别,低于指定的级别的日志就会忽略不输出。

     

    Logger.isEnabledFor(lvl)

    判断此日志级别是否输出。

     

    Logger.getEffectiveLevel()

    如果本日志实例有设置日志级别,就立即返回;如果没有就找到上一级的日志级别返回。

     

    Logger.getChild(suffix)

    通过前缀来返回指定日志实例,比如logging.getLogger('abc').getChild('def.ghi')等同于logging.getLogger('abc.def.ghi')。

     

    Logger.debug(msg, *args, **kwargs)

    输出一条日志信息,级别设定为DEBUG级别。

     

    Logger.info(msg, *args, **kwargs)

    输出一条日志信息,级别设定为INFO级别。

     

    Logger.warning(msg, *args, **kwargs)

    输出一条日志信息,级别设定为WARNING级别。

     

    Logger.error(msg, *args, **kwargs)

    输出一条日志信息,级别设定为ERROR级别。

     

    Logger.critical(msg, *args, **kwargs)

    输出一条日志信息,级别设定为CRITICAL级别。

     

    Logger.log(lvl, msg, *args, **kwargs)

    以日志级别lvl输出一条日志msg。

     

    Logger.exception(msg, *args, **kwargs)

    输出一条日志信息,级别设定为ERROR级别。

     

    Logger.addFilter(filt)

    添加指定的过滤器到日志实例。

    Logger.removeFilter(filt)

    从日志实例里删除指定的过滤器。

     

    Logger.filter(record)

    应用当前实例的过滤器到这个条记录record里。

     

    Logger.addHandler(hdlr)

    添加指定的处理器hdlr到日志实例。

     

    Logger.removeHandler(hdlr)

    删除指定的处理器hdlr。

     

    Logger.findCaller(stack_info=False)

    查找调用者的源码文件名称和行号。

     

    Logger.handle(record)

    使用所有处理器来处理这条记录。

     

    Logger.makeRecord(name, lvl, fn, lno, msg, args, exc_info, func=None, extra=None, sinfo=None)

    创建一个特别的类LogRecord的实例。

     

    Logger.hasHandlers()

    检查日志实例是否有任何处理器设置。

     

    日志总共定义的级别:

    CRITICAL   50

    ERROR     40

    WARNING  30

    INFO       20

    DEBUG     10

    NOTSET     0

     

    Handler.__init__(level=NOTSET)

    根据日志级别初始化处理器,设置过滤器列表和创建一个锁来访问I/O。当派生类继承本类时,需要在构造函数里调用本函数。

     

    Handler.createLock()

    创建一个锁以便在多线程下安全使用。

     

    Handler.acquire()

    获取线程锁。

     

    Handler.release()

    释放线程锁。

     

    Handler.setLevel(lvl)

    设备处理器的日志输出的级别。

     

    Handler.setFormatter(form)

    设置处理器的格式化类Formatter。

     

    Handler.addFilter(filt)

    设置指定的过滤器。

     

    Handler.removeFilter(filt)

    删除指定的过滤器。

     

    Handler.filter(record)

    应处理器的过滤器到这条记录。

     

    Handler.flush()

    确保所有日志都已经输出。

     

    Handler.close()

    回收所有使用的资源。

     

    Handler.handle(record)

    有条件地输出指定的日志。

     

    Handler.handleError(record)

    当在函数emit()里产生异常时,调用本函数执行。

     

    Handler.format(record)

    根据格式器对记录进行格式化。

     

    Handler.emit(record)

    实际输出日志的函数,要在子类里实现此函数。

     

    class logging.Formatter(fmt=None, datefmt=None, style='%')

    日志输出的格式器构造函数。参数fmt是格式化日志的格式化字符串;参数datefmt是日期的格式化字符串;参数style是格式字符类型,可以是%,{,$三个中选择一种。

     

    format(record)

    记录的属性用来做字符串的格式化操作。

     

    formatTime(record, datefmt=None)

    本函数会在函数format()调用,使用它来格式化日志时间的格式。


    formatException(exc_info)

    格式化异常信息,转为字符串方式。

     

    formatStack(stack_info)

    格式化指定栈的信息,转为字符串方式。

     

    class logging.Filter(name='')

    创建一个过滤器,它的功能比日志级别会更加强大,比如根据匹配的模式来过滤不要输出的日志。

     

    filter(record)

    指定的记录是否需要过滤,如果不过滤返回0,如果过滤返回非0值。

     

    class logging.LogRecord(name, level, pathname, lineno, msg, args, exc_info, func=None, sinfo=None)

    创建一个包括所有信息的事件记录。参数name是输出这个记录的logger的名称;参数level是日志的级别;参数pathname是输出日志的源文件的名称;参数lineno是输出日志的代码在源文件的行号;参数msg是描述此事件的详细信息;参数args是日志描述里的格式化参数;参数exc_info是当前异常信息;参数func是那个函数或者方法调用本函数的函数名称;参数sinfo是字符串表示的栈信息。

     

    logging.getLogger(name=None)

    通过名称来获取指定的日志实例,如果没有指定就返回父类的实例。

     

    logging.getLoggerClass()

    返回标准类Logger,或者最后使用函数setLoggerClass()设置的类。

     

    logging.getLogRecordFactory()

    返回创建 LogRecord的可调用对象。

     

    logging.debug(msg, *args, **kwargs)

    以DEBUG级别输出一条日志。

     

    logging.info(msg, *args, **kwargs)

    以INFO级别输出一条日志。

     

    logging.warning(msg, *args, **kwargs)

    以WARNING级别输出一条日志。

     

    logging.error(msg, *args, **kwargs)

    以ERROR级别输出一条日志。

     

    logging.critical(msg, *args, **kwargs)

    以CRITICAL级别输出一条日志。

     

    logging.log(level, msg, *args, **kwargs)

    以level级别输出一条日志。

     

    logging.disable(lvl)

    设置那一级别的日志不再输出。

     

    logging.addLevelName(lvl, levelName)

    绑定级别lvl为指定的名称levelName。

     

    logging.getLevelName(lvl)

    返回级别lvl的名称。

     

    logging.makeLogRecord(attrdict)

    创建一个新的LogRecord实例。

     

    logging.basicConfig(**kwargs)

    对日志系统进行基本配置,主要使用默认的Formatter类来初始化StreamHandler,并添加它到根日志实例里。

     

    logging.shutdown()

    让日志系统安全关闭,先输出缓冲区里的日志,再关闭所有处理的处理器。

     

    logging.setLoggerClass(klass)

    设置日志系统使用类klass来创建日志实例。

     

    logging.setLogRecordFactory(factory)

    设置创建LogRecord对象的工厂函数。

     

    配置同时在调试窗口和文件里输出日志的配置例子:

    #python 3.4

    import logging

     

    logging.basicConfig(level=logging.DEBUG,

                    format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',

                    datefmt='%a, %d %b %Y %H:%M:%S',

                    filename='myapp.log',

                    filemode='w')

     

    ###########################################################################

    #定义一个StreamHandler,将INFO级别或更高的日志信息打印到标准错误,并将其添加到当前的日志处理对象#

    console = logging.StreamHandler()

    console.setLevel(logging.INFO)

    formatter = logging.Formatter('%(name)-12s: %(levelname)-8s %(message)s')

    console.setFormatter(formatter)

    logging.getLogger('').addHandler(console)

    ###########################################################################

     

    logging.debug('这是调试信息')

    logging.info('这是通知信息')

    logging.warning('这是警告信息')

    结果在窗口输出如下:

    root        : INFO     这是通知信息

    root        : WARNING  这是警告信息

     

    在文件里输出如下:

    Thu, 17 Mar 2016 11:44:49 arg2.py[line:19] DEBUG 这是调试信息

    Thu, 17 Mar 2016 11:44:49 arg2.py[line:20] INFO 这是通知信息

    Thu, 17 Mar 2016 11:44:49 arg2.py[line:21] WARNING 这是警告信息

     

    蔡军生 QQ:9073204  深圳




沪ICP备19023445号-2号
友情链接