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