Python2.7-logging模块

logging模块,用于记录程序的运行情况,可将需要的信息打印到控制台或是日志文件中

1、Logger对象

Logger对象从来不会被直接使用,都是通过logging.getLogger(name)这个模块级函数获得它的实例对象,每次对同一个name调用这个函数都返回同一个Logger对象的引用

实例属性:propagate(默认1,即True),如果设置为False,则日志信息不会传给父类Logger,即logging.getLogger('a.b')默认会将信息传给logging.getLogger('a'),此时如果信息等级符合父类要求,同时也符合父类handler要求,则信息会再次被输出

实例方法:

setLevel(lvl):lvl等级为(NOTEST(0)<DEBUG(10)<INFO(20)<WARNING(30)<ERROR(40)<CRITICAL(50)),小于设置等级的信息不会传给handler

getEffectiveLevel():以整数方式返回设置的等级

isEnabledFor(lvl):判断lvl是否大于等于设置的等级

getChild(suffix):获得指定的子类Logger对象,即logging.getLogger('abc').getChild('def.ghi')等同于logging.getLogger('abc.def.ghi')

debug(msg, *args, **kwargs):log一个对应等级msg,msg可以是格式化字符串,需要的参数在args中给出,kwargs只接受两种关键字,exc_info(如果设置为True,就会添加异常信息到日志中,如果提供了通过sys.exc_info()返回的异常元组,直接使用它,否则就调用sys.exc_info()来获得异常信息)

info(msg, *args, **kwargs):同上

warning(msg, *args, **kwargs):同上

error(msg, *args, **kwargs):同上

critical(msg, *args, **kwargs):同上

Logger.log(lvl, msg, *args, **kwargs):同上,lvl为以整数形式指定的等级

exception(msg, *args, **kwargs):同上,除了kwargs中的exc_info不会被检查,强制为True,即总是会输出错误信息,这个方法只应该用在异常情况的处理上

addFilter(filt):添加filter对象

removeFilter(filt):移除filter对象

filter(record):用Logger对象的filter对象对record进行检测,只要一个为False,则不将信息传至handler

addHandler(hdlr):添加handler对象

removeHandler(hdlr):移除handler对象

findCaller():返回调用此对象的文件名,行号,函数名的3元元组

handle(record):将record传给所有与此Logger对象绑定的handler对象和他的父类(除非propagate为False)

2、Handler对象

它不会被直接实例化,是别的handler的基类,子类的__init__()方法都要调用Handler.__init__()

实例方法:

__init__(level=NOTSET):设置等级

createLock():创建线程锁

acquire():获得锁

release():释放锁

setLevel(lvl):设置等级

setFormatter(form):设置日志信息格式的Formatter对象

addFilter(filt):添加filter对象

removeFilter(filt):移除filter对象

filter(record):用Logger对象的filter对象对record进行检测,只要一个为False,则不将信息传至handler

flush():确保所有信息输出

close():清理被handler占用的资源

handle(record):根据filter选择性emit信息

handleError(record):此方法应在调用emit()抛出异常时使用,似乎是一个错误类

format(record):对record格式化

emit(record):不惜一切输出record的信息

3、Formatter对象

logging.Formatter(fmt=None, datefmt=None):fmt是格式化字符串,默认'%(message)s',datefmt是时间的格式,默认ISO8601

format(record):返回格式化后的字符串,record中的时间会先调用formattime

formatTime(record, datefmt=None):格式化时间

formatException(exc_info):把错误信息格式化

4、Filter对象

可以接受自己以及自己的子类

logging.Filter(name=”)

5、LogRecord对象

此对象是会自动由Logger对象生成的,也可以通过makeLogRecord生成

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

格式化字符串的格式如下

%(name)s:Logger的名字

%(levelno)s:数字形式的日志级别

%(levelname)s:文本形式的日志级别

%(pathname)s:调用日志输出函数的模块的完整路径名,可能没有

%(filename)s:调用日志输出函数的模块的文件名

%(module)s:调用日志输出函数的模块名

%(funcName)s:调用日志输出函数的函数名

%(lineno)d:调用日志输出函数的语句所在的代码行

%(created)f:当前时间,用UNIX标准的表示时间的浮点数表示

%(relativeCreated)d:输出日志信息时的,自Logger创建以 来的毫秒数

%(asctime)s:字符串形式的当前时间。默认格式是 “2003-07-08 16:49:45,896”。逗号后面的是毫秒

%(thread)d:线程ID。可能没有

