1. 程式人生 > 程式設計 >Django多程序滾動日誌問題解決方案

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',...
  }
  ...
}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。