2012-03-09 90 views
10

我在我的Django項目中有一個名爲main的應用程序。這個程序有,我想記錄一個幾個管理命令,但沒有什麼是沒有顯示在標準輸出具有以下配置:Django自定義管理命令的日誌記錄

LOGGING = { 
    'version': 1, 
    'disable_existing_loggers': False, 
    'handlers': { 
     'log_to_stdout': { 
      'level': 'DEBUG', 
      'class': 'logging.StreamHandler', 
      'stream': sys.stdout, 
      }, 
     }, 
    'loggers': { 
     'main': { 
      'handlers': ['log_to_stdout'], 
      'level': 'DEBUG', 
      'propagate': True, 
      } 
     } 
    } 

我在做什麼錯?我也嘗試過使用my_project.main,但那也不起作用。我正在使用1.3.0 final。

+0

您使用的登錄輸出什麼命令? – second 2012-03-09 13:48:22

+0

我試過'logging.info'和'logging.debug',但他們都沒有工作。寫完這個問題之後,我發現'logging.warn' * *會給我一個stdout的輸出。 – damd 2012-03-09 14:23:56

回答

12

您需要命名空間您的記錄器。目前要登錄到根記錄器,這是不是你的處理程序捕獲,這是尋找main

而非logging.debug("message"),你想

logger = logging.getLogger('main') 
logger.debug("message") 
1

將「stream」設置爲sys.stdout不是必需的。然而,你應該定義一個格式化:

例子:

LOGGING = { 
    'version': 1, 
    'disable_existing_loggers': False, 
    'formatters': { 
     'simple': { 
      'format': '%(levelname)s %(message)s' 
     }, 
    }, 
    'handlers': { 
     'log_to_stdout': { 
      'level': 'DEBUG', 
      'class': 'logging.StreamHandler', 
      'formatter': 'simple', 
      }, 
     }, 
    'loggers': { 
     'main': { 
      'handlers': ['log_to_stdout'], 
      'level': 'DEBUG', 
      'propagate': True, 
     } 
    } 
} 
+0

我試着複製粘貼你的示例代碼,但仍然沒有得到任何標準輸出。 *然而,當我插入'logging.warn('foo')'作爲第一條語句時,我確實在stdout中獲得了一個打印。 'logging.info'和'logging.debug'仍然不起作用。 – damd 2012-03-09 14:22:43

-2

如果您登記這些自定義的:用cron命令,就可以「力」的只是輸出重定向到一個文本文件記錄。

* 12 * * * python /path/to/my/custom/command.py >> /path/to/my/logfile.txt 

這將在上午12點,每天早上跑一個cron作業,並定向到標準輸出任何東西(如Python打印語句)將被轉儲到這個文本文件中,串聯在日誌文件中的任何現有的文本。

如果你不使用的cron,只需創建一個運行需要運行和手動引導他們到你想要的日誌文件中的所有腳本一個shell腳本。

python /path/to/my/custom/command.py >> /path/to/my/logfile.txt 

...等等。

+0

謝謝,但這是我以前使用的方法。如果可能的話,我試圖做正確的事情並使用Django的「內置」日誌記錄功能。 – damd 2012-03-09 14:23:22

+0

夠公平的。希望有人會介入並幫助你;我很原始,並使用shell重定向。 :) – patrickn 2012-03-09 14:44:36