標籤:分析日誌 檔案中 tin 日誌格式 讀取 load 傳遞 warning ctime
一.json與pickle
json與pickle模組是為了完成資料的序列化.
序列化是指把對象(變數)從記憶體中變成可儲存或傳輸的過程,在Python中叫picking,在其他語言中也由其他的叫法,但是都是一個意思
序列化是為瞭解決資料持久儲存狀態和跨平台資料互動兩個問題,
如何?序列化?
json
JSON(JavaScript Object Notation, JS 對象簡譜) 是一種輕量級的資料交換格式。它基於 ECMAScript (歐洲電腦協會制定的js規範)的一個子集,採用完全獨立於程式設計語言的文字格式設定來儲存和表示資料。簡潔和清晰的階層使得 JSON 成為理想的資料交換語言。 易於人閱讀和編寫,同時也易於機器解析和產生,並有效地提升網路傳輸效率。
如果我們要在不同的程式設計語言之間傳遞對象,就必須把對象序列化為標準格式,最好的方法是序列化為json,因為json表示出來就是一個字串,可以被所有語言讀取,也可以方便地儲存到磁碟或者通過網路傳輸,json不僅是標準格式,平且比XML更快,而且可以直接在Web頁面讀取,非常方便
由於json表示的對象就是標準的JavaScript語言的對象,json和python內建的資料類型如下:
pickle
pickle和json一樣是為了實現序列化的模組,但是pickle的問題是只能在python中使用,python中幾乎所有的資料類型都可以用pickle來序列化,但是pickle序列化後的資料可讀性差,人一般無法識別.
pickle.dump(obj, file[, protocol])
序列化對象,並將結果資料流寫入到檔案對象中。參數protocol是序列化模式,預設值為0,表示以文本的形式序列化。protocol的值還可以是1或2,表示以二進位的形式序列化。
pickle.load(file)
還原序列化對象。將檔案中的資料解析為一個Python對象。其中要注意的是,在load(file)的時候,要讓python能夠找到類的定義,否則會報錯:
二.logging模組
1.日誌相關概念
日誌是一種可以追蹤某些軟體運行時所發生事件的方法。軟體開發人員可以向他們的代碼中調用日誌記錄相關的方法來表明發生了某些事情。一個事件可以用一個可包含可選變數資料的訊息來描述。此外,事件也有重要性的概念,這個重要性也可以被稱為嚴重性層級(level)。
日誌是為了使我們通過記錄和分析日誌可以瞭解一個系統或軟體程式運行情況是否正常,也可以在應用程式出現故障時快速定位問題.
2.日誌的層級
CRITICAL = 50
ERROR = 40
WARNING = 30
INFO = 20
DEBUG = 10
NOTSET = 0
預設層級為warning
代碼執行個體:
執行結果:
3.logging模組的使用
logging模組定義的模組層級別的常用函數:
logging.debug(msg,*args,**kwargs) 建立一條層級為DEBUG的日誌記錄
logging.info(msg,*args,**kwargs) 建立一條層級為INFO的日誌記錄
logging.warning(msg,*args,**kwargs) 建立一條層級為WARNING的日誌記錄
logging.error(msg,*args,**kwargs) 建立一條層級為ERROR的日誌記錄
logging.critical(msg,*args,**kwargs) 建立一條層級為CRITICAL的日誌記錄
logging.log(level,*args,**kwargs) 建立一條層級為level的日誌記錄
logging.basicConfig(**kwargs) 對root logger進行一次性配置
4.logging模組的Formatter,Handler,Logger,Filter對象
logger:產生日誌的對象
Filter:過濾日誌的對象
Handler:接收日誌然後控制列印到不同的地方,FileHandler用來列印到檔案中,StreamHandler用來列印到終端
Formatter對象:可以定製不同的日誌格式對象,然後綁定給不同的Handler對象使用,以此來控制不同的Handler的日誌格式
logger是第一級過濾,然後才能到handler,我們可以給logger和handler同時設定level
logging配置,代碼執行個體:
LOGGING = {
‘version‘: 1,
‘disable_existing_loggers‘: False,
‘formatters‘: {
‘standard‘: {
‘format‘: ‘[%(asctime)s][%(threadName)s:%(thread)d][task_id:%(name)s][%(filename)s:%(lineno)d]‘
‘[%(levelname)s][%(message)s]‘
},
‘simple‘: {
‘format‘: ‘[%(levelname)s][%(asctime)s][%(filename)s:%(lineno)d]%(message)s‘
},
‘collect‘: {
‘format‘: ‘%(message)s‘
}
},
‘filters‘: {
‘require_debug_true‘: {
‘()‘: ‘django.utils.log.RequireDebugTrue‘,
},
},
‘handlers‘: {
#列印到終端的日誌
‘console‘: {
‘level‘: ‘DEBUG‘,
‘filters‘: [‘require_debug_true‘],
‘class‘: ‘logging.StreamHandler‘,
‘formatter‘: ‘simple‘
},
#列印到檔案的日誌,收集info及以上的日誌
‘default‘: {
‘level‘: ‘INFO‘,
‘class‘: ‘logging.handlers.RotatingFileHandler‘, # 儲存到檔案,自動切
‘filename‘: os.path.join(BASE_LOG_DIR, "xxx_info.log"), # 記錄檔
‘maxBytes‘: 1024 * 1024 * 5, # 日誌大小 5M
‘backupCount‘: 3,
‘formatter‘: ‘standard‘,
‘encoding‘: ‘utf-8‘,
},
#列印到檔案的日誌:收集錯誤及以上的日誌
‘error‘: {
‘level‘: ‘ERROR‘,
‘class‘: ‘logging.handlers.RotatingFileHandler‘, # 儲存到檔案,自動切
‘filename‘: os.path.join(BASE_LOG_DIR, "xxx_err.log"), # 記錄檔
‘maxBytes‘: 1024 * 1024 * 5, # 日誌大小 5M
‘backupCount‘: 5,
‘formatter‘: ‘standard‘,
‘encoding‘: ‘utf-8‘,
},
#列印到檔案的日誌
‘collect‘: {
‘level‘: ‘INFO‘,
‘class‘: ‘logging.handlers.RotatingFileHandler‘, # 儲存到檔案,自動切
‘filename‘: os.path.join(BASE_LOG_DIR, "xxx_collect.log"),
‘maxBytes‘: 1024 * 1024 * 5, # 日誌大小 5M
‘backupCount‘: 5,
‘formatter‘: ‘collect‘,
‘encoding‘: "utf-8"
}
},
‘loggers‘: {
#logging.getLogger(__name__)拿到的logger配置
‘‘: {
‘handlers‘: [‘default‘, ‘console‘, ‘error‘],
‘level‘: ‘DEBUG‘,
‘propagate‘: True,
},
#logging.getLogger(‘collect‘)拿到的logger配置
‘collect‘: {
‘handlers‘: [‘console‘, ‘collect‘],
‘level‘: ‘INFO‘,
}
},
}
Python常用模組(二)