Python 模塊之Logging(四)——常用handlers的使用

一、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是備份數目,也就是最多能有多少個備份。命名會在日誌的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)

參數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大致介紹就是這樣。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章