2014-03-02 108 views
20

我試圖建立一個記錄器將登錄到控制檯(我想這是因爲我使用的是Papertrails的Heroku(Heroku的日誌記錄插件)和東西寫到控制檯將在Papertrails顯示,使其過濾和一切好Papertrail功能)Django的登錄到控制檯

在設置我第一次嘗試以下操作:

LOGGING = { 
    'handlers' = { 
     'file': { 
      'level': 'DEBUG', 
      'class': 'logging.FileHandler', 
      'filename': 'mysite.log', 
      'formatter': 'verbose' 
     }, 
     'console':{ 
      'level': 'DEBUG', 
      'class': 'logging.StreamHandler', 
     }, 
    }, 
    (...) 
    'loggers'={ 
     (...) 
     'page_processors': { 
      'handlers': ['console','file'], 
      'level': 'DEBUG', 
     } 
    } 
    (...) 
} 

爲每Django的登錄頁面(對於那些誰不使用夾層,page_processors是當你打開一個頁面時,Mezzanine會運行什麼;你可以認爲它們就像Django的視圖一樣,但它們只能執行上下文,而不是渲染)。

在page_processors.py我

import logging 
logger = logging.getLogger(__name__) 

@process_for(MyPage): 
def myfunc(request, Page): 
    logger.info('page_processor logging test') 
    print 'my page_processor print' 
    (...) 

當我刷新頁面我沒有看到記錄器,但我看到了打印和日誌文件:

[02/Mar/2014 23:07:10] INFO [myApp.page_processors:13] page_progessor logging test 

等我知道這個邏輯在起作用。在google搜索了一下之後,我發現了thisthis page恰恰解決了這個問題。他說默認logging.StreamHandler記錄到STDERR。如果我們想登錄到STDOUT你應該關鍵字參數「流」添加到logging.StreamHandler結構,因此配置處理器爲這樣:

'handlers':{ 
    (...) 
    'console':{ 
     'level': 'DEBUG', 
     'class': 'logging.StreamHandler', 
     'stream': sys.stdout 
    }, 
} 

原來,這仍然無法正常工作,而且我不沒有任何錯誤或任何錯誤,我仍然可以看到打印和文件日誌。只是不是控制檯記錄器。

發生了什麼事?

編輯: 我試過this,沒有什麼區別。

回答

19

我終於明白了。這是發生了什麼事。

當你定義使用getLogger一個記錄器,你給一個記錄器的名稱,在這種情況下

logger = logging.getLogger(__name__) 

,然後你必須定義一個同名的記錄日誌配置的行爲。在這種情況下,由於該文件位於模塊內,因此記錄器的名稱將變爲myApp.page_processors,而不是page_processors,因此LOGGING字典中名爲「page_processors」的記錄器不會被調用。那麼爲什麼記錄到文件工作?因爲在代碼中顯示的(...)中有另一個名爲'myApp'的記錄器,顯然它被調用,而那個記錄器寫入文件。

所以,要解決這個問題,只是適當地命名記錄:

LOGGING = { 
    # (...) 
    'loggers': { 
     # (...) 
     'myApp.page_processors': { 
      'handlers': ['console','file'], 
      'level': 'DEBUG', 
     } 
    } 
    # (...) 
} 
16

下面的腳本:

import logging, logging.config 
import sys 

LOGGING = { 
    'version': 1, 
    'handlers': { 
     'console': { 
      'class': 'logging.StreamHandler', 
      'stream': sys.stdout, 
     } 
    }, 
    'root': { 
     'handlers': ['console'], 
     'level': 'INFO' 
    } 
} 

logging.config.dictConfig(LOGGING) 
logging.info('Hello') 

寫入Hellosys.stdout,如可以通過它的輸出管道連接到文件進行驗證。所以你的問題可能在別的地方(或者可能是你想要的sys.stdout)。你可以試着用sys.__stdout__來看看這是否有所作爲。

+0

感謝。 __ stdout __不起作用。是的,我可以相信這個代碼沒什麼問題(畢竟我是從其他地方拿來的),但奇怪的是,即使是登錄文件也可以。還有其他建議嗎? – oneloop