Python日誌模組(第1篇)

來源:互聯網
上載者:User
【轉載】原文地址http://blog.sina.com.cn/s/blog_681315fa0100imtk.html

如果使用Python寫一個比較大型的程式,你一定會用上日誌系統。特別是Python這樣的動態語言,很多錯誤都只能在啟動並執行時候才能發現,一個好的日誌系統對於Python程式相當重要。最簡單的解決方案當然是直接使用print輸出運行資訊。但是這樣太簡單了,沒有分級功能,如果在發布的時候想去掉調試用的運行資訊還得找出所有的print語句進行修改。再者,print只能輸出到控制台,想要輸出到檔案或者通過電子郵件發送到其他地方,一個print語句就沒辦法解決了。
通過使用Python的日誌系統,就可以解決以上問題。
首先看一下這個樣本:
import logging
LOG=logging.getLogger(’應用程式名稱’)
console = logging.StreamHandler()
console.setLevel(logging.INFO)
LOG.addHandler(console)
LOG.debug(’調試資訊’)
LOG.info(’有用的資訊’)
LOG.warning(’警告資訊’)
LOG.error(’錯誤資訊’)
LOG.critical(’嚴重錯誤資訊’)
上面的代碼想控制台輸出了五種錯誤資訊。分為五個從低到高的層級,從DEBUG到CRITICAL。此外,我們還指定了程式輸出的層級,只有INFO層級以上的資訊才會被輸出。
這就是日誌系統最常用的使用方法。這段代碼中有兩個概念可以協助我們更進一步使用Python的日誌系統:
1.       “Logger”。每個程式在輸出資訊之前都要獲得一個Logger。Logger通常對應了程式的模組名,比如聊天工具的圖形介面模組可以這樣獲得它的Logger:
LOG=logging.getLogger(”chat.gui”)
而核心模組可以這樣:
LOG=logging.getLogger(”chat.kernel”)
我們接下來可以看到使用這種命名方法的用途。
2.       “Handler”。用於處理常式的輸出。Python的日誌系統有多種Handler可以使用。有些Handler可以把資訊輸出到控制台,有些Logger可以把資訊輸出到檔案,還有些Handler可以把資訊發送到網路上。如果覺得不夠用,還可以編寫自己的Handler。
所有的Handler可以支援三個操作:
1.     設定輸出格式。比如設定輸出的資訊中包含時間和層級資訊:
LOG=logging.getLogger(”chat.gui”)
console = logging.StreamHandler()
console.setLevel(logging.INFO)
formatter = logging.Formatter(’%(asctime)s %(levelname)s%(message)s’)
console.setFormatter(formatter)
LOG.addHandler(console)
熟悉Python的朋友應該會發現,logging.Formatter的參數實際上只是Python常用的“%”字串格式化。它使用“%(name)s”表示預留位置。下面是一個完整的表格,展示了日誌系統可以輸出的各種資訊:

%(name)s

Logger的名字

%(levelno)s

數字形式的記錄層級

%(levelname)s

文本形式的記錄層級

%(pathname)s

調用日誌輸出函數的模組的完整路徑名,可能沒有

%(filename)s

調用日誌輸出函數的模組的檔案名稱

%(module)s

調用日誌輸出函數的模組名

%(funcName)s

調用日誌輸出函數的函數名

%(lineno)d

調用日誌輸出函數的語句所在的程式碼

%(created)f

目前時間,用UNIX標準的表示時間的浮點數表示

%(relativeCreated)d

輸出日誌資訊時的,自Logger建立以來的毫秒數

%(asctime)s

字串形式的目前時間。預設格式是“2003-07-08 16:49:45,896”。逗號後面的是毫秒

%(thread)d

線程ID。可能沒有

%(threadName)s

線程名。可能沒有

%(process)d

進程ID。可能沒有

%(message)s

使用者輸出的訊息

2.     設定輸出層級
在上面我們已經示範了如何設定輸出層級了。除了Python內建的五種層級,我們還可以自訂輸出層級。
TODO 子定義輸出層級
3.     設定過濾器
細心的朋友一定會發現前文調用logging.getLogger()時參數的格式類似於“A.B.C”。採取這樣的格式其實就是為了可以配置過濾器。看一下這段代碼:
LOG=logging.getLogger(”chat.gui.statistic”)
console = logging.StreamHandler()
console.setLevel(logging.INFO)
formatter = logging.Formatter(’%(asctime)s %(levelname)s%(message)s’)
console.setFormatter(formatter)
filter=logging.Filter(”chat.gui”)
console.addFilter(filter)
LOG.addHandler(console)
和前面不同的是我們在Handler上添加了一個過濾器。現在我們輸出日誌資訊的時候就會經過過濾器的處理。名為“A.B”的過濾器只讓名字帶有“A.B”首碼的Logger輸出資訊。可以添加多個過濾器,只要有一個過濾器拒絕,日誌資訊就不會被輸出。另外,在Logger中也可以添加過濾器。
每個Logger可以附加多個Handler。接下來我們就來介紹一些常用的Handler:
1)       logging.StreamHandler
使用這個Handler可以向類似與sys.stdout或者sys.stderr的任何檔案對象(fileobject)輸出資訊。它的建構函式是:
StreamHandler([strm])
其中strm參數是一個檔案對象。預設是sys.stderr
2)   2.logging.FileHandler
和StreamHandler類似,用於向一個檔案輸出日誌資訊。不過FileHandler會幫你開啟這個檔案。它的建構函式是:
FileHandler(filename[,mode])
filename是檔案名稱,必須指定一個檔案名稱。
mode是檔案的開啟檔案。參見Python內建函數open()的用法。預設是’a’,即添加到檔案末尾。
3)   3.logging.handlers.RotatingFileHandler
這個Handler類似於上面的FileHandler,但是它可以管理檔案大小。當檔案達到一定大小之後,它會自動將當前記錄檔改名,然後建立一個新的同名記錄檔繼續輸出。比如記錄檔是chat.log。當chat.log達到指定的大小之後,RotatingFileHandler自動把檔案改名為chat.log.1。不過,如果chat.log.1已經存在,會先把chat.log.1重新命名為chat.log.2。。。最後重新建立chat.log,繼續輸出日誌資訊。它的建構函式是:
RotatingFileHandler( filename[, mode[, maxBytes[,backupCount]]])
其中filename和mode兩個參數和FileHandler一樣。
maxBytes用於指定記錄檔的最大檔案大小。如果maxBytes為0,意味著記錄檔可以無限大,這時上面描述的重新命名過程就不會發生。
backupCount用於指定保留的備份檔案的個數。比如,如果指定為2,當上面描述的重新命名過程發生時,原有的chat.log.2並不會被更名,而是被刪除。
4)   4.logging.handlers.TimedRotatingFileHandler
這個Handler和RotatingFileHandler類似,不過,它沒有通過判斷檔案大小來決定何時重新建立記錄檔,而是間隔一定時間就自動建立新的記錄檔。重新命名的過程與RotatingFileHandler類似,不過新的檔案不是附加數字,而是目前時間。它的建構函式是:
TimedRotatingFileHandler( filename [,when [,interval[,backupCount]]])
其中filename參數和backupCount參數和RotatingFileHandler具有相同的意義。
interval是時間間隔。
when參數是一個字串。表示時間間隔的單位,不區分大小寫。它有以下取值:
S 秒
M 分
H 小時
D 天
W 每星期(interval==0時代表星期一)
midnight 每天淩晨
5)   5.logging.handlers.SocketHandler
6)    […]

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.