django日志使用TimeRotateFileHandler


如果使用django的settings.py設置日志會產生一些問題。

問題描述

報錯信息如下:

Traceback (most recent call last):
File "C:\Python27\lib\logging\handlers.py", line 78, in emit
self.doRollover()
File "C:\Python27\lib\logging\handlers.py", line 141, in doRollover
os.rename(self.baseFilename, dfn)
WindowsError: [Error 32] The process cannot access the file because it is being used by another process

使用windows自帶的資源管理器查看占用該文件的進程,在CPU標簽頁中搜索文件名即可:

可以發現有兩個進程同時占用日志文件,打開任務管理器也能找到兩個Python進程。如果殺死其中一個,另一個進程也會隨之消失。

解決方法

python manage.py runserver --noreload
這個命令表示不啟動監控文件變化的進程。

原因

Django默認啟用兩個進程,一個進程用來檢測文件變化,另一個進程是正經的服務器進程。settting.py這個文件被加載了兩次,也就是日志文件打開了兩次,如果是服務器進程先啟動,則看不出毛病來;如果是監控進程首先打開了從settings.py加載了日志,那么正經服務器進程就無法再次加載日志了。

代碼

如果手動設置日志


from logging.handlers import TimedRotatingFileHandler

def get_log():
LOG_DIR = os.path.join(os.path.expanduser("~"), "json_manager", "logs")
if not os.path.exists(LOG_DIR):
os.mkdir(LOG_DIR)
logHandler = TimedRotatingFileHandler(os.path.join(LOG_DIR, "crawler.log"),
when='D', # 以when為單位
interval=3, # 每個日志文件為interval個when
backupCount=15, # 保留15個when
encoding='utf8')
logFormat = logging.Formatter("%(levelname)s %(asctime)s %(message)s")
logHandler.setFormatter(logFormat)
log = logging.getLogger("crawler") # 日志只允許在當前進程中訪問
log.addHandler(logHandler)
log.setLevel("INFO")
return log

參考資料

Django logging with RotatingFileHandler error


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2020 ITdaan.com