2009-05-28 48 views
1

我們有一個令人討厭的問題,我們發現當我們的服務器上運行mod_python時,python日誌記錄模塊的行爲不同。當執行的外殼,或與的runserver命令或mod_wsgi的Django的相同的代碼,該行爲是正確的:python日誌記錄模塊在使用mod_python時的不同行爲

import logging 
logger = logging.getLogger('site-errors') 
logging.debug('logger=%s' % (logger.__dict__)) 
logging.debug('logger.parent=%s' % (logger.parent.__dict__)) 
logger.error('some message that is not logged.') 

我們那麼下面的記錄:

2009-05-28 10 :36:43,440,DEBUG,error_middleware.py:31,[logger = {'name':'site-errors','parent':< logging.RootLogger instance at 0x85f8aac >,'handlers':[],'level' :0,'disabled':0,'manager':< logging.Manager實例在0x85f8aec >,'propagate':1,'filters':[]}]

2009-05-28 10:36:43,440,DEBUG,error_middleware.py:32,[logger.parent = {'name': 'root','parent':None,'handlers': [< logging 10, '禁用':在 0x8ec612c >, 在0x8ec616c >], '等級' < logging.handlers.RotatingFileHandler 實例.StreamHandler實例0, '傳播':1, '過濾器':[]}]

可以看到,沒有處理程序或級別設置爲兒童記錄器'站點錯誤'。

MONITOR_LOGGING_CONFIG = ROOT + 'error_monitor_logging.conf' 

import logging 
import logging.config 

logging.config.fileConfig(MONITOR_LOGGING_CONFIG) 

if CONFIG == CONFIG_DEV: 
    DB_LOGLEVEL = logging.INFO 
else: 
    DB_LOGLEVEL = logging.WARNING 

的第二個問題是,我們也是在駐留該文件夾error_middleware.py在__init__.py添加自定義處理程序:

日誌記錄配置在settings.py完成

import logging 
from django.conf import settings 
from db_log_handler import DBLogHandler 

handler = DBLogHandler() 
handler.setLevel(settings.DB_LOGLEVEL) 
logging.root.addHandler(handler) 

自定義處理程序無法在日誌中看到!

如果有人知道問題所在,請告訴我們!不要猶豫,要求提供更多信息。這肯定會有助於解決問題。

回答

5

如果不在settings.py中配置日誌記錄可能會更好。

我們將您的日誌記錄配置在我們的根目錄urls.py。這似乎更好。我沒有閱讀足夠的Django源文件來知道爲什麼,更確切地說,它更好,但它對我們來說工作得很好。我也會在這裏添加自定義處理程序。

另外,請仔細查看mod_wsgi。它似乎比mod_python更好。

+2

+1使用mod_wsgi。 wsgi應用程序意味着您可以部署在其他服務器軟件上,並且mod_python會特別吸引人。 – nosklo 2009-05-28 10:56:08

0

該問題沒有通過使用mod_wsgi解決。

我可以通過將完整的配置放入一個文件來解決問題。混合文件和代碼配置似乎會造成apache問題(無論是使用mod_wsgi還是mod_python)。

使用帶有文件配置自定義日誌處理程序,我必須做到以下幾點:

import logging 
import logging.config 
logging.custhandlers = sitemonitoring.db_log_handler 
logging.config.fileConfig(settings.MONITORING_FILE_CONFIG) 

從設置。py我無法導入sitemonitoring.db_log_handler,所以我必須將此代碼放入根urls.py

在config文件中,我指的是DBLogHandler與下面的語句

[handler_db] 
class=custhandlers.DBLogHandler() 
level=ERROR 
args=(,) 

PS:注意custhandler「屬性」是動態創建的,可以有另外一個名字。這是使用動態語言的優勢。

0

您似乎沒有發佈所有相關信息 - 例如,您的日誌記錄配置文件在哪裏?

你說:

當執行在 殼,或與的runserver 命令或mod_wsgi的Django的相同的代碼,其行爲 是正確的

你不」請確認您顯示的日誌輸出是來自這些環境之一還是來自mod_python運行。它看起來不錯 - 在你的代碼中,你將處理程序添加到根目錄,而不是記錄器的「站點錯誤」。您還在處理程序上設置了一個級別,而不是記錄器 - 所以您不希望在日誌記錄輸出中看到爲「站點錯誤」記錄器設置的級別,neh?可以在記錄器和處理程序上設置級別,但它們不盡相同,儘管它們以相同的方式過濾事件。

有關自定義處理程序,如果你看一下配置日誌文件很容易解釋的問題,請參閱

http://docs.python.org/library/logging.html(搜索「之類條目指示」)

這說明任何處理類描述配置文件是日誌包名稱空間中的eval()'d。因此,通過將logging.custhandlers綁定到您的自定義處理程序模塊,然後在配置文件中聲明「custhandlers.MyCustomClass」,eval()會產生預期的結果。你也可以同樣做了

logging.sitemonitoring = sitemonitoring

和指定的處理程序類作爲

sitemonitoring.db_log_handler.DBLogHandler

這將很好的工作(只要db_log_handler子包已被導入)。

順便提一下,人們有時會在settings.py中配置日誌記錄時出現問題,這是由於Django的導入魔法導致了循環導入問題。我通常在settings.py中配置日誌記錄,除非要導入某些Django位(例如在django.db中 - 因爲應用程序導入邏輯位於django.db中,所以如果嘗試在settings.py中導入django.db.x)。

相關問題