Django 多程序下日誌切割導致錯亂問題解決方案

2022-08-22 18:48:12 字數 1711 閱讀 1898

在單程序下日誌的處理邏輯:

# 設定1小時的切割間割

第1步: 生成info.log

第2步: 寫入1小時日誌

第3步: 1小時之後,判定info.log-2018-11-30-1檔案是否存在,如果存在則刪除,然麼重新命名info.log為info.log-2018-11-30-1

第4步: 重新生成info.log並將logger的檔案控制代碼指向新的info.log檔案

在2個程序下日誌的處理邏輯:

# 設定1小時的切割間割

第1步: 生成info.log

第2步: 寫入1小時日誌

第3步: 1小時之後,1號程序先判定info.log-2018-11-30-1檔案是否存在,如果存在則刪除,然麼重新命名info.log為info.log-2018-11-30-1

第4步: 此時可能2號程序還在向info.log檔案進行寫入,由於寫入流已經開啟,檔案控制代碼指向的是原info.log, 即現在的info.log-2018-11-30-1,所以2程序會向info.log-2018-11-30-1中寫入

第5步: 等到2號程序下次寫日誌時,發現到了執行重新命名操作的時間了,但此時info.log-2018-11-30-1已經存在,然後他會進行刪除操作,這樣就會導致info.log-2018-11-30-1已存在的日誌丟失

第6步: 2號程序執行刪除操作後,接下來便會執行將info.log重新命名為info.log-2018-11-30-1的操作,這時候就會導致1號進行繼續向info.log-2018-11-30-1寫入,這樣就導致了日誌錯亂

python 日誌檔案寫入的時候,加入檔案獨佔鎖

基於此方案,目前有兩個安裝包實現這個功能, 安裝任何乙個即可:

concurrent-log-handlergithub上面一位大佬實現的,目前版本v0.9.20僅支援按檔案大小切割檔案

pyloghandlers是我基於concurrent-log-handler在保留核心功能的基本上做了一些改動,使其支援按大小、按日期切割檔案;

下面是pyloghandlers乙個簡短的用法介紹, 更詳細的用法,可以檢視文件 pyloghandlers on github:

logging = ,

},'handlers': ,

'time':

},'loggers': ,

}}def write_log(tag):

import logging.config

logging.config.dictconfig(logging)

for i in range(0, 500):

# import time

# time.sleep(0.001)

logger.debug(f' process tag ')

if __name__ == '__main__':

from multiprocessing import process

p_count = 1

p_list =

for i in range(p_count):

for p in p_list:

p.start()

for p in p_list:

p.join()

Django多程序滾動日誌的問題

使用rotatingfilehandler控制日誌檔案的大小 settings.py logging 設定rotatingfilehandler的maxbytes與backupcount,這兩個引數預設是0。當兩個引數都不為0時,會執行rallover過程 log檔案大小接近maxbytes時,新建...

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

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

liunx下nginx日誌切割

bin bash 此指令碼用於自動分割nginx的日誌,包括access.log和error.log 每天00 00執行此指令碼 將前一天的access.log重新命名為access x xx xx.log格式,並重新開啟日誌檔案 nginx日誌檔案所在目錄 log path usr local n...