python中Handler⽤法实例化分析
⼀、StreamHandler
流handler——包含在logging模块中的三个handler之⼀。
能够将⽇志信息输出到sys.stdout, sys.stderr 或者类⽂件对象(更确切点,就是能够⽀持write()和flush()⽅法的对象)。
represent的用法只有⼀个参数:
class logging.StreamHandler(stream=None)
⽇志信息会输出到指定的stream中,如果stream为空则默认输出到sys.stderr。
⼆、FileHandler
logging模块⾃带的三个handler之⼀。继承⾃StreamHandler。将⽇志信息输出到磁盘⽂件上。
构造参数:
class logging.FileHandler(filename, mode='a', encoding=None, delay=False)
模式默认为append,delay为true时,⽂件直到emit⽅法被执⾏才会打开。默认情况下,⽇志⽂件可以⽆限增⼤。
三、NullHandler
空操作handler,logging模块⾃带的三个handler之⼀。
没有参数。
四、WatchedFileHandler
位于logging.handlers模块中。⽤于监视⽂件的状态,如果⽂件被改变了,那么就关闭当前流,重新打开⽂件,创建⼀个新的流。由于newsyslog或者logrotate的使⽤会导致⽂件改变。这个handler是专门为linux/unix系统设计的,因为在windows系统下,正在被打开的⽂件是不会被改变的。
参数和FileHandler相同:
class logging.handlers.WatchedFileHandler(filename, mode='a', encoding=None, delay=False)
五、RotatingFileHandler
位于logging.handlers⽀持循环⽇志⽂件。
class logging.handlers.RotatingFileHandler(filename, mode='a', maxBytes=0, backupCount=0, encoding=None, delay=0)
参数maxBytes和backupCount允许⽇志⽂件在达到maxBytes时rollover.当⽂件⼤⼩达到或者超过maxBytes时,就会新创建⼀个⽇志⽂件。上述的这两个参数任⼀⼀个为0时,rollover都不会发⽣。也就是就⽂件没有maxBytes限制。backupcount是备份数⽬,也就是最多能有多少个备份。命名会在⽇志的base_name后⾯加上.0-.n的后缀,如example.log.1,example.log.1,…,example.log.10。当前使⽤的⽇志⽂件为base_name.log。
六、TimedRotatingFileHandler
定时循环⽇志handler,位于logging.handlers,⽀持定时⽣成新⽇志⽂件。
class logging.handlers.TimedRotatingFileHandler(filename, when='h', interval=1, backupCount=0, encoding=None, delay=False, utc=False)
参数when决定了时间间隔的类型,参数interval决定了多少的时间间隔。如when=‘D’,interval=2,就是指两天的时间间隔,backupCount决定了能留⼏个⽇志⽂件。超过数量就会丢弃掉⽼的⽇志⽂件。
when的参数决定了时间间隔的类型。两者之间的关系如下:
'S'        |  秒
'M'        |  分
'H'        |  时
'D'        |  天
'W0'-'W6'  |  周⼀⾄周⽇
'midnight'  |  每天的凌晨
utc参数表⽰UTC时间。
七、其他handler——SocketHandler、DatagramHandler、SysLogHandler、NtEventHandler、SMTPHandler、MemoryHandler、HTTPHandler
这些handler都不怎么常⽤,所以具体介绍就请参考官⽅⽂档 其他handlers
下⾯使⽤简单的例⼦来演⽰handler的使⽤:例⼦⼀——不使⽤配置⽂件的⽅式(StreamHandler):
import logging
# set up logging to file - see previous section for more details
logging.basicConfig(level=logging.DEBUG,
format='%(asctime)s %(name)-12s %(levelname)-8s %(message)s',
datefmt='%m-%d %H:%M',
filename='/temp/myapp.log',
filemode='w')
# define a Handler which writes INFO messages or higher to the sys.stderr
#
console = logging.StreamHandler()
console.setLevel(logging.INFO)
# set a format which is simpler for console use
#设置格式
formatter = logging.Formatter('%(name)-12s: %(levelname)-8s %(message)s')
# tell the handler to use this format
#告诉handler使⽤这个格式
console.setFormatter(formatter)
# add the handler to the root logger
#为root logger添加handler
# Now, we can log to the root logger, or any other logger. First
#默认使⽤的是root logger
logging.info('Jackdaws love my big sphinx of quartz.')
# Now, define a couple of other loggers which might represent areas in your
# application:
logger1 = Logger('myapp.area1')
logger2 = Logger('myapp.area2')
logger1.debug('Quick zephyrs blow, vexing daft Jim.')
logger1.info('How quickly daft jumping zebras vex.')
logger2.warning('Jail zesty vixen who grabbed pay from quack.')
<('The five boxing wizards jump quickly.')
输出到控制台的结果:
root        : INFO    Jackdaws love my big sphinx of quartz.
myapp.area1 : INFO    How quickly daft jumping zebras vex.
myapp.area2 : WARNING  Jail zesty vixen who grabbed pay from quack.
myapp.area2 : ERROR    The five boxing wizards jump quickly.
例⼦⼆——使⽤配置⽂件的⽅式(TimedRotatingFileHandler) :
[loggers]
keys=root,test.subtest,test
[handlers]
keys=consoleHandler,fileHandler
[formatters]
keys=simpleFormatter
[logger_root]
level=INFO
handlers=consoleHandler,fileHandler
[logger_test]
level=INFO
handlers=consoleHandler,fileHandler
qualname=tornado
propagate=0
[logger_test.subtest]
level=INFO
handlers=consoleHandler,fileHandler
qualname=rocket.raccoon
propagate=0
[handler_consoleHandler] #输出到控制台的handler
class=StreamHandler
level=DEBUG
formatter=simpleFormatter
args=(sys.stdout,)
[handler_fileHandler] #输出到⽇志⽂件的handler
class=logging.handlers.TimedRotatingFileHandler
level=DEBUG
formatter=simpleFormatter
args=('rocket_raccoon_log','midnight')
[formatter_simpleFormatter]
format=[%(asctime)s-%(name)s(%(levelname)s)%(filename)s:%(lineno)d]%(message)s datefmt=
logger = getLogging()
获取logger⽅法:
def getLogging():
Logger("test.subtest")
配置logger并且调⽤:
logger = getLogging()
logger.info("this is an example!")
控制台和⽇志⽂件中都会输出:
[2016-07-01 09:22:06,470-test.subtest(INFO)main.py:55]this is an example! Python 模块中的logging模块的handlers⼤致介绍就是这样。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。