问题 Django记录自定义管理命令


我有一个名为的应用程序 main 在我的Django项目中。这个应用程序有几个我想记录的管理命令,但是没有任何东西出现在stdout中,具有以下配置:

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决赛。


10512
2018-03-09 10:56


起源

你用什么命令来记录输出? - second
我试过了 logging.info 和 logging.debug,但它们都不起作用。写完这个问题后,我注意到了 logging.warn  不 给我一个打印到stdout。 - damd


答案:


您需要命名您的记录器。目前您正在登录到根记录器,该记录器未被您正在寻找的处理程序捕获 main

而不是 logging.debug("message"), 你要

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

13
2018-03-09 14:27





不需要将“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,
        }
    }
}

2
2018-03-09 11:13



我尝试通过逐字复制粘贴你的示例代码但仍然没有得到任何stdout。 然而,当我插入 logging.warn('foo') 作为第一个声明,我确实在标准输出中打印。 logging.info 和 logging.debug 还是不行。 - damd


如果您使用cron注册这些自定义命令,则只需将输出重定向到文本文件即可“强制”记录。

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

这将在每天早上12点运行一个cron作业,任何指向stdout的内容(如python print语句)都将被转储到此文本文件中,并连接到日志文件中的任何现有文本。

如果您不使用cron,只需创建一个shell脚本,该脚本运行您需要运行的所有脚本并手动将它们定向到您想要的日志文件。

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

...等等。


-2
2018-03-09 13:23



谢谢,但这是我之前使用的方法。我正在尝试做正确的事情并尽可能使用Django的“内置”日志记录功能。 - damd
很公平。希望有人会介入并帮助你;我是原始的并且使用shell重定向。 :) - patrickn