1. 程式人生 > >Python 模組之Logging(四)——常用handlers的使用

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

相關推薦

Python 模組Logging——常用handlers的使用

一、StreamHandler 流handler——包含在logging模組中的三個handler之一。 能夠將日誌資訊輸出到sys.stdout, sys.stderr 或者類檔案物件(更確切點,就是能夠支援write()和flush()方法的物件)。

python學習

[1] size class dex epc uri msu 語句 這就是 繼續昨天的學習,學到了數組。 首先有兩個數組,name1和name2.我們可以將兩個數組合並 name1=[1,2,3,4] name2=[5,6,7,8] names=name1.extend(

Python學習爬蟲HTTP和HTTPS

CP 發出 net 長度 現在 消息頭 理論 LV 模型 HTTP和HTTPS HTTP協議(HyperText Transfer Protocol,超文本傳輸協議):是一種發布和接收 HTML頁面的方法。 HTTPS(Hypertext Transfer Protoc

Python基礎常用模組

模組(Module):在python中,一個.py檔案就稱之為一個模組。模組共分為三種:python標準庫、第三方模組和應用程式自定義模組 模組匯入: 1. import 語句:import module1[, module2[,... moduleN]

Python學習day5字符串常用操作命令簡介

堅持就是勝利 字符串常用操作命令簡介名字描述舉例.isdigit判斷是否是數字Name=demonlg,print name.isdigit,會打印出False,因為demonlg不是數字.inde

Python學習爬蟲正則表示式爬去名言網

auth Python標準庫 我們 color 匯總 eight code 比較 school 爬蟲的四個主要步驟 明確目標 (要知道你準備在哪個範圍或者網站去搜索) 爬 (將所有的網站的內容全部爬下來) 取 (去掉對我們沒用處的數據) 處理數據(按照我們想要的

python---基礎知識回顧模塊sys,os,random,hashlib,re,json,xml,shutil,configparser,logging,datetime,time,集合,堆,雙端隊列,其他

ID 正常 空值 字符 預測 platform OS normal 生成 前提:dir,__all__,help,__doc__,__file__ dir:可以用來查看模塊中的所有特性(函數,類,變量等) >>> import copy >>

Python自動化學習筆記——Python資料型別集合set,元組tuple、修改檔案、函式、random常用方法

1.修改檔案的兩種方式 1 #第一種 2 with open('users','a+') as fw: #用a+模式開啟檔案,使用with這種語法可以防止忘記close檔案 3 fw.seek(0) #移動檔案指標到最前面,然後才能讀到內容 4 result=fw.read()

決戰Python

前言 昨天是作業課,就是每一章學完之後會有作業需要做,所以昨天也沒學啥,主要是複習了一遍之前學的。然後今天剛把作業交上去,不知道結果怎麼樣,感覺寫的還可以。 也沒啥寫的,就寫一下寫作業時候學到的東西吧。 知識回顧 先總體回顧一下第一章的內容: 1.三大類程式語言:機器語言、組合語

Python基礎-python資料型別列表

列表 格式 namesList = [ 字串,數字,列表,元祖,集合] 列表中的元素可以是不 同類型的 列表的相關操作 列表中存放的資料是可以進行修改的,比如"增"、"刪"、"改"" <1>插入元素("增") Append(元素):在列表尾部追加一個元素 Extend&n

Python小白學習——第一次練習題

寫在前面: 今天下雪了呢!連著兩天都沒有更新學習記錄。 我沒有偷懶呢。做了一天的練習題,昨天學的內容還沒總結完,太累了就回去睡覺了 連續一週早起,強大的內心也無法支撐我疲憊的身體 今天早起做了整理。加油哦(貴在堅持,一定要好好堅持下去) 1.執行 Python 指令碼的兩種方式 (1)進入python直譯器,

Python黑帽子 黑客與滲透測試程式設計建立一個TCP代理

TCP代理不僅可以將流量從一個主機轉發給另一個主機,而且可以評估基於網路的軟體。在企業級環境下進行滲透測試時,你會經常遇到無法使用Wireshark的情況,無法再Windows系統上載入驅動嗅探本地流量,分段的網路也阻止你使用工具直接嗅探目標主機。作者經常在實際

Python基礎進階元組、字典和字符串

python基礎 tag 基礎 block 場景 分隔 應用場景 agg bsp 元組 元組的定義 Tuple(元組)與列表類似,不同之處在於元組的 元素不能修改 元組 表示多個元素組成的序列 元組 在 Python 開發中,有特定的應用場景 用

Python基礎進階元組、字典和字串

元組 元組的定義   Tuple(元組)與列表類似,不同之處在於元組的 元素不能修改     元組 表示多個元素組成的序列   元組 在 Python 開發中,有特定的應用場景   用於儲存 一串 資訊,資料 之間使用

Python成長——詞典、文字檔案的輸入輸出、模組、函式的引數傳遞

詞典 可以儲存多個元素的物件成為容器,前面提到的list和tuple都屬於容器類,這裡介紹一個新的容器:詞典。 基本概念 常見的建立詞典的基本方法: dic={'鍵':值,'鍵':值,'鍵':值...} 詞典包含兩部分,鍵和值,其中鍵一般為字串,也

我的python:列表

mage cycle 之間 信息 索引 網站 告訴 tor 提取 1、列表是什麽 列表是由一系列按照特定順序排列的元素組成,它可以創建包含字母表中的所有字母、數字0-9或所有家庭成員姓名的列表;也可以將任何東西加入列表中,其中的元素之間可以沒有任何關系。鑒於列

Python 從入門到進階

之前的文章我們簡單介紹了一下 Python 的幾種變數型別,本篇文章我們來看一下 Python 中的函式。 函式是組織好的,可重複使用的,用來實現單一,或相關聯功能的程式碼段。 函式能提高應用的模組性,和程式碼的重複利用率。你已經知道Python提供了許多內建函式,比如print()。但你也可以自己建立函

Python 爬蟲從入門到進階

之前的文章我們做了一個簡單的例子爬取了百度首頁的 html,我們用到的是 urlopen 來開啟請求,它是一個特殊的opener(也就是模組幫我們構建好的)。但是基本的 urlopen() 方法不支援代理、cookie等其他的HTTP/HTTPS高階功能,所以我們需要用到 Python 的 opener 來自

小白學 Python 資料分析19:Matplotlib常用圖表

人生苦短,我用 Python 前文傳送門: 小白學 Python 資料分析(1):資料分析基礎 小白學 Python 資料分析(2):Pandas (一)概述 小白學 Python 資料分析(3):Pandas (二)資料結構 Series 小白學 Python 資料分析(4):Pandas (三)資

Python 接口測試

數列 格式 dumps code 輸出 pre weather 標準 lang 五:python數列化和反序列化 把python的對象編碼轉換為json格式的字符串,反序列化可以理解為:把json格式 字符串解碼為python數據對象。在python的標準庫中,專門提供了j