標籤:war 寫入 class 生日 logger 訊息 結束 utf-8 相關配置
logging
可用的記錄層級:
- debug 10
- info 20
- warning 30
- error 40
- critical 50
logging預設參數:
- 預設記錄層級是warning。
- 預設情況日誌輸出到終端。
- 預設日誌名是root,即預設root產生日誌。
簡單使用:
import logginglogging.info(‘info level‘)
logging的全域配置方式:basicconfig
修改logging模組的預設日誌格式。
filename - 指定日誌的儲存位置。
filemode - 指定檔案開啟模式。預設‘a‘
format - 定義日誌的格式。
datafmt - 指定日期格式。
level - 定義記錄層級,寫層級對應的數字。
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 logginglogging.basicConfig( filename=‘test.log‘ format=‘%(asctime)s - %(name)s - - %(levelname)s -%(module)s: %(message)s‘, level=30, datefmt=‘%Y-%m-%D %X‘)logging.error(‘error level‘)
缺點:
- 不能同時輸出到檔案和終端。
- 不能多種輸出環境的層級、格式的自訂。
logging模組的四種對象Formatter
定義不同的日誌格式對象,然後綁定給不同的Handler。以此來控制不同Handler的日誌格式。
Handler
負責接收日誌並控制列印到不同地方。一個Handler對象可以綁定一種日誌格式。
FileHandler - 列印到檔案。
StreamHandler - 列印到終端。
Logger
負責產生日誌的對象,getLogger()方法執行個體化後的對象。對應日誌的masage欄位。
Filter
負責過濾日誌的對象。目測沒啥用
logging應用
import logging#logger對象,負責產生日誌資訊logger = logger.getLogger(‘root‘)#filter對象,沒用#Handler對象:接受log傳來的日誌內容,控制列印到終端or檔案。Handler1 = logging.FileHandler(‘tset1.log‘)Handler2 = logging.StreamHandler()#formatter對象formatter1 = logging.Formatter(‘%(asctime)s - %(name)s - - %(levelname)s -%(module)s: %(message)s‘,datafmt=‘%Y-%m-%d %H:%M:%S‘,)formatter2 = logging.Formatter(‘%(asctime)s %(name)s %(message)s‘,)#把日誌格式綁定到不同輸出對象。Handler1.setFormatter(formatter1)Handler2.setFormatter(formatter2)#設定日誌輸出層級Handler1.setLevel(10)#設定日誌產生的層級logger.setLevel(10)#把日誌資訊綁定到Handler來輸出。logger.addHandler(Handler1)#測試。logger.info(‘info level‘)
logger與Handler定義層級時的關鍵
logger是第一層級過濾,然後日誌才會到Handler,需給logger和Handler同時設定level,但要注意:
在所有logger傳的日誌都要輸出時,必須有如下的要求:內容層級 >= logger對象的記錄層級必須 >= Handler對象的記錄層級。
logger的繼承——只需知道有這麼個玩意
import loggingformatter=logging.Formatter(‘%(asctime)s - %(name)s -%(module)s: %(message)s‘,)inherit=logging.StreamHandler()inherit.setFormatter(formatter)logger1=logging.getLogger(‘root‘)logger2=logging.getLogger(‘root.child1‘)logger1.addHandler(inherit)logger2.addHandler(inherit)logger1.setLevel(10)logger2.setLevel(10)logger1.debug(‘log1 debug‘)logger2.debug(‘log2 debug‘)
★生產環境中的應用方法配置
"logging配置"import os,logging.config#先定義兩種日誌輸出格式standard_format = ‘[%(asctime)s][%(threadName)s:%(thread)d][task_id:%(name)s][%(filename)s:%(lineno)d]‘ ‘[%(levelname)s][%(message)s]‘ #其中name為getlogger指定的名字simple_format = ‘[%(levelname)s][%(asctime)s][%(filename)s:%(lineno)d]%(message)s‘#定義日誌輸出格式logfile_dir = os.path.dirname(os.path.abspath(__file__))logfile_name = ‘production.log‘if not os.path.isdir(logfile_dir) os.mkdir(logfile_dir) #log檔案全路徑logfile_path = os.path.join(logfile_dir,logfile_name)#log配置字典LOGGING_DIC = { ‘version‘:1, ‘disable_existing_loggers‘:False, ‘formatters‘: { ‘standard‘: { ‘format‘: standard_format }, ‘simple‘: { ‘format‘: simple_format }, }, ‘filters‘: {}, ‘handlers‘: { #列印到終端 ‘console‘: { ‘level‘: ‘DEBUG‘, ‘class‘: ‘logging.StreamHandler‘, ‘formatter‘: ‘simple‘ }, #列印到檔案 ‘default‘: { ‘level‘: ‘DEBUG‘, ‘class‘: ‘logging.handlers.RotatingFileHandler‘, ‘formatter‘: ‘standard‘, ‘filename‘: logfile_path, ‘maxBytes‘: 1024*1024*6, ‘encoding‘: ‘utf-8‘, }, }, ‘loggers‘: { #logging.getLogger(__name__)時拿到的配置 ‘‘: { #把上面定義的兩個Handler加到這裡,log即寫入檔案又打到終端。 ‘handlers‘: [‘default‘,‘console‘], ‘level‘: ‘DEBUG‘, #向上(更高level的logging)傳遞 ‘propagate‘: True, }, },}def load_my_logging_cfg(): logging.config.dictConfig(LOGGING_DIC) #產生個log執行個體,__name__即把當前模組名傳進去,找不到日誌相關配置,使用‘‘這個預設的。 logger = logging.getLogger(__name__)
使用:
"MyLogging Test"import timeimport loggingimport my_logging # 匯入自訂的logging配置logger = logging.getLogger(__name__) # 產生logger執行個體def demo(): logger.debug("start range... time:{}".format(time.time())) logger.info("中文測試開始。。。") for i in range(10): logger.debug("i:{}".format(i)) time.sleep(0.2) else: logger.debug("over range... time:{}".format(time.time())) logger.info("中文測試結束。。。")if __name__ == "__main__": my_logging.load_my_logging_cfg() # 在你程式檔案的入口載入自訂logging配置 demo()
python--6、logging模組