• Python 模块之Logging——常用handlers的使用


    一、StreamHandler

    流handler——包含在logging模块中的三个handler之一。

    能够将日志信息输出到sys.stdout, sys.stderr 或者类文件对象(更确切点,就是能够支持write()和flush()方法的对象)。

    只有一个参数:

    class logging.StreamHandler(stream=None)
    
    • 1
    • 2

    日志信息会输出到指定的stream中,如果stream为空则默认输出到sys.stderr。

    二、FileHandler

    logging模块自带的三个handler之一。继承自StreamHandler。将日志信息输出到磁盘文件上。

    构造参数:

    class logging.FileHandler(filename, mode='a', encoding=None, delay=False)
    
    • 1
    • 2

    模式默认为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)
    
    • 1
    • 2

    五、RotatingFileHandler

    位于logging.handlers支持循环日志文件。

    class logging.handlers.RotatingFileHandler(filename, mode='a', maxBytes=0, backupCount=0, encoding=None, delay=0)
    
    • 1
    • 2

    参数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)
    
    • 1
    • 2

    参数when决定了时间间隔的类型,参数interval决定了多少的时间间隔。如when=‘D’,interval=2,就是指两天的时间间隔,backupCount决定了能留几个日志文件。超过数量就会丢弃掉老的日志文件。

    when的参数决定了时间间隔的类型。两者之间的关系如下:

     'S'         |  秒
    
     'M'         |  分
    
     'H'         |  时
    
     'D'         |  天
    
     'W0'-'W6'   |  周一至周日
    
     'midnight'  |  每天的凌晨
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    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
    logging.getLogger('').addHandler(console)
    
    # Now, we can log to the root logger, or any other logger. First the root...
    #默认使用的是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 = logging.getLogger('myapp.area1')
    logger2 = logging.getLogger('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.')
    logger2.error('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) :

    log.conf 日志配置文件:

    [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=
    
    logging.config.fileConfig('conf/log.conf')
    logger = getLogging()

    获取logger方法:

    def getLogging():
        return logging.getLogger("test.subtest")

    配置logger并且调用:

    logging.config.fileConfig('conf/log.conf')
    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大致介绍就是这样。

    参考博客:http://blog.csdn.net/yypsober/article/details/51800120

  • 相关阅读:
    快速排序——中位数
    DataGridView 在下拉框添加下来事件
    VS2015 调试时 编辑并继续不可用
    用soapUI测试webservice
    SQL Server 2008 表变量 临时表
    mvc 返回值
    asp.net 页面上的点击事件
    C# SQL 面试题自我总结
    cf contest 1458
    【CFR#655】F Omkar ans Modes
  • 原文地址:https://www.cnblogs.com/1204guo/p/8259281.html
Copyright © 2020-2023  润新知