1. 日誌級別
日誌一共分成5個等級,從低到高分別是:
- DEBUG
- INFO
- WARNING
- ERROR
- CRITICAL
說明:
- DEBUG:詳細的信息,通常只出現在診斷問題上
- INFO:確認一切按預期運行
- WARNING:一個跡象表明,一些意想不到的事情發生了,或表明一些問題- 在不久的將來(例如。磁盤空間低”)。這個軟件還能按預期工作。
- ERROR:更嚴重的問題,軟件沒能執行一些功能
- CRITICAL:一個嚴重的錯誤,這表明程序本身可能無法繼續運行
這5個等級,也分別對應5種打日誌的方法: debug 、info 、warning 、error 、critical。默認的是WARNING,當在WARNING或之上時才被跟蹤。
2. 日誌輸出
有兩種方式記錄跟蹤,一種輸出控制檯,另一種是記錄到文件中,如日誌文件。
2.1將日誌輸出到控制檯
比如,log1.py 如下:
import logging
logging.basicConfig(level=logging.WARNING,
format='%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s')
# 開始使用log功能
logging.info('這是 loggging info message')
logging.debug('這是 loggging debug message')
logging.warning('這是 loggging a warning message')
logging.error('這是 an loggging error message')
logging.critical('這是 loggging critical message')
運行結果
2017-11-06 23:07:35,725 - log1.py[line:9] - WARNING: 這是 loggging a warning message
2017-11-06 23:07:35,725 - log1.py[line:10] - ERROR: 這是 an loggging error message
2017-11-06 23:07:35,725 - log1.py[line:11] - CRITICAL: 這是 loggging critical message
說明
通過logging.basicConfig函數對日誌的輸出格式及方式做相關配置,上面代碼設置日誌的輸出等級是WARNING級別,意思是WARNING級別以上的日誌纔會輸出。另外還制定了日誌輸出的格式。
注意,只要用過一次log功能再次設置格式時將失效,實際開發中格式肯定不會經常變化,所以剛開始時需要設定好格式。
2.2、將日誌輸出到文件
我們還可以將日誌輸出到文件,只需要在logging.basicConfig函數中設置好輸出文件的文件名和寫文件的模式。
log2.py 如下:
import logging
logging.basicConfig(level=logging.WARNING,
filename='./log.txt',
filemode='w',
format='%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s')
# use logging
logging.info('這是 loggging info message')
logging.debug('這是 loggging debug message')
logging.warning('這是 loggging a warning message')
logging.error('這是 an loggging error message')
logging.critical('這是 loggging critical message')
運行效果
python@ubuntu: cat log.txt
2017-11-06 23:10:44,549 - log2.py[line:10] - WARNING: 這是 loggging a warning message
2017-11-06 23:10:44,549 - log2.py[line:11] - ERROR: 這是 an loggging error message
2017-11-06 23:10:44,549 - log2.py[line:12] - CRITICAL: 這是 loggging critical message
2.3、既要把日誌輸出到控制檯, 還要寫入日誌文件
這就需要一個叫作Logger 的對象來幫忙,下面將對他進行詳細介紹,現在這裏先學習怎麼實現把日誌既要輸出到控制檯又要輸出到文件的功能。
import logging
# 第一步,創建一個logger
logger = logging.getLogger()
logger.setLevel(logging.INFO) # Log等級總開關
# 第二步,創建一個handler,用於寫入日誌文件
logfile = './log.txt'
fh = logging.FileHandler(logfile, mode='a') # open的打開模式這裏可以進行參考
fh.setLevel(logging.DEBUG) # 輸出到file的log等級的開關
# 第三步,再創建一個handler,用於輸出到控制檯
ch = logging.StreamHandler()
ch.setLevel(logging.WARNING) # 輸出到console的log等級的開關
# 第四步,定義handler的輸出格式
formatter = logging.Formatter("%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s")
fh.setFormatter(formatter)
ch.setFormatter(formatter)
# 第五步,將logger添加到handler裏面
logger.addHandler(fh)
logger.addHandler(ch)
# 日誌
logger.debug('這是 logger debug message')
logger.info('這是 logger info message')
logger.warning('這是 logger warning message')
logger.error('這是 logger error message')
logger.critical('這是 logger critical message')
運行時終端的輸出結果:
2017-11-06 23:14:04,731 - log3.py[line:28] - WARNING: 這是 logger warning message
2017-11-06 23:14:04,731 - log3.py[line:29] - ERROR: 這是 logger error message
2017-11-06 23:14:04,731 - log3.py[line:30] - CRITICAL: 這是 logger critical message
在log.txt中,有如下數據:
2017-11-06 23:14:04,731 - log3.py[line:27] - INFO: 這是 logger info message
2017-11-06 23:14:04,731 - log3.py[line:28] - WARNING: 這是 logger warning message
2017-11-06 23:14:04,731 - log3.py[line:29] - ERROR: 這是 logger error message
2017-11-06 23:14:04,731 - log3.py[line:30] - CRITICAL: 這是 logger critical message
3、日誌格式說明
logging.basicConfig函數中,可以指定日誌的輸出格式format,這個參數可以輸出很多有用的信息,如下:
- %(levelno)s: 打印日誌級別的數值
- %(levelname)s: 打印日誌級別名稱
- %(pathname)s: 打印當前執行程序的路徑,其實就是sys.argv[0]
- %(filename)s: 打印當前執行程序名
- %(funcName)s: 打印日誌的當前函數
- %(lineno)d: 打印日誌的當前行號
- %(asctime)s: 打印日誌的時間
- %(thread)d: 打印線程ID
- %(threadName)s: 打印線程名稱
- %(process)d: 打印進程ID
- %(message)s: 打印日誌信息
在工作中給的常用格式如下:
format='%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s'
這個格式可以輸出日誌的打印時間,是哪個模塊輸出的,輸出的日誌級別是什麼,以及輸入的日誌內容。