2009-05-28 2 views
1

를 사용하여 우리는 불쾌한 문제가 있습니다. 셸에서, 또는 경우 runserver 명령 또는 mod_wsgi에 장고에 동일한 코드를 실행 할 때의 동작은 올바른 :다른 행동 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 : 43740, DEBUG, error_middleware.py : 31 [로거 = { '이름' '사이트 오류', '부모'0x85f8aac > '핸들러'에서 < logging.RootLogger 인스턴스 [] '레벨' 0 '관리자'1 '필터': []}]

,617 0x85f8aec >에서 < logging.Manager 인스턴스 '전파'0 '비활성화'

2009-05-28 DEBUG, error_middleware.py : 32, [logger.parent = { 'name': '루트', '부모': 없음, '처리자': [< 로깅 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에 로깅을 구성합니다. 이것은 더 잘하는 것 같습니다. 왜 장고 소스를 읽었는지 정확히 알 수는 없지만, 더 낫지 만 잘 작동하고 있습니다. 나는 커스텀 핸들러를 추가 할 것이다.

또한, mod_wsgi 자세히 보면. 그것은 mod_python보다 훨씬 좋은 것처럼 보인다.

+2

+1 to mod_wsgi. wsgi 응용 프로그램은 다른 서버 소프트웨어에 배포 할 수 있다는 것을 의미하며 mod_python은 특히 빠릅니다. – nosklo

0

문제는 mod_wsgi를 사용하여 해결되지 않습니다.

전체 구성을 하나의 파일로 배치하여이 문제를 해결할 수 있습니다. 파일과 코드 구성을 섞으면 아파치에 문제가 생기는 것 같다. (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에 넣어야합니다. custhandler '속성'을 동적으로 생성되고 다른 이름을 가질 수 있습니다 : config 파일에서

, 나는 다음과 같은 문

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

PS로 DBLogHandler를 참조하십시오. 이는 동적 언어를 사용하는 장점입니다.

0

로깅 구성 파일은 어디에 있습니까? 예를 들어, 로깅 구성 파일은 어디에 있습니까?

쉘, 또는 경우 runserver 명령 또는 mod_wsgi에 장고에 동일한 코드를 실행할 때 는, 동작 이

당신은 돈 올바른

'

당신은 그 말을 보여준 로깅 결과가 이러한 환경 중 하나에서 왔는지 아니면 mod_python 실행에서 왔는지 여부를 분명히하지 마십시오. 잘못 보이지 않습니다. 코드에서 루트에 핸들러를 추가하고 '사이트 오류'를 로깅하지 마십시오. 또한 로거가 아닌 처리기에서 레벨을 설정하기 때문에 로깅 출력에서 ​​'사이트 오류'로거 수준을 예상하지 못할 것입니다. 레벨은 로거와 핸들러에서 모두 설정할 수 있으며 같은 방식으로 이벤트를 필터링하지만 레벨은 같지 않습니다.

이 구성에 대한 기록 문서를 보면 쉽게 설명 사용자 정의 핸들러에 대한 문제, 이것은 어떤 핸들러 클래스에 설명한다고 설명한다 ("클래스 항목이 표시"를 검색)

http://docs.python.org/library/logging.html 참조 구성 파일은 로깅 패키지 네임 스페이스의 eval()입니다. 따라서 logging.custhandlers를 사용자 정의 처리기 모듈에 바인딩 한 다음 config 파일에서 "custhandlers.MyCustomClass"를 지정하면 eval()이 예상 한 결과를 생성합니다. 당신은뿐만 아니라만큼 (

을 sitemonitoring =

logging.sitemonitoring 일을 그냥 잘 작동하는

sitemonitoring.db_log_handler.DBLogHandler

로 핸들러 클래스를 지정한 수 db_log_handler 하위 패키지를 이미 가져 왔습니다.)

왜 사람들이 때로는 settings.py에서 로그인을 구성하는 데 문제가있는 이유는 Django의 가져 오기 마법 때문에 순환 가져 오기 문제가 발생하기 때문입니다. 일반적으로 settings.py에서 로깅을 구성하고 장고의 특정 비트 (예 : django.db)를 가져 오지 않으면 제대로 작동합니다. 응용 프로그램 가져 오기 논리가 django.db에 있기 때문에 시도 할 경우 순환 가져 오기 문제가 발생할 수 있습니다. settings.py에서 django.db.x 가져 오기).