前文說到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...