logging模塊 很多程式都有記錄日誌的需求,並且日誌中包含的信息即有正常的程式訪問日誌,還可能有錯誤、警告等信息輸出,python的logging模塊提供了標準的日誌介面,你可以通過它存儲各種格式的日誌,logging的日誌可以分為 debug、info、warning、error、critic ...
logging模塊
很多程式都有記錄日誌的需求,並且日誌中包含的信息即有正常的程式訪問日誌,還可能有錯誤、警告等信息輸出,python的logging模塊提供了標準的日誌介面,你可以通過它存儲各種格式的日誌,logging的日誌可以分為 debug、info、warning、error、critical 5個級別,
下麵我們看一下怎麼用
模塊初識:
#logging初識 import logging logging.warning("user [James] attempted wrong password more than 3 times") logging.critical("server is down") # WARNING:root:user [James] attempted wrong password more than 3 times # CRITICAL:root:server is down
上面的代碼是最簡單的方式,括弧里的內容為列印的信息,logging.後的方法為日誌的級別,下麵看看logging五個級別的詳細信息
如果想把日誌寫到文件里,也很簡單:
#日誌列印到文件中 import logging logging.basicConfig(filename="example.log",level=logging.INFO, format="%(asctime)s %(message)s", datefmt="%m/%d/%Y %H:%M:%S [%A]") # H 24小時格式 I 12小時格式 A 周幾完整 a 周幾簡寫 p AM/PM logging.debug("This message should go to the log file") logging.info("So should this") logging.warning("And this ,too")
logging.basicConfig里定義了輸入文件路徑,輸入日誌信息的級別,輸入的格式,格式可自定義;執行完代碼後example.log文件會生成信息如下:
10/31/2016 17:16:17 [Monday] So should this 10/31/2016 17:16:17 [Monday] And this ,too
其中下麵這句中的level=loggin.INFO意思是,把日誌紀錄級別設置為INFO,也就是說,只有比日誌是INFO或比INFO級別更高的日誌才會被紀錄到文件里,在這個例子, 第一條日誌是不會被紀錄的,如果希望紀錄debug的日誌,那把日誌級別改成DEBUG就行了
如果想同時把log列印在屏幕和文件日誌里,就需要瞭解一點複雜的知識了:
The logging library takes a modular approach and offers several categories of components: loggers, handlers, filters, and formatters.
- Loggers expose the interface that application code directly uses.
- Handlers send the log records (created by loggers) to the appropriate destination.
- Filters provide a finer grained facility for determining which log records to output.
- Formatters specify the layout of log records in the final output.
#!/usr/bin/env python # -*- coding:utf-8 -*- #-Author-Lian import logging #創建logger logger = logging.getLogger("test_log") #創建logger對象 括弧內容隨便寫 logger.setLevel(logging.INFO) #全局日誌級別 ch = logging.StreamHandler() #日誌列印到屏幕上 ch.setLevel(logging.DEBUG) #指定ch日誌列印級別 fh = logging.FileHandler("access.log") #日誌存進文件 fh.setLevel(logging.WARNING) #指定fh日誌輸入級別 formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s") #定義日誌格式,可寫多個 #添加日誌格式到ch,fh ch.setFormatter(formatter) fh.setFormatter(formatter) #添加ch,fh到logger中 logger.addHandler(ch) logger.addHandler(fh) logger.debug('debug message') logger.info('info message') logger.warn('warn message') logger.error('error message') logger.critical('critical message')
全局日誌級別為整個程式的底線,局部日誌級別要想列印則不能比這個級別再低了
屏幕列印信息:
2016-10-31 17:23:42,988 - test_log - INFO - info message 2016-10-31 17:23:42,988 - test_log - WARNING - warn message 2016-10-31 17:23:42,988 - test_log - ERROR - error message 2016-10-31 17:23:42,988 - test_log - CRITICAL - critical message
access.log:
2016-10-31 17:02:06,223 - test_log - WARNING - warn message 2016-10-31 17:02:06,224 - test_log - ERROR - error message 2016-10-31 17:02:06,224 - test_log - CRITICAL - critical message
日誌所有的格式:
重要的幾個格式:%(lineno)d 輸出列印日誌代碼行 ,%(process)d輸出列印日誌的進程ID ,%(thread)d輸出列印日誌的線程ID