python--6、logging模組

來源:互聯網
上載者:User

標籤: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模組

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.