2010-07-23 28 views
11

我有一個django支持的網站,我使用標準日誌記錄模塊來跟蹤網絡活動。Django網站中的Python日誌RotatingFileHandler存在問題

該日誌通過RotatingFileHandler完成,該日誌配置有10個日誌文件,每個文件1000000字節。日誌系統的工作原理,但是這是日誌文件,我得到:

-rw-r--r-- 1 apache  apache   83 Jul 23 13:30 hr.log 
-rw-r--r-- 1 apache  apache  446276 Jul 23 13:03 hr.log.1 
-rw-r--r-- 1 apache  apache  999910 Jul 23 06:00 hr.log.10 
-rw-r--r-- 1 apache  apache   415 Jul 23 16:24 hr.log.2 
-rw-r--r-- 1 apache  apache  479636 Jul 23 16:03 hr.log.3 
-rw-r--r-- 1 apache  apache   710 Jul 23 15:30 hr.log.4 
-rw-r--r-- 1 apache  apache  892179 Jul 23 15:03 hr.log.5 
-rw-r--r-- 1 apache  apache   166 Jul 23 14:30 hr.log.6 
-rw-r--r-- 1 apache  apache  890769 Jul 23 14:03 hr.log.7 
-rw-r--r-- 1 apache  apache  999977 Jul 23 12:30 hr.log.8 
-rw-r--r-- 1 apache  apache  999961 Jul 23 08:01 hr.log.9 

正如你可以看到它是一個爛攤子。最後日誌已被寫入文件hr.log.2(7月23日16:24),而不是hr.log,並logging documentation指出:

[...]例如,具有5 BACKUPCOUNT和app.log的基本文件名,您將獲得app.log,app.log.1,app.log.2,最高爲app.log.5。 正在寫入的文件始終是app.log。當這個文件被填充時,它被關閉並重命名爲app.log.1,並且如果文件app.log.1,app.log.2等存在,則它們被重命名爲app.log.2,app。 log.3等。

我在做什麼錯?


我的日誌配置文件是:

logger.conf:

[loggers] 
keys=root 

[handlers] 
keys=fileHandler 

[formatters] 
keys=simple 

#-------------------------------------------------------------------- 
# Formatters 
[formatter_simple] 
format=%(asctime)s - %(name)s - %(levelname)s - %(message)s 

#-------------------------------------------------------------------- 
# Handlers 
[handler_fileHandler] 
class=handlers.RotatingFileHandler 
level=DEBUG 
formatter=simple 
args=("/data/django/hr/hr.log",'a',1000000,10) 

#-------------------------------------------------------------------- 
# Loggers 
[logger_root] 
level=DEBUG 
handlers=fileHandler 

和我的Python模塊設置日誌系統:

logger.py

import os, logging 

# Load config file 
logger_config_file = \ 
    os.path.join(os.path.abspath(os.path.dirname(__file__)), 'logger.conf') 
logging.config.fileConfig(logger_config_file) 

# Create logger 
logger = logging.getLogger('hr_Logger') 

# Log start message 
logger.info("Logging system started") 

然後,在我的views.py頂我:

import logging 
from hr import logger 

log = logging.getLogger('hr.views') 
log.info('Load hr.views') 

[...] 
+1

我嘗試了建立本地與您的代碼,它工作正常。 我不禁注意到時間戳大多是:30和:03。特別是自14:03以來,看起來好像日誌文件在應用程序之外旋轉了。 一個想法:你確定這是唯一配置的日誌?它看起來有點像你有一些其他日誌代碼保持打開的文件句柄。在應用程序啓動時,該另一個句柄指向hr.log,然後從那時起轉到hr.2。 – 2010-07-25 14:47:37

+0

所以......你不是說記錄系統壞了,只是時間戳已經改變了?日誌文件是否按正確的順序旋轉?我只是通過相同的方法檢查旋轉日誌上的時間戳,並且它們的順序是正確的。我沒有任何正在處理日誌的日誌處理。看起來你可能有一個週期性的任務,可能觸及文件? – Kekoa 2011-02-11 06:30:18

+0

@Kekoa就像你說的那樣,日誌系統並沒有被破壞,只是它沒有像預期的那樣工作。不幸的是,我不再在這個項目上工作,而且我也無法測試任何可能的建議。謝謝。 – ssoler 2011-03-07 00:28:19

回答

7

當您的代碼運行多個進程時,我發現此行爲。

不幸的是沒有完美的選擇。

一些想法,你可以加入有:

  • 使用WatchedFileHandler(2.6新),並與外部程序作爲logrotate的旋轉
  • 使用日誌或其他日誌合計服務器
  • 使用Python日誌聚合sentry - 這對於django尤其有用,因爲您不僅可以記錄日誌消息,還可以記錄完整堆棧跟蹤和404s的異常情況。