python乾貨分享:使用logging記錄日誌信息

2020-12-11 科技叮鈴噹啷

僅僅將棧信息輸出到控制臺是遠遠不夠的,更為常見的是使用日誌保存程序運行過程中的相關信息,如運行時間、描述信息以及錯誤或者異常發生時候的特定上下文信息。

Python中自帶的logging模塊提供了日誌功能,它將logger的level分為5個級別,可以通過Logger.setLevel(lvl)來設置,其中DEBUG為最低級別,CRITICAL為最高級別. 默認的級別為WARNING。

logging lib包含以下4個主要對象:

(1) logger

logger是程序信息輸出的接口,它分散在不同的代碼中使得程序可以在運行的時候記錄相應的信息.並根據設置的日誌級別或filter來決定哪些信息需要輸出,並將這些信息分發到其關聯的handler。

常用的方法有Logger.setLevel()、 Logger.addHandler()、Logger.removeHandler()、Logger.addFilter()、Logger.debug()、 Logger.info()、Logger.warning()、Logger.error()、 etLogger()等。

(2)Handler

Handler用來處理信息的輸出,可以將信息輸出到控制臺、文件或者網絡。可以通過 Logger.addHandler()來給logger對象添加 handler,常用的handler有StreamHandler和FileHandler類。StreamHandler發送錯誤信息到流,而FileHandler類用於向文件輸出日誌信息,這兩個handler定義在logging的核心模塊中c其他的handler定義在logging.handles 模塊中,如 HTTPHandler、SocketHandler。

(3) Formatter

決定log信息的格式,格式使用類似於%(<dictionary key>)s的形式來定義,如'%(asctime)s - %(levelname)s - %(message)s'支持的key可以在Python自帶的文檔 LogRecord attributes 中査看

(4) Filter

用來決定哪些信息需要輸出。可以被handler和logger使用,支持層次關係,比如,如果設置了 filter名稱為A.B的logger,則該logger和其子logger的信息會被輸出, 如 A.B.、A.B.C.

logging.basicConfig([**kwargs])提供對日誌系統的基本配置,默認使用StreamHandler和Fonnatter並添加到root logger,字典參數如下所示。

我們通過修改上面的例子來看如何結合traceback和logging,記錄程序運行過程中的異常。

修改程序後在控制臺上對用戶僅顯示錯誤提示信息"Sorry,Exception occured,you accessed an element out of range",而開發人員如果需要debug可以在日誌文件中找到具體運行過程中的信息。

上面的代碼中控制運行輸岀到console上用的是print(),但這種方法比較原始,logging模塊提供了能夠同時控制輸出到console和文件的方法。

下面的例子中通過添加StreamHandler並設置日誌級別為logging.ERROR,可以在控制臺上輸出錯誤信息。

為了使Logging使用更為簡單可控,logging支持loggin.config進行配置,支持dictConfig和fileConfig兩種形式,其中fileConfig是基於configparser()函數進行解析,必須包含的內容為[loggers]、[handlers]和[formatters]。具體例子示意如下:

最後關於logging的使用,提以下幾點建議:

(1)儘量為logging取一個名字而不是採用默認,這樣當在不同的模塊中使用的時候,其他模塊只需要使用以下代碼就可以方便地使用同一個logger.因為它本質上符合單例模式。

import logging

logging.basicConfig(level=logging.DEBUG)

logger = logging.getLogger(__name__)

(2)為了方便地找出問題所在,logging的名字建議以模塊或者class來命名。

Logging名稱遵循按"."劃分的繼承規則,根是root logger, logger a.b的父logger對象為a。

(3)Logging R是線程安全的,不支持多進程寫入同一個日子文件,因此對於多個進程,需要配置不同的日誌文件。

