原文:http://www.cnblogs.com/dahu-daqing/p/7040764.htmlhtml
logging模塊是Python內置的標準模塊,主要用於輸出運行日誌,能夠設置輸出日誌的等級、日誌保存路徑、日誌文件回滾等;相比print,具有以下優勢:python
能夠經過設置不一樣的日誌等級,在release版本中只輸出重要信息,而沒必要顯示大量的調試信息;web
print將全部信息都輸出到標準輸出中,嚴重影響開發者從標準輸出中查看其它數據;logging則能夠由開發者決定將信息輸出到什麼地方,以及怎麼輸出;函數
不少程序都有記錄日誌的需求,而且日誌中包含的信息即有正常的程序訪問日誌,還可能有錯誤、警告等信息輸出,python的logging模塊提供了標準的日誌接口,你能夠經過它存儲各類格式的日誌,工具
logging的日誌能夠分爲 debug(), info(), warning(), error() and critical()
5個級別,下面咱們看一下怎麼用。post
默認級別是WARNING,表示只有WARING和比WARNING更嚴重的事件纔會被記錄到日誌內,低級別的信息會被忽略。
所以,默認狀況下,DEBUG和INFO會被忽略,WARING、ERROR和CRITICAL會被記錄。
有多種方法用來處理被跟蹤的事件。最簡單的方法就是把它們打印到終端控制檯上。或者將它們寫入一個磁盤文件內。
import logging logging.warning('Watch out!') # 消息會被打印到控制檯上 logging.info('I told you so') # 這行不會被打印,由於級別低於默認級別warning
import logging logging.basicConfig(filename='example.log',level=logging.INFO)
logging.debug('This message should go to the log file') logging.info('So should this') logging.warning('And this, too')
其中下面這句中的level=loggin.INFO意思是,把日誌紀錄級別設置爲INFO,也就是說,只有比日誌是INFO或比INFO級別更高的日誌纔會被紀錄到文件裏,
在這個例子, 第一條日誌是不會被紀錄的,若是但願紀錄debug的日誌,那把日誌級別改爲DEBUG就好了。 logging.basicConfig(filename='example.log',level=logging.INFO)
logging.basicConfig(level=log_level, format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s', datefmt='%a, %d %b %Y %H:%M:%S', filename='parser_result.log', filemode='w')#默認爲a
logging.basicConfig函數各參數: filename: 指定日誌文件名 filemode: 和file函數意義相同,指定日誌文件的打開模式,'w'或'a' format: 指定輸出的格式和內容,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: 打印日誌信息 datefmt: 指定時間格式,同time.strftime() level: 設置日誌級別,默認爲logging.WARNING stream: 指定將日誌的輸出流,能夠指定輸出到sys.stderr,sys.stdout或者文件,默認輸出到sys.stderr,當stream和filename同時指定時,stream被忽略 logging打印信息函數: logging.debug('This is debug message') logging.info('This is info message') logging.warning('This is warning message')
#引入日誌模塊
import logging #1 生成 logger 對象
logger_user = logging.getLogger('atm_user') #每一個程序在輸出信息以前都要得到一個Logger。 # Logger一般對應了程序的模塊名,好比聊天工具的圖形界面模塊能夠這樣得到它的Logger: #LOG=logging.getLogger(」chat.gui」)
# 2 logger.setLevel()指定日誌最低級別
logger_user.setLevel(level = logging.DEBUG) # 3 FileHandler()日誌輸出至文件
handler_user = logging.FileHandler('test.log',encoding='utf-8') # handler對象負責發送相關的信息到指定目的地 # 4 指定被處理的信息最低級別 Handler.setLevel()
handler_user.setLevel(logging.DEBUG) # 5 給這個輸出設定一個格式
formatter = logging.Formatter('%(asctime)s--%(name)s--%(levelname)s--%(message)s') handler_user.setFormatter(formatter) # 6 增長指定的文件
logger_user.addHandler(handler_user) # StreamHandler()輸出至屏幕
console = logging.StreamHandler() console.setLevel(logging.INFO) # 增長指定的文件 Handler()
logger_user.addHandler(handler_user) #或者控制檯 Handler()
logger_user.addHandler(console) #------------------------------------------------
logger_user.info("Start print log") logger_user.debug("Do something") logger_user.warning("Something maybe fail.") logger_user.info("Finish")
簡潔的方法:輸出到文件的簡單方法ui
import logging logging.basicConfig(level = logging.INFO, format = '%(asctime)s - %(name)s - %(levelname)s - %(message)s', filename='test2.log', ) logger_user = logging.getLogger('user') logger_user.info("Start print log") logger_user.debug("Do something") logger_user.warning("Something maybe fail.") logger_user.info("Finish")
#-----------------------------------------------------------------------
# 函數
import loggingthis
logging.basicConfig(filename='log_test.log',
level=logging.WARNING,
format='%(asctime)s:%(levelname)s:%(filename)s:%(module)s %(message)s',
datefmt='%Y-%m-%d %I:%M:%S %p'
)url
def sayhi():
logging.error('from sayhi...')spa
sayhi()
logging.debug('so should this')
logging.info('I told you so')
logging.warning('Watch out!')
logging.error('this error is no')
logging.critical('critical xxxx')
日誌的formatter是個獨立的組件,能夠跟handler組合
fh = logging.FileHandler("access.log")#添加日誌到文件 formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') fh.setFormatter(formatter) #把formmater綁定到fh上
若是你想對日誌內容進行過濾,就可自定義一個filter
class
IgnoreBackupLogFilter(logging.Filter):
""
"忽略帶db backup 的日誌"
""
def filter(self, record): #固定寫法
return
"db backup"
not
in
record.getMessage()
下面的日誌就會把符合filter條件的過濾掉
logger.debug("test ....") logger.info("test info ....") logger.warning("start to run db backup job ....") logger.error("test error ....")
import logging # filter 過濾 class IgnoreBackupLogFilter(logging.Filter): """忽略帶db backup 的日誌""" def filter(self, record): #固定寫法 return "db backup" not in record.getMessage() # 1.生成logging對象 logger = logging.getLogger('web') logger.setLevel(logging.INFO) # 設置日誌等級 # 1.1 把filter對象添加到logger中 logger.addFilter(IgnoreBackupLogFilter()) # 2。生成hander對象 ch = logging.StreamHandler() # 終端打印 ch.setLevel(logging.DEBUG) # 終端打印 日誌等級 fh = logging.FileHandler('web.log') # 文件保存 fh.setLevel(logging.WARNING) # 文件保存 日誌等級 # 2.1把hander對象綁定到logger logger.addHandler(ch) logger.addHandler(fh) # 3.生成formatter 對象 file_formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') console_formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') # 3.1把formatter對象綁定到hander對象 ch.setFormatter(console_formatter) fh.setFormatter(file_formatter) logger.debug("test ....") logger.info("test info ....") logger.warning("start to run db backup job ....") logger.warning("start to run db backup job 1....") logger.warning("start to run db backup job 2....") logger.error("test error ....")
#-----------------------------------------------------------------------
保存輸出,非過濾條件下的數據
web.log 文件: 2018-08-31 14:23:55,694 - web - ERROR - test error ....
控制檯輸出:
2018-08-31 14:23:55,692 - web - INFO - test info ....
2018-08-31 14:23:55,694 - web - ERROR - test error ....
若是條件變爲:保存輸出知足過濾條件的數據
return "db backup" in record.getMessage()
wed.log文件:
2018-08-31 14:25:57,384 - web - WARNING - start to run db backup job ....
2018-08-31 14:25:57,384 - web - WARNING - start to run db backup job 1....
2018-08-31 14:25:57,384 - web - WARNING - start to run db backup job 2....
控制檯:
2018-08-31 14:25:57,384 - web - WARNING - start to run db backup job ....2018-08-31 14:25:57,384 - web - WARNING - start to run db backup job 1....2018-08-31 14:25:57,384 - web - WARNING - start to run db backup job 2....