Python Logging 日誌記錄入門學習

2022-09-28 06:21:08 字數 3340 閱讀 7185

python logging原來真的遠比我想象的要複雜很多很多,學習路線堪比git。但是又繞不過去,alternatives又少,所以必須要予以重視,踏踏實實認認真真的來好好學學才行。

學習logging的目的:

簡單指令碼還好,print足夠。

但是稍微複雜點,哪怕是三四個檔案加起來兩三百行**,除錯也開始變複雜起來了。

再加上如果是後台長期執行的那種指令碼,執行資訊的調eewpuvv查更是複雜起來。

一開始我還在各種查crontab的日誌檢視,或者是python後台執行檢視,或者是python stdout的獲取等等,全都找錯了方向。

真正的解決方案在於正確的logging。

記錄好了的話,我不需要去找python的控制台輸出stdout,也不需要找crontab的日誌,只需要檢視log檔案即可。

下面是python的logging學習記錄。

最簡單的日誌輸出(無檔案記錄)

import logging

log"出現了錯誤")

logging.info("列印資訊")

logging.warning("警告資訊")

首先,忘掉logging.info()! 忘掉logging.basicconfig()!

網上各種關於python logging的文章實在是太不體諒新手了,logging這麼複雜的東西竟然想表現得很簡單,還用各種簡單的東西做假象。

實際上我們真正要用起來的日誌,絕對是不會直接用logging.info()和logging.basi這樣的,這是此模組的官方推出來迷惑人的——看似讓你一鍵上手,快速看到結果,但是跟實際真的不搭!

所以為了後面解釋起來輕鬆,必須先警告這點:忘記它們倆!

記住,唯一要用到logging.什麼的,就只有logging.getlogger()這一次。

了解logging的工作流

不想上流程圖一類的東西,那樣反而更迷糊。

簡單說吧:

logging模組是會自動將你自定製的logger物件全域性化的,

也就是說,你在自己的模組裡只要定義了一次某個logger,比如叫log,那麼只要是在同乙個模組中執行的其他檔案都能讀取到它。

比如說,你在主檔案main.py中自定義了乙個logger,可能設定了什麼輸出檔案、輸出格式什麼的,然後你在main.py中會引用一些別的檔案或模組,比如sub.py,那麼在這個sub.py中你什麼都不用設定,只要用一句logger = logging.getlogger('之前在main.py定義的日誌名')即可獲得之前的一切自定義設定。

當然,被呼叫的檔案(先稱為子模組)中,用logging.getlogger('日誌名')時,最好在日誌名後加乙個.子名稱這樣的,比如main.sub。這樣輸出的時候就會顯示出來某條日誌記錄是來自於這個檔案裡了。當然,.前面的父級logger必須名字一致,是會被識別出來的!

然後,子日誌程式設計客棧還可以再子日誌,甚至乙個子模組可以再讓所有函式各又乙個子子日誌,比如main.sub.func1這樣的。logging都會根據.識別出來上下級關係的。

這樣一說,實際上也就是class類繼承的那種機制了。你按照父級名稱繼承,然後還可以改寫自己的新設定等。

了解了這些概念以後,才能來談**。實際上也就好理解多了。

設定logger的方法

看來看去,這篇文章說得比較全面也最清楚,以下很多都參考到它的內容:python 101: an intro to logging

一般想要自定義乙個logger,比如讓它輸出資訊時按照什麼格式顯示,輸出到哪個檔案,要不要輸出到螢幕一類,有三種方法可以達到設定:

三種達到的目的都是一樣的,字典用的人很少也不方便,配置檔案比較好用只是.ini的語法不是很方便讀,且不容易做到變數的動態設定,所以一般直接在python**裡寫就好。

常用設定語句

以下是程式主入口檔案的通用寫法,注意,一定要在主入口定義好logger,這樣其他所有的子模組才能夠繼承到。

# main.py

import logging

import othermod2 # 等下會呼叫到的子模組

def main():

"""這個檔案是程式的主入口

"""define_logger()

log = logging.getlogger('exampleapp')

# 輸出資訊測試

logger.info("program started")

result = othermod2.add(7, 8) # 這個是來自別的模組的方法

logger.info("done!")

def define_logger():

logger = logging.getlogger("exampleapp")

logger.setlevel(logging.info)

# 設定輸出格式

formatter = logging.formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')

# 設定日誌檔案處理器

fh = logging.filehandler("new_snake.log")

fh.setformatter(formatter) # 為這個處理器新增格式

# 設定螢幕stdout輸出處理器

sh = logging.streamhandler(stream=none)

sh.setformatter(formatter)

# 把處理器加到logger上

logger.addhandler(fh)

logger.addhandler(sh)

if __name__ == "__main__":

main()

下面是子模組中的呼叫方法(很簡單):

# othermod2.py

import logging

module_logger = logging.getlogger("exampleapp.othermod2")

def add(x, y):

# 這裡一句`getlogger`就繼承到父級的logger了

logger = logging.getlogger("exampleapp.othermod2.add")

# 輸出測試

logger.info("added %s and %s to get %s" % (x, y, x+y))

return x+y

注意,主檔案中,在什麼地方定義logger都可以,可以在main()裡也可以在任何單獨的函式或類裡,無所謂。只要在呼叫子模組之前定義好了就可以了。一旦定義過,日誌名就會被記下來,然後子模組就可以輕鬆繼承到。

本文標題: python logging 日誌記錄入門學習

本文位址: /jiaoben/python/229459.html

Python logging日誌模組

1.日誌的級別 日誌一共分成5個等級,從低到高分別是 1 debug 2.info 3.warning 4.error 5.critical說明 這5個等級,也分別對應5種打日誌的方法 debug info warning error critical。預設的是 warning,當在warning或...

python logging日誌模組

logging模組是python的乙個標準庫模組,由標準庫模組提供日誌記錄api的關鍵好處是所有python模組都可以使用這個日誌記錄功能。所以,你的應用日誌可以將你自己的日誌資訊與來自第三方模組的資訊整合起來。1.日誌級別 logging模組預設定義了以下幾個日誌等級,開發應用程式或部署開發環境時...

python logging日誌設定

log等級,輸出格式,輸出檔名,檔案讀寫模式 logging.basicconfig level logging.debug,format asctime s filename s line lineno d levelname s message s filename log.txt filemo...