2012-03-09 84 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