2010-07-05 3 views
6

리눅스 서버에 Django 앱이 있습니다. 보기 중 하나에서 어떤 형식의 print 명령이 실행되고 일부 문자열이 인쇄됩니다. 인쇄 된 문자열이 무엇인지 어떻게 알 수 있습니까? 이런 것들이 보관되어있는 로그가 있습니까?Django 앱에서 인쇄 할 때 어디로 이동합니까?

답변

4

출력은 django가 시작된 터미널에 있어야합니다. (직접 시작하지 않으면 읽을 방법이 없다고 생각합니다.)

링크 된 링크가 지적되었으므로 print을 사용하지 않는 것이 좋습니다. 예외가 발생할 수 있습니다. 그러나 이것이 유일한 이유는 아닙니다 : 이러한 목적으로 만들어진 모듈 (예 : logging)이 있으며 훨씬 더 많은 옵션이 있습니다.

This site (이것은 2008 년의 경우에도) 내 문을 확인 :

을 당신이보기 내부에서 무슨 일이 일어나고 있는지 알고 싶다면, 가장 빠른 방법은 인쇄 문에 드롭하는 것입니다. 개발 서버은 인쇄 문을 터미널에 직접 출력합니다. JavaScript 경고()에 대한 서버 측 대안입니다.

로깅을 사용하면 더 세련된이되고 싶다면 파이썬의 로깅 모듈 (표준 라이브러리의 일부)을 사용하는 것이 좋습니다. 당신은 당신의 settings.py에서 구성 할 수 있습니다 : 여기에 그는 설명합니다, 당신은 또한 debug-mode를 사용하거나 django-debug-toolbar를 사용할 수 디버깅-목적을 위해 (사이트의 모양)

을 할 것.

희망이 있습니다. :)

+0

올바른 내용입니다. 또한 아파치를 사용하여 서버에 파일을 저장하고 있다면 mod_wsgi는 'print'문을 실행할 때마다 복구 할 수없는 오류가 발생한다는 것을 알고 있습니다. 예 : 만약 당신이'print '작업을 끝내면 OK! "를 실행하면 아파치에 스크립트를 넣을 때이 줄에서 스크립트가 죽을 것이다. 이런 이유로, 장고 앱에서 인쇄를 사용하지 않아도됩니다. – linked

+0

@linkedlinked : 적절한 구성 지시문을 사용하지 않는 경우에만. –

1

인쇄물은 "./manage.py runserver"또는 Joschua와 같이 다른 변형으로 잘 보입니다. 시작한 터미널에 인쇄됩니다. cron 등에서 FCGI를 실행하는 경우, 이는 단지 무의미하게 버려지고 완전히 잃게됩니다.

경고 또는 알림과 같은 "인쇄"가 필요한 곳에서는 출력을 캡처하여 어딘가에 배치하기 위해 syslog에 푸시하는 python의 로거 인스턴스를 사용합니다. 이로드되는 나는이 모듈 중 하나에 로깅의 인스턴스를 인스턴스화 - models.py 난 그냥 그것의 편의를 위해 고른 곳이 있었고, 난 요청에 굴러 오기 전에 항상 평가받을 줄 알았

import logging, logging.handlers 

logger = logging.getLogger("djangosyslog") 
hdlr = logging.handlers.SysLogHandler(facility=logging.handlers.SysLogHandler.LOG_DAEMON) 
formatter = logging.Formatter('%(filename)s: %(levelname)s: %(message)s') 
hdlr.setFormatter(formatter) 
logger.addHandler(hdlr) 

. 당신이 당신의 뷰에서 로거 또는 어떤 메시지를 호출 할 때 다음 :

logger = logging.getLogger("djangosyslog") 
logging.warning("Protocol problem: %s", "connection reset", extra=d) 

거기에는 .error(), .critical(), 그리고 더 - 핵심적으로 견실 한 자세한 내용은 http://docs.python.org/library/logging.html을 확인하십시오.

디버그 정보를 찾고 계신다면 Rob Hudson의 디버그 도구 모음은 훌륭합니다. 저는 자주 개발 과정에서이 도구를 자주 사용합니다. 주어진 페이지를 생성하는 데 사용 된 SQL을 포함하여 현재 요청 및 응답에 대한 데이터를 제공합니다. 컨텍스트/응답에 관심이있는 문자열 인 문자열을 눌러 인쇄물과 같은 데이터에 삽입 할 수 있습니다. 그러나 다루기가 다소 어려웠습니다.

0

경고 : WSGI에서 인쇄 명령문을 사용하여 코드를 배포하려고하면 작업이 중단 될 것으로 예상됩니다. 대신 로깅 모듈을 사용하십시오.

2

인쇄을 사용하지 마십시오. 배포하면 표준 출력으로 인쇄되고 WGSI는 중단됩니다.

로깅을 사용하십시오. 개발 목적으로 설정하기가 정말 쉽습니다. 프로젝트에서 __init__.py :

import logging 
from django.conf import settings 

fmt = getattr(settings, 'LOG_FORMAT', None) 
lvl = getattr(settings, 'LOG_LEVEL', logging.DEBUG) 

logging.basicConfig(format=fmt, level=lvl) 
logging.debug("Logging started on %s for %s" % (logging.root.name, logging.getLevelName(lvl))) 

이제 로그하는 모든 항목이 stderr (이 경우 터미널)로 이동합니다.

logging.debug("Oh hai!") 

플러스 당신은 LOG_LEVEL 설정하여 settings.py의 상세를 제어 할 수 있습니다.

관련 문제