python logging 模塊學習小記


簡單示例:
logging.basicConfig(level=logging.DEBUG,
format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',
datefmt='%a, %d %b %Y %H:%M:%S',
filename='myapp.log',
filemode='w')

logging.debug('This is debug message')
logging.info('This is info message')
logging.warning('This is warning message')

Formatters

Formatter對象設置日誌信息最後的規則、結構和內容,默認的時間格式爲%Y-%m-%d %H:%M:%S,下面是Formatter常用的一些信息

%(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

用戶輸出的消息

設置過濾器
細心的朋友一定會發現前文調用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的任何文件對象(file object)輸出信息。它的構造函數是:
StreamHandler([strm])
其中strm參數是一個文件對象。默認是sys.stderr
2)   logging.FileHandler
和StreamHandler類似,用於向一個文件輸出日誌信息。不過FileHandler會幫你打開這個文件。它的構造函數是:
FileHandler(filename[,mode])
filename是文件名,必須指定一個文件名。
mode是文件的打開方式。參見Python內置函數open()的用法。默認是’a',即添加到文件末尾。
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)   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)   logging.handlers.SocketHandler
6)   logging.handlers.DatagramHandler
以上兩個Handler類似,都是將日誌信息發送到網絡。不同的是前者使用TCP協議,後者使用UDP協議。它們的構造函數是:
Handler(host, port)
其中host是主機名,port是端口名
7)  logging.handlers.SysLogHandler
8)  logging.handlers.NTEventLogHandler
9)  logging.handlers.SMTPHandler
10) logging.handlers.MemoryHandler
11) logging.handlers.HTTPHandler



程序示例:

在DebugLog.py裏面構造weiteLog對象

#DebugLog.py
__author__ = 'Administrator'
import logging
from logging.handlers import RotatingFileHandler


def getDebugLog():
logger = logging.getLogger()
MyRaddled = RotatingFileHandler('Check.log', maxBytes=5*1024*1024, backupCount=5)
logger.addHandler(MyRaddled)
fmt = '[%(asctime)s ,%(filename)s:%(lineno)s ,%(levelname)s,(%(thread)d)] %(message)s'
formatter = logging.Formatter(fmt)
MyRaddled.setFormatter(formatter)
logger.setLevel(logging.WARN)
return logger

writeLog = getDebugLog()

在mainFram.py中調用:

#mainFram.py
__author__ = 'Administrator'
from DebugLog import writeLog
countLine = 1
while countLine < 10:
writeLog.warning('This is warning message:%d' % countLine)
countLine += 1
print countLine

結果是這個樣子:


[2015-07-28 11:57:56,625 ,mainFram.py:6 ,WARNING,(6360)]  This is warning message:1
[2015-07-28 11:57:56,625 ,mainFram.py:6 ,WARNING,(6360)] This is warning message:2
[2015-07-28 11:57:56,625 ,mainFram.py:6 ,WARNING,(6360)] This is warning message:3
[2015-07-28 11:57:56,625 ,mainFram.py:6 ,WARNING,(6360)] This is warning message:4
[2015-07-28 11:57:56,625 ,mainFram.py:6 ,WARNING,(6360)] This is warning message:5
[2015-07-28 11:57:56,625 ,mainFram.py:6 ,WARNING,(6360)] This is warning message:6
[2015-07-28 11:57:56,625 ,mainFram.py:6 ,WARNING,(6360)] This is warning message:7
[2015-07-28 11:57:56,625 ,mainFram.py:6 ,WARNING,(6360)] This is warning message:8
[2015-07-28 11:57:56,625 ,mainFram.py:6 ,WARNING,(6360)] This is warning message:9



參考鏈接:

REF:

logging — Logging facility for Python

Python標準模塊logging    http://blog.csdn.net/fxjtoday/article/details/6307285

Logging Cookbook http://docs.python.org/2/howto/logging-cookbook.html

http://docs.python.org/2/library/logging.html

logging.config — Logging configuration

http://docs.python.org/2/library/logging.config.html#module-logging.config

使用python的logging模塊

http://kenby.iteye.com/blog/1162698

http://gashero.yeax.com/?p=16

http://blog.sina.com.cn/s/blog_51294ca50100gc3x.html

http://www.cnblogs.com/captain_jack/archive/2011/01/21/1941453.html

使用Python的logging.config

http://www.cppblog.com/jinq0123/archive/2007/09/03/UsingLoggingConfig.html

python之強大的日誌模塊logging

http://www.stamhe.com/?p=862

每個 Python 程序員都要知道的日誌實踐

http://python.jobbole.com/81666/


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