Python2.7-logging模块

时间:2023-03-10 04:56:48
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