Django多程序滾動日誌問題解決方案
這篇文章主要介紹了Django多程序滾動日誌問題解決方案,文中通過示例程式碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
使用RotatingFileHandler控制日誌檔案的大小
# settings.py LOGGING = { ... 'handlers': { ... 'file': { 'level': 'INFO','class': 'logging.RotatingFileHandler','filename': os.path.join(LOGS_DIR,'app.log'),'formatter': 'verbose','maxBytes': 1024,'backupCount': 5 },... } ... }
設定RotatingFileHandler的maxBytes與backupCount,這兩個引數預設是0。
當兩個引數都不為0時,會執行rallover過程:log檔案大小接近maxBytes時,新建一個檔案作為log的輸出,舊的檔案會被加上類似'.1'、'.2'的字尾。
舉個例子,如果backupCount=5,log file定義的名字為app.log,你會得到app.log,app.log.1,app.log.2 一直到 app.log.5。
然而被寫入日誌的永遠是app.log,寫滿了之後重新命名為app.log.1,如果app.log.1存在,app.log.1會先被重名名為app.log.2,依此類推。
另外,如果app.log.5存在,它會被刪除。
windows環境遇到的問題
PermissionError: [WinError 32] 另一個程式正在使用此檔案,程序無法訪問。
首先,Django預設啟用兩個程序,一個程序用來檢測檔案變化,另一個程序是正經的伺服器程序。settting.py這個檔案被載入了兩次,也就是日誌檔案打開了兩次,如果是伺服器程序先啟動,則看不出毛病來;如果是監控程序首先打開了從settings.py載入了日誌,那麼正經伺服器程序就無法再次載入日誌了。
如果你的Django專案是單程序的,那麼在啟動Django專案的時候使用--noreload就可以解決
python manage.py runserver 0.0.0.0:80 --noreload
noreload表示不啟動Django的監控程序,也就是說專案程式碼的改變不再會影響已經載入記憶體中的程式碼,這樣,Django就只會起一個程序。
但是,如果你的專案是多程序的,或者在某些單獨的模組,比如celery中為了使用Django的ORM而使用了django.setup()
os.environ.setdefault("DJANGO_SETTINGS_MODULE","myproject.settings") import django django.setup()
那麼就需要用另一個日誌模組解決
pip install concurrent-log-handler
在LOGGING中,用concurrent_log_handler.ConcurrentRotatingFileHandler代替logging.RotatingFileHandler
# settings.py LOGGING = { ... 'handlers': { ... 'file': { 'level': 'INFO','class': 'concurrent_log_handler.ConcurrentRotatingFileHandler',... } ... }
測試一下,問題解決
另外,如果是linux系統下的多程序Django,可以用ConcurrentLogHandler模組
pip install ConcurrentLogHandler
# settings.py LOGGING = { ... 'handlers': { ... 'file': { 'level': 'INFO','class': 'cloghandler.ConcurrentRotatingFileHandler',... } ... }
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。