python專案 多程序日誌分割

2021-10-12 05:50:12 字數 2597 閱讀 3348

前文說到uwsgi日誌分割,那個是屬於uwsgi專案的執行日誌,我們如果需要列印一些資訊的話,如果全放在裡面由於太多且多執行緒多程序會導致日誌錯亂,所以我決定再增加乙個程式執行日誌模組,然後踩坑開始了。

def setup_log(log_name):

# 建立logger物件。傳入logger名字

logger = logging.getlogger(log_name)

log_path = os.path.join("../project_log", log_name)

# 設定日誌記錄等級

logger.setlevel(logging.debug)

# interval 滾動週期,

# when="d", interval=1 表示每天生成乙個檔案

# backupcount 表示日誌儲存個數

file_handler = timedrotatingfilehandler(

filename=log_path, when="d", interval=1, backupcount=30

)# filename="mylog" suffix設定,會生成檔名為mylog.2020-02-25.log

# file_handler.suffix = "%y-%m-%d.log"

# extmatch是編譯好正規表示式,用於匹配日誌檔名字尾

# 需要注意的是suffix和extmatch一定要匹配的上,如果不匹配,過期日誌不會被刪除。

# file_handler.extmatch = re.compile(r"^\d-\d-\d.log$")

# 定義日誌輸出格式

file_handler.setformatter(

logging.formatter(

"[%(asctime)s] [%(thread)d] [%(process)d] [%(levelname)s] - %(module)s.%(funcname)s (%(filename)s:%(lineno)d) - %(message)s"))

logger.addhandler(file_handler)

return logger

然後執行了兩天都發現日誌沒有分割成功,然後各種調整也沒用,最後發現』d』選項是每次程式啟動,timedrotatingfilehandler就會在內部記錄乙個一天後的時間,時間到了才去分割日誌,由於我們專案還在開發測試中,每天都重啟幾次,所以導致一直不會分割,因此要更改其他方案。

t = self.rolloverat - self.interval

if self.utc:

timetuple = time.gmtime(t)

else:

timetuple = time.localtime(t)

dfn = self.basefilename + "." + time.strftime(self.suffix, timetuple)

if os.path.exists(dfn):

os.remove(dfn)

os.rename(self.basefilename, dfn)

每個程序在過了 rotate 時間點之後寫第一條日誌的時候,都會執行這個 dorollover,然後看目標檔案是否存在,存在就刪除,然後再把原日誌檔案重新命名,這樣四個程序一頓操作,最前面的當然就被刪除不見了,因此這個巨坑,又得換方案!

後來重新找logging庫的其他filehandler,發現了watchedfilehandler,這這個 filehandler 用於監視它所寫入日誌記錄的檔案。 如果檔案發生變化,它會被關閉並使用檔名重新開啟。(並且如果檔案不存在,會建立之)

那這樣的話,我們只需要改用這個,然後在寫乙個定時指令碼來執行mv操作即可,剛剛好之前uwsgi也有乙個定時分割日誌的指令碼,直接加在裡面,搞掂!

def setup_log(log_name):

# 建立logger物件。傳入logger名字

logger = logging.getlogger(log_name)

log_path = os.path.join("../project_log", log_name)

# 設定日誌記錄等級

logger.setlevel(logging.debug)

file_handler = watchedfilehandler(filename=log_path)

file_handler.setformatter(

logging.formatter(

"[%(asctime)s] [%(thread)d] [%(process)d] [%(levelname)s] - %(module)s.%(funcname)s (%(filename)s:%(lineno)d) - %(message)s"))

logger.addhandler(file_handler)

return logger

注意: [%(thread)d] [%(process)d]這兩個選項對於多執行緒多程序定位問題時有很大的幫助,雖然日誌仍然會錯亂,但是定位問題時更加精準。如果想要日誌不錯亂,應該需要加程序鎖,很麻煩而且嚴重影響效率,鄙人暫時才疏學淺,等以後有需要再繼續學習!

python多程序列印輸出 多程序列印日誌

多程序的日誌和多執行緒的日誌有一點區別。原因是 python 的 logging 包不支援程序共享鎖,所以來自不同的程序的日誌可能會混在一起。我們嘗試一下在上邊的例子裡加乙個基礎日誌。下邊是 import loggingimport multiprocessingfrom multiprocessi...

python多程序 python多程序

當有多個非相關任務需要處理時,並行能大大提高處理速度。這裡簡要介紹python的multiprocessing模組。簡單多程序編寫 當我們任務數量確定而且比較少的時候,可以手動為每個任務指定乙個程序來執行。import multiprocessing as mp def f a print a if...

python多程序 寫日誌問題

在使用 timedrotatingfilehandler python日誌切分的時候,遇到錯誤 os.rename source,dest permissionerror winerror 32 另乙個程式正在使用此檔案,程序無法訪問 是單程序的,最初遇到這個錯誤比較疑惑,最後發現是在 中 impo...