1. 程式人生 > 實用技巧 >logging模組 (日誌)

logging模組 (日誌)

import logging

-----*----通過logging.basciConfig 函式來調整日誌輸入格式 ----*----- #不靈活,不好用
logging.basicConfig(
level=logging.DEBUG, #修改了預設存入或者輸出到螢幕的日誌級別
filename='log_test.log', #如果不建立日誌檔案儲存,直接輸出到螢幕
filemode='w', #如果不定義,直接預設追加 注意追加是整體追加
format='%(asctime)s %(filename)s %(levelname)s %(message)s %(lineno)d',

#指定格式的輸出日誌檔案 %()s固定格式,括號裡面加內容 時間 執行檔案 等級名 日誌內容
)


#stream 預設輸出螢幕 有filename情況下有儲存日誌檔案 直接忽略stream
#datefmt 指定日期時間格式
#format 引數可能用到格式化字串
#%(name)s 執行操作日誌檔案的使用者名稱 預設root使用者
#%(levelname)s 文字日誌級別
#%(levelno)s 數字形式日誌級別
#%(pathname)s 呼叫日誌輸出函式的模組的完整路徑名,可能沒有
#%(filename)s 呼叫日誌輸出函式的模組的檔名
#%(module)s 呼叫日誌輸出函式的模組名
#%(funcName)s 呼叫日誌輸出函式的函式名
#%(lineno)d 呼叫日誌輸出函式的語句所在程式碼的行 就是生成資料的程式碼在第幾行
#%(asctime)s 預設格式輸出字串時間
#%(thread)s 執行緒ID,可能沒有
#%(threadName)s 執行緒名,可能沒有
#%(process)d 程序ID,可能沒有
#%(message)s 使用者的輸出資訊

logging.debug("this is debug message")
logging.info("this is info message")
logging.warning('this is warning message')
logging.error('this is error massage')
logging.critical('this is critical massage')

#logging 日誌採用五個級別來記錄日誌 預設記錄warningerror,critical 三個級別的日誌
#info是正常的日誌內容 想要更改日誌的一些基本設定,在longging.basicConfig中修改

import logging
logger = logging.getLogger() #建立一個logger物件 以後的操作寫日誌都是對這個物件的操作
#注意,不填預設是根物件 填寫的話就是根物件下面的子物件
#這個是一個樹形結構,以物件名來判定是不是一個物件

FW = logging.FileHandler('loger_test.log') #寫入檔案儲存日誌功能
SW = logging.StreamHandler() #輸出日誌到螢幕上功能

FW.setFormatter(logging.Formatter('%(asctime)s %(levelname)s %(message)s ')) #對於寫入檔案自定義格式

logger.addHandler(FW) #開始logger物件是空,什麼方法本事沒有,吸取儲存日誌到檔案的本領
logger.addHandler(SW) #吸取日誌輸出到螢幕的本領
logger.setLevel('DEBUG') #把物件設定日誌級別 注意裡面大寫

logger.debug('this is debug')
logger.info('this is info')
logger.warning('this is warning')
logger.error('this is error')
logger.critical('this is critical')

以上既可以輸出到檔案儲存起來,還可以輸出到螢幕上 且可以定義一個函式包含次功能,要寫日誌直接呼叫此函式,方便擴充套件改進


def rizhi():
import logging
logger = logging.getLogger() #建立一個logger物件 以後的操作寫日誌都是對這個物件的操作
#注意,不填預設是根物件 填寫的話就是根物件下面的子物件
#這個是一個樹形結構,以物件名來判定是不是一個物件

FW = logging.FileHandler('loger_test.log') #寫入檔案儲存日誌功能
SW = logging.StreamHandler() #輸出日誌到螢幕上功能

FW.setFormatter(logging.Formatter('%(asctime)s %(levelname)s %(message)s ')) #對於寫入檔案自定義格式

logger.addHandler(FW) #開始logger物件是空,什麼方法本事沒有,吸取儲存日誌到檔案的本領
logger.addHandler(SW) #吸取日誌輸出到螢幕的本領
logger.setLevel('DEBUG') #把物件設定日誌級別 注意裡面大寫

return logger


rizhi().debug('this is debug')
rizhi().info('this is info')
rizhi().warning('this is warning')
rizhi().error('this is error')
rizhi().critical('this is critical')


注意兩個坑,首先 如果是子物件,物件名一樣的話其實是對一個物件進行操作 子物件進行日誌寫入的話,寫完後會看其父輩物件有沒有工作過,有的話,則會再次寫入一遍


import logging

loger = logging.getLogger() #預設不寫根物件

loger1 = logging.getLogger('erzi') #子物件

FW = logging.FileHandler('test') #存日誌功能
SW = logging.StreamHandler() #輸出日誌到螢幕功能

FW.setFormatter(format('%(asctime)s %(levelname)s %(message)s')) #自定義儲存日誌的格式
SW.setFormatter(logging.Formatter('%(asctime)s %(levelname)s %(message)s')) #自定義輸出螢幕的格式

loger.setLevel('DEBUG')
loger.addHandler(FW) #物件增加功能
loger.addHandler(SW)
loger1.addHandler(FW)
loger1.addHandler(SW)



loger.debug("this is debug message")
loger.info("this is info message")
loger.warning('this is warning message')
loger.error('this is error massage')
loger.critical('this is critical massage')



loger1.debug("this is debug message")
loger1.info("this is info message")
loger1.warning('this is warning message')
loger1.error('this is error massage')
loger1.critical('this is critical massage')