2014-05-23 1 views
7

많은 이미지가있는 페이지에서 작업 중이므로이 유형의 콘솔에서 많은 출력을 생성합니다. 내 dev에 환경에서 나는 정적 및 미디어 제공하기 위해 장고를 사용, 그래서 난 내 콘솔이 많이 얻을 :django - 로깅으로 정적 및 미디어 메시지를 필터링하는 방법은 무엇입니까?

... 
[23/May/2014 12:41:54] "GET /static/css/style.css HTTP/1.1" 304 0 
[23/May/2014 12:41:55] "GET /static/js/jquery-1.7.1.min.js HTTP/1.1" 304 0 
[23/May/2014 12:41:55] "GET /static/js/jquery.form.js HTTP/1.1" 304 0 
... 
[23/May/2014 12:41:57] "GET /media/producto/Tapa_Santiago_Vazquez_SV.jpg HTTP/1.1" 304 0 
[23/May/2014 12:41:57] "GET /media/CACHE/images/producto/Barcos_y_mariposas_DVD_baja/2e3e3894ca08f88c03459e00f9018427.jpg HTTP/1.1" 304 0 
[23/May/2014 12:41:56] "GET /media/CACHE/images/producto/tapaDEJA_VU/fb67e92ffd47808a263db02ca016bc24.jpg HTTP/1.1" 304 0 
... 

의미있는 출력을 찾아하는 것이 매우 지루하게.

내 환경에서 이러한 메시지를 필터링하여보기 및 출력에 대한 GET을 볼 수 있지만 지금까지보고있는 로깅을보고 장고의 다른 로깅에 영향을 줄 수는 있지만 실제로는 그렇지 않습니다. 나는 이것을 시도했지만 작동하지 않았다 :

LOGGING = { 
    'version': 1, 
    'disable_existing_loggers': True, 
    'handlers': { 
     'null': { 
      'level': 'ERROR', 
      'class': 'django.utils.log.NullHandler', 
     }, 
    }, 
    'loggers': { 
     'django': { 
      'handlers': ['null'], 
      'level': 'ERROR', 
      'propagate': True, 
     }, 
    } 
} 

그런 종류의 출력을 필터링 할 수 있습니까?

감사합니다.

답변

3

해결 방법으로, 당신은 this snippet (from Django Snippets)를 사용할 수 있습니다

from django.conf import settings 
from django.core.servers import basehttp 
from django.core.management.commands.runserver import Command as BaseCommand 

class QuietWSGIRequestHandler(basehttp.WSGIRequestHandler): 
    def log_message(self, format, *args): 
     # Don't bother logging requests for paths under MEDIA_URL. 
     if self.path.startswith(settings.MEDIA_URL): 
      return 
     # can't use super as base is old-style class, so call method explicitly 
     return basehttp.WSGIRequestHandler.log_message(self, format, *args) 

def run(addr, port, wsgi_handler): 
    server_address = (addr, port) 
    httpd = basehttp.WSGIServer(server_address, QuietWSGIRequestHandler) 
    httpd.set_app(wsgi_handler) 
    httpd.serve_forever() 

class Command(BaseCommand): 
    def handle(self, addrport='', *args, **options): 
     # monkeypatch Django to use our quiet server 
     basehttp.run = run 
     return super(Command, self).handle(addrport, *args, **options) 

당신은 서버를 실행하는 사용자에게이 명령이 필요합니다. 기본적으로 로그 동작을 무시하여 MEDIA_URL 설정으로 시작하는 요청을 삭제합니다. WSGIRequestHandler이 메시지를 표시하는 데 사용하지 않기 때문에, 설치된 응용 프로그램이 전체 파일을 넣고 (명령 파일이 runserver_quiet.py 경우)

당신은 logging 모듈을 재생할 수 없습니다 ./manage.py runserver_quiet으로 실행합니다. It is directly written in the stderr stream. 장고의

+0

감사합니다! 나는 그것을 시도 할 것이다.즉, 로깅을 사용하면 그렇게 할 수 없습니다. 이유를 궁금해! –

