導航:首頁 > 編程語言 > python3日誌模塊

python3日誌模塊

發布時間:2022-12-07 08:48:09

『壹』 python日誌—Python日誌模塊logging介紹

從事與軟體相關工作的人,應該都聽過「日誌」一詞。

日誌就是跟蹤軟體運行時事件的方法,為了能夠在程序運行過程中記錄錯誤。

通過日誌記錄程序的運行,方便我們查詢信息,以便追蹤問題、進行維護和調試、還是數據分析。

並且各編程語言都形成了各自的日誌體系和相應的框架。

日誌的作用總結:

首先我們要樹立一個觀點,那就是「不是為了記錄日誌而記錄日誌,日誌也不是隨意記的」。要實現能夠只通過日誌文件還原整個程序執行的過程,達到能透明地看到程序里執行情況,每個線程每個過程到底執行結果的目的。日誌就像飛機的黑匣子一樣,應當能夠復原異常的整個現場乃至細節。

在項目中,日誌這個功能非常重要,我們要重視起來。

在Python中,使用logging模塊來進行日誌的處理。

logging是Python的內置模塊,主要用於將日誌信息進行格式化內容輸出,可將格式化內容輸出到文件,也可輸出到屏幕。

我們在開發過程中,常用print()函數來進行調試,但是在實際應用的部署時,我們要將日誌信息輸出到文件中,方便後續查找以及備份。

在我們使用日誌管理時,我們也可以將日誌格式化成Json對象轉存到ELK中方便圖形化查看及管理。

logging模塊將日誌系統從高向低依次定義了四個類,分別是logger(日誌器)、handler(處理器)、filter(過濾器)和formatter(格式器)。其中由日誌器生成的實例將接管原本日誌記錄函數logging.log的功能。

說明:

我們先來思考下下面的兩個問題:

在軟體開發階段或部署開發環境時,為了盡可能詳細的查看應用程序的運行狀態來保證上線後的穩定性,我們可能需要把該應用程序所有的運行日誌全部記錄下來進行分析,這是非常耗費機器性能的。

當應用程序正式發布或在生產環境部署應用程序時,我們通常只需要記錄應用程序的異常信息、錯誤信息等,這樣既可以減小伺服器的I/O壓力,也可以避免我們在排查故障時被淹沒在日誌的海洋里。

那麼怎樣才能在不改動應用程序代碼的情況下,根據事件的重要性或者稱之為等級,實現在不同的環境中,記錄不同詳細程度的日誌呢?

這就是日誌等級的作用了,我們通過配置文件指定我們需要的日誌等級就可以了。

說明:

總結:

開發應用程序時或部署開發環境時,可以使用DEBUG或INFO級別的日誌獲取盡可能詳細的日誌信息,可以方便進行開發或部署調試。 應用上線或部署生產環境時,應用使用WARNING或ERROR或CRITICAL級別的日誌,來降低機器的I/O壓力和提高獲取錯誤日誌信息的效率。 日誌級別的指定通常都是在應用程序的配置文件中進行指定的。 不同的應用程序所定義的日誌等級會有所差別,根據實際需求來決定。

『貳』 python - 日誌記錄模塊(logging)的二次封裝

上篇文章 對logging做了基本介紹,我們可以使用logging來做日誌的簡單記錄。但實際項目應用時,我們一般會根據自身需要對其做二次封裝(loggingV2),然後在其他python文件中, 先import申明後直接調用。

廢話不多說,下面給幾個二次封裝的簡單示例:

示例一:

loggingV2.py - 封裝

logMain.py - 應用

示例二:

    對上述示例進行 模塊化封裝 ,如下log.py

則任何聲明了log模塊的python文件都可以調用logging日誌系統,如下logMain.py

示例三:

    對上述示例進行 定製化封裝 ,如下myLog.py

    需求:

    1)同時實現終端顯示與日誌文件保存

    2)日誌文件名除日期外,增加顯示時間,精確到秒

    3)日誌輸出級別可配置

    4)日誌保存路徑與文件名可配置

    5)日誌跨天(或者小時/分鍾),另生成新文件保存