相關焦點

  • Python之日誌處理(logging模塊)
    日誌是一種可以追蹤某些軟體運行時所發生事件的方法。軟體開發人員可以向他們的代碼中調用日誌記錄相關的方法來表明發生了某些事情。一個事件可以用一個可包含可選變量數據的消息來描述。此外,事件也有重要性的概念,這個重要性也可以被稱為嚴重性級(level)。
  • python學習之日誌輸出格式logging.basicConfig函數的使用
    python的logging.basicConfig函數 ,使用時粘貼到用例前,就可以打log了。logging模塊是python內置的標準模塊,主要用於輸出運行日誌,可以設置輸出日誌的等級,日誌保存路徑,日誌文件回滾等日誌等級:(從低到高)debug:調試代碼用的,信息比較詳細info:輸出正確的信息,按照正常的代碼運行
  • Python logging 模塊詳解
    Python logging 模塊定義了為應用程式和庫實現靈活的事件日誌記錄的函數和類。程序開發過程中,很多程序都有記錄日誌的需求,並且日誌包含的信息有正常的程序訪問日誌還可能有錯誤、警告等信息輸出,Python 的 logging 模塊提供了標準的日誌接口,可以通過它存儲各種格式的日誌,日誌記錄提供了一組便利功能,用於簡單的日誌記錄用法。
  • python中logging模塊詳解
    為什麼需要logging模塊用python寫代碼的時候,想看哪裡的輸出直接print就可以了。
  • Python的logging詳解
    可以直接向logger寫入日誌信息。logger並不是直接實例化使用的,而是通過logging.getLogger(name)來獲取對象,事實上logger對象是單例模式,logging是多線程安全的,也就是無論程序中哪裡需要打日誌獲取到的logger對象都是同一個。每個logger都有一個日誌的級別。
  • Python Logging 模塊完全解讀
    也就是說,在「測試」時,你可能只想看警告和錯誤信息,然而在「調試」時,你可能還想看到跟調試相關的信息。如果你還想列印出使用的模塊以及代碼運行的時間,那麼你的代碼很容易變得混亂。使用 logging 模塊,這些問題就能很容易地解決。logging 模塊可以:控制信息層級,僅記錄需要的信息。控制顯示或者保存日誌的時機。
  • 有了它,可以把Python裡Logging模塊扔掉了!
    中寫日誌,使用的是 Python 自帶的 logging 模塊,要實現既在終端輸出,又能寫文件,並且日誌文件還能 rotate ,代碼需要十多行:import loggingfrom logging.handlers import RotatingFileHandleros.makedirs('Logs', exists_ok=True)logger = log
  • 日誌的藝術 | 好文推薦
    如何控制這種類型的日誌是否輸出,後面也會詳細討論。(2)用戶行為日誌這種類型的日誌,記錄用戶的操作行為,用於大數據分析,比如監控、風控、推薦等等。這種日誌,一般是給其他團隊分析使用,而且可能是多個團隊,因此一般會有一定的格式要求,開發者應該按照這個格式來記錄,便於其他團隊的使用。當然,要記錄哪些行為、操作,一般也是約定好的,因此,開發者主要是執行的角色。
  • Unittest接口測試生成報告和日誌方法
    使用Python自帶的logging直接飲用即可import logginglog等級級別何時使用DEBUG詳細信息,典型地調試問題時會感興趣。需要注意的是,該選項要在filename指定時才有效format指定日誌格式字符串,即指定日誌輸出時所包含的欄位信息以及它們的順序。logging模塊定義的格式欄位下面會列出。datefmt指定日期/時間格式。
  • 一文教你讀懂 Python 中的異常信息
    前面我們說了很多異常的相關知識,但是我們應該如何利用好呢,這裡我們就重點說一下,如何通過記錄異常信息,方便後期程序的調試。下面讓我們看一個關於使用 requests 模塊的例子。首先需要導入 requests 包,使用 pip 即可。
  • 架構師之路--談架構師的基本素養和日誌處理
    下面是一如既往的乾貨時間,今天來聊聊日誌處理。  JAVA的日誌大家基本都在用slf4j。SLF4j(Simple Logging Facade for Java)是一個通用的日誌框架。裡面只定義了接口,是門面模式的典型代表。
  • 列印日誌竟然只曉得 Log4j?
    控制臺列印出的信息並沒有保存到日誌文件中,只能即時查看,在一屏日誌的情況下還可以接受。如果日誌量非常大,控制臺根本就裝不下。所以就需要更高級的日誌記錄 API(比如 Log4j 和 java.util.logging)。它們可以把大量的日誌信息保存到文件中,並且控制每個文件的大小,如果滿了,就存儲到下一個,方便查找。
  • 致Python愛好者:你要的Python,Pandas和Tensorflow的秘笈來了
    概要:不管你是python大牛,小牛,總會在無論是數據分析,還是人工智慧工作中遇到問題。無論你是數據分析還是深度學習,都需要一些獨門秘笈來解決自己的問題。本文就是為你而量身定製。要合併兩個DataFrame,我們應該使用'append':a.append(b)3.為什麼Tensorflow的Estimator不列印日誌?
  • 如何使用nRF Connect 的輔助日誌工具nRF Logger記錄APP日誌?
    概述在藍牙開發中,有一個日誌記錄輔助工具nRF Logger,是專門結合nRF Connect 使用的。當APP在後臺進行工作的時候,可以使用nRF Logger工具進行查看。使用方法一、在nRF Connect的首頁打開側面板,可以看到nRF Logger欄(如圖1工具欄位置)。點擊nRF Logger欄,這個時候有兩種情況,如果安裝了就直接打開軟體,如果沒有安裝,就會提示安裝,到應用市場下載就安裝之後就可以了。(如圖2nRF Logger首頁)。第一部分展示了在GitHub上面源碼位置。
  • 程式設計師因重複記錄日誌撐爆ELK被辭退!
    程式設計師因重複記錄日誌撐爆ELK被辭退! 由於日誌配置繁雜,很多同學喜歡直接cv其他項目或網上博客的配置文件,而不仔細研究每個配置項。最常見的就是重複記錄日誌,這不但給查看和統計帶來不必要麻煩,還會增加磁碟和日誌收集系統負擔。
  • Python與SEO應用第二期
    一、講義說明本期培訓主要是面向想通過python來提高SEO工作效率的SEOer或者是對python爬蟲感興趣的目標人群。培訓的主要內容是學習如何通過python來開發各種SEO工具,以及python爬蟲的開發。
  • 在WAS上使用第三方Log4j開源日誌工具包
    【IT168 技術】Log4j是常用的一種第三方日誌工具包。在WebSphere應用伺服器(以下簡稱WAS)上使用Log4j時,默認配置下Log4j.properties的配置有時會不生效,日誌會輸出到WAS的SystemOut.log中。
  • 【Python】建立gRPC服務端與.Net Core 客戶端
    由於需要接入其他平臺的OAuth 2.0,還要提供RESTful API獲取VMware vSphere的數據,這塊內容,.net core我更熟悉,所以鎖定ASP.NET Core,通過上兩篇,我們知道這裡只能通過python去獲取數據了,那麼我面臨的問題就是python與.net core的數據通信:方法一:使用Python的web
  • Java 日誌框架衝突問題排查與總結
    在已有假設都驗證失敗的情況下,需要收集更多的信息作出判斷,接下來就是要用對照實驗收集信息。於是我分別斷點了 A 和 B 兩個工程,觀察它們日誌實體的類型是否一致。結果發現兩者的日誌實體類型不一樣,A 的日誌實現是 Logback,B 的日誌實現是 Log4j2,很明顯 A 列印不出日誌是因為日誌實體不對,但是兩者都是用的同一個 LoggerFactory 創建 Logger 的。
  • 數據科學家需要簡潔的Python代碼
    有關更多信息,請查看優秀的cookiecutter文檔,它詳實地闡明了數據科學項目的基本原理。代碼版本控制— git這一點廣為人知,我將不作贅述。軟體開發的現代世界已經遠離2000年代以前陰暗的狂野西部。每個人和他的下屬都應該使用某種版本控制其項目。