+0

@MartinMassera 'WSGIRequestHandler' 클래스의 소스 코드를 보면, 메시지가 슬픈 듯이'stderr' 스트림에 직접 출력되는 것을 볼 수 있습니다. https://github.com/django/django/blob/master/django/core/servers/basehttp.py#L87 답변에이 설명을 추가했습니다. –

+0

코드가 작동하지 않습니다. "monkeypatch line"(basehttp.run = run)이 실행 기능을 변경하지 않는 것 같습니다. 그것은 여전히 ​​원래의 실행 함수를 사용하고 있습니다 ... –

0
from django.core.servers.basehttp import WSGIRequestHandler 

# Grab the original log_message method. 
_log_message = WSGIRequestHandler.log_message 

def log_message(self, *args): 
    # Don't log if path starts with /static/ 
    if self.path.startswith("/static/"): 
     return 
    else: 
     return _log_message(self, *args) 

# Replace log_message with our custom one. 
WSGIRequestHandler.log_message = log_message 

# Import the original runserver management command 
from django.core.management.commands.runserver import Command 

모자 팁 https://code.djangoproject.com/ticket/25704

5

최신 버전은 정말 쉽게 자신의 LOGGING 설정으로 기본 로깅을 재정의 할 수 있습니다. 모든 /static/ 디렉토리에 GET 요청을 필터링하려면

, 당신의 settings.py에 다음을 추가 : 여기

def skip_static_requests(record): 
    if record.args[0].startswith('GET /static/'): # filter whatever you want 
     return False 
    return True 

LOGGING = { 
    'version': 1, 
    'disable_existing_loggers': False, 
    'filters': { 
     # use Django's built in CallbackFilter to point to your filter 
     'skip_static_requests': { 
      '()': 'django.utils.log.CallbackFilter', 
      'callback': skip_static_requests 
     } 
    }, 
    'formatters': { 
     # django's default formatter 
     'django.server': { 
      '()': 'django.utils.log.ServerFormatter', 
      'format': '[%(server_time)s] %(message)s', 
     } 
    }, 
    'handlers': { 
     # django's default handler... 
     'django.server': { 
      'level': 'INFO', 
      'filters': ['skip_static_requests'], # <- ...with one change 
      'class': 'logging.StreamHandler', 
      'formatter': 'django.server', 
     }, 
    }, 
    'loggers': { 
     # django's default logger 
     'django.server': { 
      'handlers': ['django.server'], 
      'level': 'INFO', 
      'propagate': False, 
     }, 
    } 
} 

이 같은 방법으로 대체 할 수 있습니다 1.10의 장고의 기본 로거 모두 같습니다 를 https://github.com/django/django/blob/32265361279b3316f5bce8efa71f2049409461e3/django/utils/log.py#L18

여기 장고의 기본 내장 어떤 로거의 설명입니다이 수행 여기 https://docs.djangoproject.com/en/1.10/topics/logging/#id3

의이 위에서 사용 된 장고의 CallbackFilter의 문서는 사용자 정의 필터에 걸리지 : https://docs.djangoproject.com/en/1.10/topics/logging/#django.utils.log.CallbackFilter

+0

좋은 해결책! 나는 당신의'skip_static_requests()'함수 대신에 다음의 람다 인라인을 사용하고있다 :'lambda record : isinstance (record.args [0], basestring)가 아니거나 any ([record.args [0] .startswith ('GET '+ 접두사) 접두어는 ['/ static/']])''에 있습니다. –

1

장고 1.10에서 당신의 "의 runserver 명령에 의해 호출 된 서버가 수신 한 요청의 처리를위한"django.server 로깅을 구성 할 수 있습니다. 이것은 미디어 요청을 걸러 내고 로거 정보에 집중하는 빠른 방법입니다.

로깅 설정을 장고에 추가 :

loggers: { 
.... 
    'django.server': { 
     'handlers': ['console'], 
     'level': 'ERROR' # or INFO if you want to see the log 
    }, 
} 

장고 문서 심판 : Logging: django-server

관련 문제