2016-04-06 73 views
1

在PyCharm日誌記錄下運行/調試使用django.test.TestCase的單個測試時,不會顯示logger消息。我試着按照How can I see log messages when unit testing in PyCharm?的建議設置logging.basicConfig(level=logging.DEBUG),但那也沒有幫助。我懷疑這可能是django的TestCase設置干擾。在Pycharm下運行django測試的日誌輸出

在測試設置或運行器配置中是否有一些其他方式可以打開測試運行的調試日誌記錄?

我在settings.py樹立正確的現在的記錄是:

LOGGING = { 
    'version': 1, 
    'disable_existing_loggers': False, 
    'handlers': { 
     'console': { 
      'class': 'logging.StreamHandler', 
      'formatter': 'verbose' 
     }, 
     'file': { 
      'level': 'DEBUG', 
      'class': 'logging.handlers.TimedRotatingFileHandler', 
      'filename': '/var/log/em/mcqueen-dev.log', 
      'when': 'midnight', 
      'formatter': 'verbose', 
     }, 
    }, 
    'formatters': { 
     'verbose': { 
      'format': '%(asctime)s.%(msecs).03d - %(process)d - %(thread)d - %(levelname)8s - %(filename)s:%(lineno)d - %(funcName)s - %(message)s' 
     }, 
     'simple': { 
      'format': '%(asctime)s - %(levelname)s %(message)s' 
     }, 
    }, 
    'loggers': { 
     'mcqueen_api': { 
      'handlers': ['console', 'file'], 
      'level': os.getenv('DJANGO_LOG_LEVEL', 'DEBUG') 
     }, 
     'mcqueen_app': { 
      'handlers': ['console', 'file'], 
      'level': os.getenv('DJANGO_LOG_LEVEL', 'DEBUG') 
     }, 
     'mcqueen_base': { 
      'handlers': ['console', 'file'], 
      'level': os.getenv('DJANGO_LOG_LEVEL', 'DEBUG') 
     }, 
    }, 
} 
+0

請顯示您的settings.py文件? –

+1

你能分享你的情況下我建議的django_test配置嗎? –

回答

0

我認爲這將是對工作settings.py

LOGGING = { 
     'version': 1, 
     'disable_existing_loggers': False, 
     'formatters': { 
      'verbose': { 
    'format': "[%(asctime)s] %(levelname)s %(message)s", 
       'datefmt': "%d/%b/%Y %H:%M:%S" 
      } 
     }, 
     'handlers': { 
      'file': { 
       'level': 'DEBUG', 
       'class': 'logging.FileHandler', 
       'filename': '/var/log/django_practices.log', 
       'formatter': 'verbose' 
      }, 
      'console': { 
       'level': 'DEBUG', 
       'class': 'logging.StreamHandler', 
       'stream': sys.stdout, 
       'formatter': 'verbose' 
      }, 
     }, 
     'loggers': { 

      'django_test': { 
       'handlers': ['file', 'console'], 
       'level': 'DEBUG', 
      }, 
      'name_your_app': { 
       'handlers': ['file', 'console'], 
       'level': 'DEBUG', 
      } 

     } 
    } 

登錄configuation UnitTest file

import logging 
logger = logging.getLogger('django_test') 
logger.info('test_log') 

和日誌將出現。

+0

沒有運氣。 PyCharm測試輸出中仍然沒有日誌記錄輸出 –

+0

您是否在設置文件中添加'django_test'的日誌配置? –

+0

是的。輸出總是顯示django關於創建測試數據庫然後銷燬它的消息,而不是日誌記錄。但是,如果我在我的測試中顯示print(),它確實顯示在那裏,所以它絕對是一個控制檯窗口 –

1

This thread在stackoverflow解釋了您的日誌記錄輸出不顯示給控制檯的可能原因。顯然,django的unittest runner替換了全局的sys.stdout/sys.stderr,但是從django設置中指定的StreamHandler仍然與原始的sys.stdout/sys.stderr綁定在一起。解決的辦法是在執行過程中根據sys.stdout/sys.stderr的值在測試模塊的記錄器中添加流處理程序。

如果您希望記錄器記錄到您的測試用例的所有方法的控制檯,那麼您可能最好使用自定義基類(請參閱鏈接到線程以獲取更多詳細信息)以包裝添加/刪除的邏輯安裝/拆卸。

我更喜歡使用裝飾器來覆蓋各個測試方法。例如(使用由兒子林的回答提供的「django_test」記錄器配置):

import logging 
import sys 
from contextlib import contextmanager 

from django.test import TestCase 

@contextmanager 
def streamhandler_to_console(lggr): 
    # Use 'up to date' value of sys.stdout for StreamHandler, 
    # as set by test runner. 
    stream_handler = logging.StreamHandler(sys.stdout) 
    lggr.addHandler(stream_handler) 
    yield 
    lggr.removeHandler(stream_handler) 

def testcase_log_console(lggr): 
    def testcase_decorator(func): 
     def testcase_log_console(*args, **kwargs): 
      with streamhandler_to_console(lggr): 
       return func(*args, **kwargs) 
     return testcase_log_console 
    return testcase_decorator 

logger = logging.getLogger('django_test') 

class SomeTestCase(TestCase): 
    @testcase_log_console(logger) 
    def test_something(self):  
     logger.info('show something to console.') 
0

我認爲這是與您正在使用的測試運行做 - 假設你使用內置的Django的測試設置在PyCharm中,它應該已經設置了一個環境變量PYTHONUNBUFFERED=1,我認爲這是使輸出直接打印而不被緩衝並且僅在最後顯示(這正是我所假定的)。檢查這是在測試配置中設置的,如果不是那麼嘗試。

參見:Pycharm unit test interactive debug command line doesn't work(特別是如果你使用的是不同的測試運行)

0

當我想看看,而在測試工作的Django項目在PyCharm我把這個代碼片段文件中的日誌用測試:

import logging 
logger = logging.getLogger(__name__) 
logging.disable(logging.NOTSET) 
logger.setLevel(logging.DEBUG) 

在運行Django的測試電平,用於禁止記錄被設置爲高(50),其降低(如在線在上面的代碼#3)將導致該日誌將被顯示(或保存到文件 - 取決於正在使用的日誌處理程序)。