zoukankan      html  css  js  c++  java
  • Python(2.7.6) 标准日志模块

    Python 标准日志模块使用 Handler 控制日志消息写到不同的目的地,如文件、流、邮件、socket 等。除了StreamHandler、 FileHandler 和 NullHandler 定义在 logging 模块中,其他的 Handler 均定义在  logging.hangdlers 模块中。这些 Handler 是:WatchedFileHandler、RotatingFileHandler、TimedRotatingFileHandler、SocketHandler、DatagramHandler、SysLogHandler、NTEventLogHandler、SMTPHandler、MemoryHandler、HTTPHandler。

    RotatingFileHandler 能够管理日志文件的大小,当日志文件的大小达到阈值后,它会重命名日志文件,然后再创建一个新的同名日志文件继续输出。

    import logging
    import logging.handlers
    
    
    handler = logging.handlers.RotatingFileHandler(
        filename    = 'myapp.log',
        maxBytes    = 200,
        backupCount = 5,
    )
    handler.setFormatter(
        logging.Formatter(
            fmt     = '%(asctime)s [%(threadName)s] (%(filename)s:%(lineno)d) %(levelname)s - %(message)s',
            datefmt = '%Y-%m-%d %H:%M:%S'
        )
    )
    
    root = logging.getLogger()
    root.setLevel(logging.DEBUG)
    root.addHandler(handler)
    
    for i in range(20):
        root.debug('The Message(%d/20).' %  (i + 1))

    参数 maxBytes 设定了日志文件大小的阈值,参数 backupCount 设定了备份文件的个数。当日志文件即 myapp.log 的大小达到阈值200字节的时候,RotatingFileHandler 会将 myapp.log 重命名为 myapp.log.1,然后再创建一个新的同名日志文件 myapp.log。当 myapp.log 的大小又达到200字节时,RotatingFileHandler 将会把 myapp.log.1 重命名为 myapp.log.2,再把 myapp.log 重命名为 myapp.log.1,然后再创建一个新的同名日志文件 myapp.log。这样反复直到创建了5个备份文件后,当 myapp.log 的大小再次达到200字节时,RotatingFileHandler 不会将 myapp.log.5 重命名为 myapp.log.6 而是将其删除。

    TimedRotatingFileHandler 和 RotatingFileHandler 类似,不过,TimedRotatingFileHandler 没有通过判断文件大小来决定何时重新创建日志文件,而是间隔一定时间就自动创建新的日志文件。重命名的过程中,备份日志文件的后缀不是数字,而是当前时间。

    import logging
    import logging.handlers
    import time
    
    
    handler = logging.handlers.TimedRotatingFileHandler(
        filename    = 'myapp.log',
        when        = 'M', 
        interval    = 2, 
        backupCount = 3,
    )
    handler.setFormatter(
        logging.Formatter(
            fmt     = '%(asctime)s [%(threadName)s] (%(filename)s:%(lineno)d) %(levelname)s - %(message)s',
            datefmt = '%Y-%m-%d %H:%M:%S'
        )
    )
    
    root = logging.getLogger()
    root.setLevel(logging.DEBUG)
    root.addHandler(handler)
    
    for i in range(20):
        root.debug('The Message(%d/20).' %  (i + 1))
        time.sleep(30)

    参数 interval 设定了时间间隔,参数 when 设定了间隔的单位。when 的取值可以是 'S'(秒)、 'M'(分)、 'H'(小时)、 'D'(天)、 'W0' - 'W6'(周一至周日)、 'midnight'(凌晨),当 when 的取值是 'W0' - 'W6' 或 'midnight' 时,参数 interval 的取值是被忽略的。

    SMTPHandler 能够通过 SMTP 将日志消息发送到邮件服务器中。

    import logging
    import logging.handlers
    
    handler = logging.handlers.SMTPHandler(
        mailhost    = ('smtp.163.com', 25),
        fromaddr    = 'huey@163.com',
        toaddrs     = 'test@163.com',
        subject     = 'SMTPHandler Demo',
        credentials = ('huey@163.com', '123456')
    )
    handler.setLevel(logging.CRITICAL)
    handler.setFormatter(
        logging.Formatter(
            fmt     = '%(asctime)s [%(threadName)s] (%(filename)s:%(lineno)d) %(levelname)s - %(message)s',
            datefmt = '%Y-%m-%d %H:%M:%S'
        )
    )
    
    root = logging.getLogger()
    root.addHandler(handler)
    root.critical('This is a critical message');

    其他 Handler 的用法示例待补充。

  • 相关阅读:
    J2EE13个规范--【J2EE】
    事件监听、持有对方的引用--【J2SE】
    TCP协议:服务端和客户端demo--【J2SE】
    线程:Interrupt、Sleep、Join、线程同步--【J2SE】
    1. Visual C++ 6.0 安装和使用
    无法连接虚拟设备sata0:1,因为主机上没有相应的设备
    Linux文件夹文件创建、删除
    服务器
    linux 下 apache启动、停止、重启命令
    Apache部署静态html
  • 原文地址:https://www.cnblogs.com/huey/p/4330981.html
Copyright © 2011-2022 走看看