zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    Windows JScript 在 游览器 中运行 调试 Shell 文件系统
    autohotkey 符号链接 软连接 symbolink
    软链接 硬链接 测试
    SolidWorks 修改 基准面 标准坐标系
    手机 路径 WebDAV 映射 驱动器
    Win10上手机路径
    explorer 命令行
    单位公司 网络 封锁 屏蔽 深信 AC
    cobbler自动化部署原理篇
    Docker四种网络模式
  • 原文地址:https://www.cnblogs.com/1204guo/p/8259281.html
Copyright © 2011-2022 走看看