%(threadName)s:线程名。可能没有

%(process)d:进程ID。可能没有

%(message)s:用户输出的消息

一般设置格式如下:

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

或 '%(asctime)s - %(name)s - %(levelname)s - %(message)s'

6、几个内置的handler对象

logging.StreamHandler(stream=None):把信息输出到流中,sys.stdout、sys.stderr或任何的文件类对象,stream默认为sys.stderr

logging.FileHandler(filename, mode='a', encoding=None, delay=False):把信息输出到硬盘上的文件里

logging.NullHandler:什么也不做

logging.handlers.WatchedFileHandler(filename[, mode[, encoding[, delay]]]):Windows下不能用,用于监视一个文件是否有改变,如果有,就关闭并重新打开指定的文件,delay表示直到第一次调用emit后才打开文件

logging.handlers.RotatingFileHandler(filename, mode='a', maxBytes=0, backupCount=0, encoding=None, delay=0):当日志文件超过了maxBytes大小,就在文件名后加上'.1','.2',直到指定的backupCount

logging.handlers.TimedRotatingFileHandler(filename, when='h', interval=1, backupCount=0, encoding=None, delay=False, utc=False):设置间隔多久后重新创建新日志文件,when取值为's','m','h','d','w0'-'w6','midnight',不区分大小写,为星期几时interval被忽略

logging.handlers.SocketHandler(host, port):将信息发送至指定ip的端口上,有close(),emit(),handleError(),makeSocket(),makePickle(record),send(packet),createSocket()方法

logging.handlers.DatagramHandler(host, port):以UDP形式发送信息

logging.handlers.SysLogHandler(address=('localhost', SYSLOG_UDP_PORT), facility=LOG_USER, socktype=socket.SOCK_DGRAM):连接unix机器

logging.handlers.NTEventLogHandler(appname, dllname=None, logtype='Application'):

logging.handlers.SMTPHandler(mailhost, fromaddr, toaddrs, subject, credentials=None, secure=None):通过SMTP将日志以邮件方式发送

logging.handlers.BufferingHandler(capacity):将日志存在缓冲区中,当到达capacity大小时输出

logging.handlers.MemoryHandler(capacity, flushLevel=ERROR, target=None):同上

logging.handlers.HTTPHandler(host, url, method='GET'):将日志发送到网络服务器上

7、模块级别函数

logging.getLogger([name]):返回指定名字的Logger对象

logging.[debug/info/warning/error/critical/exception](msg[, *args[, **kwargs]]):创建对应等级的消息

logging.log(level, msg[, *args[, **kwargs]]):同上

logging.basicConfig([**kwargs]),参数支持如下:filename,filemode,format,datefmt,level,stream,设置root logger

8、logging.config模块

logging.config.dictConfig(config):从一个字典中获得配置信息

字典配置模式:

version - 1

formatters - 值为一个字典,每个键作为一个id,键的值为配置Formatter实例的信息

filters - 值为一个字典,每个键作为一个id,键的值为配置Filter实例的信息

handlers - 值为一个字典,每个键作为一个id,键的值为配置Handler实例的信息,配置字典会搜索 class(必须有),level,formatter,filters这4个关键字来构造handler

loggers - 值为一个字典,每个键作为一个id,键的值为配置Logger实例的信息,配置字典会搜索 level,propagate,filters,handlers这4个关键字来构造handler

root - 配置root Logger

logging.config.fileConfig(fname, defaults=None, disable_existing_loggers=True):从配置文件中获得配置信息

配置文件模式:

[loggers]

keys=root,log02,log03,log04,log05,log06,log07

[handlers]

keys=hand01,hand02,hand03,hand04,hand05,hand06,hand07,hand08,hand09

[formatters]

keys=form01,form02,form03,form04,form05,form06,form07,form08,form09

[logger_root]

level=NOTSET

handlers=hand01

[logger_parser]

level=DEBUG

handlers=hand01

propagate=1

qualname=compiler.parser

[handler_hand01]

class=StreamHandler

level=NOTSET

formatter=form01

args=(sys.stdout,)

[formatter_form01]

format=F1 %(asctime)s %(levelname)s %(message)s

datefmt=

class=logging.Formatter

logging.config.listen(port=DEFAULT_LOGGING_CONFIG_PORT):监听端口,接收配置文件,获得配置信息

logging.config.stopListening():停止监听

参考1:http://blog.csdn.net/zyz511919766/article/details/25136485/

参考2:http://www.cnblogs.com/MrFiona/p/5978898.html