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

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

本文转自:https://blog.csdn.net/yypsober/article/details/51800120

一、StreamHandler

流handler——包含在logging模块中的三个handler之一。
能够将日志信息输出到sys.stdout, sys.stderr 或者类文件对象(更确切点,就是能够支持write()和flush()方法的对象)。
只有一个参数:
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是备份数目,也就是最多能有多少个备份。当当前的日志文件大小超过设定的maxBytes时会将当前的日志文件名例a.log后面加上.1的后缀,如a.log.1,并新建一个a.log文件来记录日志信息。
栗子
在这里插入图片描述

import datetime
import logging
from logging.handlers import RotatingFileHandler

log_path = "./res/a.log"
logger = logging.getLogger("a")
logger.setLevel(logging.DEBUG)
# 输出到文件
# fh = logging.FileHandler("./res/a.log", encoding='utf8')
fh = RotatingFileHandler(log_path, maxBytes=200000, backupCount=7, encoding="utf-8")
'''
RotatingFileHandler函数参数说明:
log_path     日志路径,程序可自动创建
maxBytess    单个日志文件的大小
backupCount  最多保留几个日志文件
encoding     指定日志文件的编码格式
'''
fh.setLevel(logging.INFO)
# 设置日志格式
fomatter = logging.Formatter('%(asctime)s\t%(module)s\t%(message)s', '%Y-%m-%d %H:%M:%S')
fh.setFormatter(fomatter)
logger.addHandler(fh)


def main():
    for i in range(10):
        logger.info("this is a test!")


if __name__ == "__main__":
    t1 = datetime.datetime.now()
    print(t1)
    main()
    tt = datetime.datetime.now()
    cost_time = tt - t1
    print(t1, tt, cost_time)
    logger.info('run_time:%s' % cost_time)

六、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
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大致介绍就是这样。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值