2016-06-12 58 views
1

我有記錄的自定義配置views.py如下:Django不寫日誌到文件

logger = logging.getLogger(__name__) 
logger.setLevel(logging.DEBUG) 

# Handlers 
log_handlers = { 
    "terminal": logging.StreamHandler(), 
    "file_debug": logging.FileHandler("/var/log/eshot-api/{name}-{level}.log".format(name=__name__, level="DEBUG"), mode="w"), 
    "file_error": logging.FileHandler("/var/log/eshot-api/{name}-{level}.log".format(name=__name__, level="ERROR"), mode="w") 
} 

log_handlers["terminal"].setLevel(logging.INFO) 
log_handlers["file_debug"].setLevel(logging.DEBUG) 
log_handlers["file_error"].setLevel(logging.ERROR) 

# Formatters 
log_formatters = { 
    "terminal": logging.Formatter("[%(name)s]::[%(levelname)s]@[%(asctime)s]: %(message)s"), 
    "file_debug": logging.Formatter("[%(levelname)s]@[%(asctime)s]: %(message)s"), 
    "file_error": logging.Formatter("[%(asctime)s]: %(message)s") 
} 

for k, v in log_formatters.items(): 
    log_handlers[k].setFormatter(v) 

我創建了一個目錄/var/log/eshot-api並獲准爲chmod 777到該目錄中,這樣就不會有寫作問題。

我還創建了一個功能如下:

def initial_log(request, method): 
    logger.debug("{ip} requested {path} with {kwargs} in {method} method".format(ip=ipaddr(request), path=request.get_full_path(), kwargs=str(dict(request.GET)), method=method)) 

method參數是通過「GET」或「POST」這個函數的字符串。

而且我已經把這個放在開始處,我的所有get功能ClassBasedView。但是,當我運行並刷新頁面幾次以生成一些日誌並查看我的日誌文件時,它們是空的。

而且,我想提一下,這是我自己的計算機中的開發服務器。


環境

  • 的Django 1.9.6
  • 的Ubuntu 14.04
  • 蟒蛇3.5.1
+1

[爲什麼Django日誌記錄不工作]的可能重複(http://stackoverflow.com/questions/36571284/why-django-logging-is-not-working)。同時告訴我們你的LOGGING配置。 – solarissmoke

回答

1

檢查settings.py爲LOGGING = {...}設置,並確保它已將disable_existing_loggers設置爲False

LOGGING = { 
    ... 
    'disable_existing_loggers': False, 
    .. 
} 

或完全刪除LOGGING設置。並添加處理程序記錄器:

logger.addHandler(log_handlers["file_debug"]) 

而且i'de喜歡advise you to configure LOGGING in your settings.py

工作的完整示例

urls.py

from django.conf.urls import url 
from .views import IndexView 

urlpatterns = [ 
    url(r'^$', IndexView.as_view()), 
] 

views.py

import logging 
from django.http import HttpResponse 
from django.views.generic import View 

logger = logging.getLogger(__name__) 
logger.setLevel(logging.DEBUG) 

# Handlers 
log_handlers = { 
    "terminal": logging.StreamHandler(), 
    "file_debug": logging.FileHandler("/var/log/eshot-api/{name}-{level}.log".format(name=__name__, level="DEBUG"), mode="w"), 
    "file_error": logging.FileHandler("/var/log/eshot-api/{name}-{level}.log".format(name=__name__, level="ERROR"), mode="w") 
} 

log_handlers["terminal"].setLevel(logging.INFO) 
log_handlers["file_debug"].setLevel(logging.DEBUG) 
log_handlers["file_error"].setLevel(logging.ERROR) 

# Formatters 
log_formatters = { 
    "terminal": logging.Formatter("[%(name)s]::[%(levelname)s]@[%(asctime)s]: %(message)s"), 
    "file_debug": logging.Formatter("[%(levelname)s]@[%(asctime)s]: %(message)s"), 
    "file_error": logging.Formatter("[%(asctime)s]: %(message)s") 
} 

for k, v in log_formatters.items(): 
    log_handlers[k].setFormatter(v) 

logger.addHandler(log_handlers['file_debug']) 

class IndexView(View): 
    def get(self, request): 
     logger.debug("requested {path} with {kwargs} in method".format(path=request.get_full_path(), kwargs=str(dict(request.GET)))) 
     return HttpResponse('app:index') 

settings.py

LOGGING = { 
    'disable_existing_loggers': False, 
} 
+0

感謝您的文檔,我會參考它。但是,這並沒有改變這個問題。日誌仍然是空的。我會嘗試文檔的方式,如果它行得通,那麼我會接受這個答案是有效的。謝謝... –

+0

我已經添加了一個完整的工作示例。 –