簡體   English   中英

用於登錄Django的文件描述符不會更新

[英]File descriptor doesn't update for logging in Django

我們使用Python(2.7)/ Django(1.8.1)和Gunicorn(19.4.5)作為我們的Web應用程序和管理程序(3.0)來監視它。 我最近遇到了2個日志問題:

  1. Django登錄前一天的日志(我們啟用了日志輪換)
  2. Django根本沒有記錄任何東西。

第一種情況是可以理解的,其中日志輪換更改了文件但Django未更新。

我重新啟動主管進程時修復了第二個方案。 這讓我再次相信文件描述符沒有在django進程中更新。

我來自這個SO線程 ,其中指出:

每個子進程都是一個獨立的進程,並且父進程中的文件句柄可以在fork之后在子進程中關閉(假設為POSIX)。 在任何情況下,都不支持從多個進程記錄到同一文件。

所以我幾乎沒有問題:

  1. 我的gunicorn有4個子進程,如果其中一個在寫入日志文件時失敗,另一個子進程將無法使用它嗎? 以及如何調試這些場景?

  2. 我個人發現python日志模塊中的調試錯誤很難。 有人可以指出如何調試這樣的錯誤,或者有什么方法可以讓補丁日志記錄不會無聲地失敗? *(Kindly read update section)*

  3. 我已經看到Django LogRotation導致問題類型1如上所述,而不是通過cron安排的一些腳本。 那么最好的是什么?

注意:日志配置不是問題。 我已經花了相當多的時間試圖解決這個問題。 此外,如果配置是問題,Django將不會在進程重新啟動后寫入日志文件。

更新

對於我的第二個問題,我看到日志記錄模塊提供了一個在失敗時提升事件的選項,盡管這在生產環境中是不鼓勵的。 文檔在這里 所以現在我的問題是如何在Django中設置它?

我想結束這個問題。 有點尷尬,2個月后似乎很愚蠢。 但我覺得愚蠢是學習的一部分,並希望這能成為偶然發現這一點的人的參考。

場景1:使用TimedRotatingFileHandler Django似乎不會更新文件描述符,因此寫入舊的日志文件,除非我們重新啟動supervisor。 我們還沒有找到這種行為的原因並更新原因如果找到。 現在我們使用WatchedFileHandler ,然后使用logrotate實用程序來旋轉日志。

場景2:這是一個愚蠢的問題。 當我使用一些字符串格式記錄時,我忘記提供足夠的變量,這就是記錄器錯誤的原因。 但這沒有得到宣傳。 但在我測試的本地時,我發現日志記錄模塊實際上是在拋出該錯誤,但是在模塊中的任何日志都沒有打印出來。 從這種情況中吸取的教訓是:

  1. 如果日志記錄存在問題,請查明字符串格式是否錯誤
  2. 使用log.debug('example: {msg}'.format(msg=msg))而不是log.debug('example: %s', msg)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM