13.5 logging--Python灵活的日志功能

来源:互联网 发布:淘宝货品上架 编辑:程序博客网 时间:2024/06/05 04:31

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

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  深圳


0 0
原创粉丝点击