码迷,mamicode.com
首页 > 编程语言 > 详细

Python(2.7.6) 标准日志模块 - Logging Handler

时间:2015-03-11 23:12:40      阅读:298      评论:0      收藏:0      [点我收藏+]

标签:

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 的用法示例待补充。

 

Python(2.7.6) 标准日志模块 - Logging Handler

标签:

原文地址:http://www.cnblogs.com/huey/p/4330981.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!