2014-12-19 94 views
6

我想配置我的Django settings.py正確使用Python的日誌記錄功能,但我已經在一個相當奇怪的問題絆倒:日誌django.request到文件,而不是控制檯

甚至閱讀docs,我只是後找不到如何將控制檯打印的調試請求行從Django重定向到我指定的文件;以下是我的日誌記錄配置的一部分。

LOGGING = { 
    'version': 1, 
    'formatters': { 
     'simple': { 
      'format': '%(levelname)s %(message)s' 
     }, 
    } 
    'handlers': { 
     'file_http': { 
      'level': 'DEBUG', 
      'class': 'logging.FileHandler', 
      'filename': r'C:\mysystem-http.log', 
      'formatter': 'verbose' 
     } 
    }, 
    'loggers': { 
     'django.request': { 
      'handlers': ['file_http'], 
      'level': 'DEBUG', 
      'propagate': False 
     } 
    } 
} 

我一直看到下面的格式的我的控制檯打印行:

[19/Dec/2014 11:48:03] "POST /api/v1/ HTTP/1.1" 200 10

如何可以我重定向這些使用日誌工具文件?

在此先感謝

+0

只是爲了記錄:如果你有一個多進程的設置,記錄到文件可能不會是這樣一個好主意,CF https://docs.python.org/3/howto/logging-cookbook.html#logging-to-a-single-file-from-multiple-processes – 2014-12-19 11:21:47

回答

3

這些輸出是由你的HTTP服務器(如果在開發模式下運行WSGIServer從標準庫)來處理。

settings.py的配置與它無關。

+0

沒錯。那麼,有沒有辦法使用日誌工具重定向該庫的輸出? – kstratis 2014-12-19 10:55:02

+0

這取決於你的堆棧。 – 2014-12-19 10:57:38

6

manage.py runserver不使用日誌記錄系統來處理消息,如[19/Dec/2014 11:48:03] "POST /api/v1/ HTTP/1.1" 200 10。取而代之,runserver使用sys.stderr(和sys.stdout用於其他消息)。如果你真的需要重定向這個文件,你可以覆蓋sys.stderr settings.py。示例 - 登錄sys.stderr到文件和控制檯:

import sys 

class Logger(object): 
    def __init__(self): 
     self.console = sys.stderr 
     self.file = open("runserver.log", "a", 0) 

    def write(self, msg): 
     self.console.write(msg) 
     self.file.write(msg) 

sys.stderr = Logger() 

在寫方法,您可以使用日誌系統登錄設置,以及處理這個問題。

更新:

在Django的1.10,runserver命令輸出通過日誌記錄: https://docs.djangoproject.com/en/dev/releases/1.10/#runserver-output-goes-through-logging

+0

這是如何更好然後bash重定向? – 2014-12-19 11:20:26

+0

簡單,它不是更好(也許一個原因是,你可以在同一時間登錄到文件+控制檯,並添加過濾器/ formaters等)。 – dikamilo 2014-12-19 11:25:30

相關問題