13 python logging模塊

原文:http://www.cnblogs.com/dahu-daqing/p/7040764.htmlhtml

1 logging模塊簡介

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

 

2 logging模塊使用

2.1 配置logging基本的設置,記錄到文件裏

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)

2.2python logging模塊 basicConfig配置文件

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')

2.2把日誌同時輸出至文件和控制檯

#引入日誌模塊
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')

2.三、formatter組件

日誌的formatter是個獨立的組件,能夠跟handler組合

fh = logging.FileHandler("access.log")#添加日誌到文件
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
 
fh.setFormatter(formatter) #把formmater綁定到fh上

2.四、filter組件

若是你想對日誌內容進行過濾,就可自定義一個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 ....")

 

2.5一個同時輸出到屏幕、文件、帶filter的完成例子

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....

相關文章
相關標籤/搜索