// from : http://blog.sina.com.cn/s/blog_4b5039210100f1wv.html
一般情況下,一些程序的調試過程中我們會讓它輸出一些信息,特別是一些大型的程序,我們通過這些信息可以瞭解程序的運行情況,python提供了一個日誌模塊logging,它可以把我們想要的信息全部保存到一個日誌文件中,方面我們查看。我們先看一個簡單的例子。
>>> import logging
>>> LOG_FILENAME="C:\Python25\log_test.txt"
>>> logging.basicConfig(filename=LOG_FILENAME,level=logging.DEBUG)
>>> logging.debug("This message should go to the log file")
然後我們就可以在C盤python25目錄下發現一個名爲log_test.txt的文件,打開裏面的內容爲: DEBUG:root:This message should go to the log file
然後我們重複運行最後一句,會發現這個文本文件每次都會多出一行:DEBUG:root:This message should go to the log file
下面我們看一個更標準的程序:
>>> import logging
>>> logger=logging.getLogger()
>>> handler=logging.FileHandler("Log_test.txt")
>>> logger.addHandler(handler)
>>> logger.setLevel(logging.NOTSET)
>>> logger.error("This is an error message")
>>> logger.info("This is an info message")
>>> logger.critical("This is a critical message")
日誌文件中會出現三行內容:
This is an error message
This is an info message
This is a critical message
上面程序的第2行是生成一個日誌對象,裏面的參數時日誌的名字,可以帶,也可以不帶。第3行是生成了一個handler,logging支持很多種Handler,像FileHandler,SocketHandler等待,這裏由於我們要寫文件,所以用了FileHandler,它的參數就是filename,默認當前路徑,當然我們可以自己指定路徑。
第5行設置日誌信息輸出的級別。Logging提供了多種日誌級別,如NOTSET,DEBUG,INFO,WARNING,ERROR,CRITICAL等,每個級別都對應一個數值,如果我們不自己設置輸出級別,那麼系統會執行缺省級別,值爲30,就warning。Logging也提供了一個方法來查看缺省日誌級別,getLevelName(logger,getEffectiveLevel())。
日誌對象對於不同的級別信息提供不同的函數進行輸出,如:info(), error(), debug()等。當寫入日誌時,小於指定級別的信息將被忽略。因此爲了輸出想要的日誌級別一定要設置好此參數。這裏我設爲NOTSET(值爲0),也就是想輸出所有信息。系統默認的日誌級別排序爲,CRITICAL,ERROR,WARNING,INFO,DEBUG,NOTSET。比如說我們要輸出的信息爲CRITICAL,但是我們的日誌級別爲DEBUG,那麼這個信息將被忽略掉。我們看下面的例子:
import logging
import sys
LEVELS={'debug':logging.DEBUG,
'info':logging.INFO,
'warning':logging.WARNING,
'error':logging.ERROR,
'critical':logging.CRITICAL}
if len(sys.argv)>1:
level_name=sys.argv[1]
level=LEVELS.get(level_name,logging.NOTSET)
logging.basicConfig(level=level)
logging.debug("This is a debug message")
logging.info("This is an info message")
logging.warning("This is a warning message")
logging.error("This is an error message")
logging.critical("This is a critical error message")
運行時候,我們根據給的參數時debug,info等等,來看看輸出情況,就可以知道各個日誌級別的輸出情況了,下面是結果:
可以看到過濾進行的很明顯。當我們設置級別最低位debug時,所有的信息都輸出了,當我們設爲最高位critical時候,只有critical輸出了,低於critical的被過濾了。
Logging是非常有用的,一個程序的健壯性也這個有關,當一個程序包含很多的調試信息時,可以方便我們發現問題,發現錯誤。