改寫logMain.py,如下:

示例四:

    對上述示例進行 非同步線程封裝 ,如下myThreadLog.py

    需求:

        1)獨立線程處理日誌,不影響主程序性能

        2)使用隊列非同步處理日誌記錄

 繼續改寫logMain.py,如下:

    注意 - 線程相關操作函數(如下):

        1.threading.Thread() — 創建線程並初始化線程,可以為線程傳遞參數

        2.threading.enumerate() — 返回一個包含正在運行的線程的list

        3.threading.activeCount(): 返回正在運行的線程數量,與len(threading.enumerate())有相同的結果

        4.Thread.start() — 啟動線程

        5.Thread.join() — 阻塞函數,一直等到線程結束

        6.Thread.isAlive() — 返回線程活動狀態

        7.Thread.setName() — 設置線程名

        8.Thread.getName() — 獲取線程名

        9.Thread.setDaemon() — 設置為後台線程,這里默認是False,設置為True之後則主線程不會再等待子線程結束才結束,而是主線程結束意味程序退出,子線程也立即結束,注意調用時必須設置在start()之前;

        10.除了以上常用函數,線程還經常與互斥鎖Lock/事件Event/信號量Condition/隊列Queue等函數配合使用

『叄』 Python日誌模塊介紹

logging 模塊預定義了5種日誌級別,並根據它們所跟蹤的事件的級別或嚴重程度來命名,具體如下:

注意:

Logger 對象有三個功能:

Logger 對象的使用最廣泛的方法主要是:配置和記錄消息

當配置了 Logger 對象後,就可以使用 Logger.debug() , Logger.info() , Logger.warning , Logger.error , Logger.critical() 方法來創建日誌消息,只需將需要記錄的消息寫進括弧內即可

Handler 對象負責將日誌消息(基於日誌消息的嚴重性)分派給處理器的指定目標。在上一步中提到,可以使用 Logger.addHandler() 來添加零個或多個處理器對象。例如,演算法可以將所有日誌消息都發送到控制台,將 ERROR 或者更高級別的消息發送到磁碟文件。這就需要兩個單獨的處理器。

處理器有很多 種類 ,常用的主要有以下幾種:

Formatter 對象是用來配置日誌消息的最終輸出形式。其格式由 %(<dictionary key>)s 這樣的表達形式來組合成字元串。例如:

其中,可以設置的<dictionary key>可參考 LogRecord屬性

配置完後,我們就可以在我們演算法想要進行日誌記錄的地方調用 Logger.debug() , Logger.info() , Logger.warning , Logger.error , Logger.critical() 來進行日誌輸出了。比如:

當運行演算法時,你會看到控制台輸出以下內容

https://docs.python.org/3/howto/logging.html#logging-howto

閱讀全文

與python3日誌模塊相關的資料

熱點內容
數控三通編程 瀏覽:298
linux多終端 瀏覽:811
法律寫作pdf 瀏覽:144
國貨哪個品牌最好app 瀏覽:951
看哪個app給錢最多 瀏覽:178
編程靠經驗嗎 瀏覽:759
c教程pdf下載地址 瀏覽:573
製作視頻哪個app有瘦臉功能 瀏覽:649
linux查看線程內存 瀏覽:509
命令行簽名apk 瀏覽:92
網頁照片旋轉源碼 瀏覽:842
QQ會員頭像源碼 瀏覽:263
內核命令行 瀏覽:324
腳本提取源碼器 瀏覽:930
smo源碼 瀏覽:877
為什麼要搭建單獨伺服器 瀏覽:480
編譯器有什麼控制 瀏覽:893
希爾伯特pdf 瀏覽:645
php數組全數字 瀏覽:647
解密塔羅牌小程序源碼 瀏覽:862