簡體   English   中英

登錄 Python/Django 未按預期工作

[英]Logging in Python/Django not working as expected

我有以下用於日志記錄的處理程序配置:

    "handlers": {
      'system_file': {
        'level': 'DEBUG',
        'class': 'logging.handlers.TimedRotatingFileHandler',
        'filename': os.path.join(LOG_FOLDER, "all.log"),
        'formatter': 'verbose',
        'when': 'midnight',
        'backupCount': '30',
      }
   }

現在基於這個配置,我的日志應該在每個午夜輪換一次,即它應該創建日期明智的日志。

all.log文件中,所有內容都使用正確的時間戳正確記錄,但是當輪換發生時,我看不到備份日志文件(前一天日志文件)中的所有日志。

例如:

假設今天是 2019-10-29,all.log 文件開始存儲從 2019-10-29 00:00:00 到 2019-10-29 23:59:59 的所有日志。

第二天,即 2019 年 10 月 30 日(會發生輪換),當我 go 並檢查 all.log.2019-10-29 時,它包含從 2019 年 10 月 30 日 00:00:00 到 2019 年的日志- 10-30 01:00:00 和 all.log 文件從 00:00:00 開始存儲 2019-10-30 的日志。 所以基本上我所有的備份文件只包含第二天 00:00:00-01:00:00 的日志。

all.log 於 2019-10-30

[DEBUG 2019-10-30 00:00:07,463 cron.py:44] .....
[DEBUG 2019-10-30 00:00:11,692 cron.py:44] ....
[DEBUG 2019-10-30 00:00:13,679 cron.py:44] ....
.
.
[DEBUG 2019-10-30 00:00:55,692 cron.py:44] ....
[DEBUG 2019-10-30 00:59:58,679 cron.py:44] ....

SERVER SHUTS DOWN HERE AT 1AM AND STARTS STORING LOGS WHEN IT RESTARTS

[DEBUG 2019-10-30 07:00:02,692 cron.py:44] ....
[DEBUG 2019-10-30 07:00:04,679 cron.py:44] ....
.
.
*Till current time*

all.log.2019-10-29

[DEBUG 2019-10-30 00:00:07,463 cron.py:44] .....
[DEBUG 2019-10-30 00:00:11,692 cron.py:44] ....
[DEBUG 2019-10-30 00:00:13,679 cron.py:44] ....
.
.
.
[DEBUG 2019-10-30 00:00:52,463 cron.py:44] .....
[DEBUG 2019-10-30 00:00:55,692 cron.py:44] ....
[DEBUG 2019-10-30 00:59:58,679 cron.py:44] ....

all.log.2019-10-28

[DEBUG 2019-10-29 00:00:04,463 cron.py:44] .....
[DEBUG 2019-10-29 00:00:09,692 cron.py:44] ....
[DEBUG 2019-10-29 00:00:11,679 cron.py:44] ....
.
.
.
[DEBUG 2019-10-29 00:00:49,463 cron.py:44] .....
[DEBUG 2019-10-29 00:00:52,692 cron.py:44] ....
[DEBUG 2019-10-29 00:59:56,679 cron.py:44] ....

我正在使用按計划運行的服務器,服務器在凌晨 1 點關閉並在早上 7 點啟動。 這是我明白為什么會在凌晨 1 點發生這種奇怪行為的唯一原因,但我無法弄清楚為什么這會導致問題

任何幫助表示贊賞。

我正在使用 Django 1.9.7 和 Python 2.7.15

正如這里和許多其他地方所提到的,您不能將此處理程序用於並發日志記錄(在少數線程中運行的 Django 就是這種情況)。
潛在地,由於並發性,它們可以覆蓋自己。

要從多個進程登錄到單個目標,您可以使用以下方法之一:

  • 使用類似ConcurrentLogHandler的東西
  • 使用SysLogHandler (或 Windows 上的NTEventLogHandler
  • 使用SocketHandler將日志發送到單獨的進程以寫入文件
  • QueueHandlermultiprocessing.Queue一起使用,如此所述。

如果您真的需要使用基於時間的方法來執行此操作 - 您可以根據自己的條件重新定義ConcurrentRotatingFileHandler_shouldRollover()方法。
這不是完美的方式,但它應該工作。

您還可以查看正在解決此問題的 GitHub 上的項目:

暫無
暫無

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

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