自學Python--日誌模組logging
預設:
import logging
# 預設輸出warning、error、critical資訊
logging.debug('debug') # 除錯資訊
logging.info('info') # 正常資訊
logging.warning('warning') # 警告資訊 WARNING:root:warning
logging.error('error') # 錯誤資訊 ERROR:root:error
logging.critical('critical') # 嚴重錯誤 CRITICAL:root:critical
簡單配置basicconfig:
缺點:中文亂碼、不能同時輸出到檔案和控制檯
logging.basicConfig()函式中可通過具體引數來更改logging模組預設行為,可用引數有:
filename:用指定的檔名建立FiledHandler,這樣日誌會被儲存在指定的檔案中。 filemode:檔案開啟方式,在指定了filename時使用這個引數,預設值為“a”還可指定為“w”。 format:指定handler使用的日誌顯示格式。 datefmt:指定日期時間格式。 level:設定rootlogger(後邊會講解具體概念)的日誌級別 stream:用指定的stream建立StreamHandler。可以指定輸出到sys.stderr,sys.stdout或者檔案(f=open(‘test.log’,’w’)),預設為sys.stderr。若同時列出了filename和stream兩個引數,則stream引數會被忽略。
format引數中可能用到的格式化串: %(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使用者輸出的訊息
import 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='./test.log',
filemode='w')
logging.debug('debug message')
logging.info('info message')
logging.warning('warning message')
logging.error('error message')
logging.critical('critical message')
'''
當前路徑下test.log內容:
Sun, 23 Sep 2018 21:08:19 test12.py[line:10] DEBUG debug message
Sun, 23 Sep 2018 21:08:19 test12.py[line:11] INFO info message
Sun, 23 Sep 2018 21:08:19 test12.py[line:12] WARNING warning message
Sun, 23 Sep 2018 21:08:19 test12.py[line:13] ERROR error message
Sun, 23 Sep 2018 21:08:19 test12.py[line:14] CRITICAL critical message
'''
配置log物件:
import logging
logger = logging.getLogger()
# 建立一個handler,用於寫入日誌檔案
fh = logging.FileHandler('test.log',encoding='utf-8')
# 再建立一個handler,用於輸出到控制檯
ch = logging.StreamHandler()
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
fh.setLevel(logging.DEBUG)
fh.setFormatter(formatter)
ch.setFormatter(formatter)
logger.addHandler(fh) #logger物件可以新增多個fh和ch物件
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')
'''
控制檯輸出:
2018-09-23 21:12:52,875 - root - WARNING - logger warning message
2018-09-23 21:12:52,875 - root - ERROR - logger error message
2018-09-23 21:12:52,876 - root - CRITICAL - logger critical message
test.log內容:
2018-09-23 21:12:52,875 - root - WARNING - logger warning message
2018-09-23 21:12:52,875 - root - ERROR - logger error message
2018-09-23 21:12:52,876 - root - CRITICAL - logger critical message
'''