2014-05-23 45 views
7

我正在處理有大量圖像的頁面,因此這會在此類控制檯中生成大量輸出。在我的開發環境我使用Django提供靜態和媒體,所以我得到了我的控制檯這個有很多:django - 如何過濾掉記錄的GET靜態和媒體消息?

... 
[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和我的輸出,但到目前爲止看着日誌記錄,我發現我可能會影響來自django的其他日誌記錄,但不是這樣。我甚至嘗試過,但它沒有工作:

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設置開始的請求。把這個整個文件在已安裝的應用程序,並與./manage.py runserver_quiet運行它(如果該命令文件是runserver_quiet.py

不能與logging模塊玩,因爲WSGIRequestHandler不使用它來顯示這些消息。 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行」(basehttp.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

的Django的最新版本使得它很容易用自己的LOGGING設置覆蓋默認的日誌記錄。

過濾掉所有GET請求到/static/目錄,添加以下到您的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, 
     }, 
    } 
} 

這裏是所有Django的默認記錄器爲1.10,你可以以同樣的方式重寫: https://github.com/django/django/blob/32265361279b3316f5bce8efa71f2049409461e3/django/utils/log.py#L18

這裏有什麼Django默認內置的記錄儀的描述做: https://docs.djangoproject.com/en/1.10/topics/logging/#id3

這裏的是在上面使用Django的CallbackFilter的文檔中的自定義過濾器掛鉤: https://docs.djangoproject.com/en/1.10/topics/logging/#django.utils.log.CallbackFilter

+0

好的解決方案!在我的情況下,'record.args [0]'有時是一個元組(例如在「破管」日誌消息),所以我使用下面的lambda inline而不是'skip_static_requests()'函數:'lambda記錄:不是isinstance(record.args [0],basestring)或不是任何([record.args [0] .startswith('GET '+前綴)作爲['/ static /']])中的前綴。 –

1

從Django的1.10,你可以爲「通過的runserver命令調用服務器收到請求的處理」配置django.server記錄。這是過濾媒體請求並專注於記錄器信息的快速方法。

添加到Django的日誌記錄設置:

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

Django文檔參考:Logging: django-server