【问题标题】:Django logging of custom management commands自定义管理命令的 Django 日志记录
【发布时间】:2012-03-26 20:01:00
【问题描述】:

我的 Django 项目中有一个名为 main 的应用程序。这个应用程序有几个我想记录的管理命令,但在标准输出中没有显示任何内容,配置如下:

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。

【问题讨论】:

  • 你用什么命令来记录输出?
  • 我试过logging.infologging.debug,但它们都不起作用。写完这个问题后,我注意到logging.warn 确实给了我一个打印到标准输出的信息。
  • 听起来您的日志级别设置不正确。如果您想将其绑定到 verbosity 标志,请尝试类似 reinout.vanrees.org/weblog/2017/03/08/… 的操作。
  • 对于可能正在阅读此内容的其他人...根记录器默认为“警告”级别,因此正在使用的记录器很可能正在传播到根记录器(或者是根记录器)而不是这里声明的“主要”。

标签: python django logging


【解决方案1】:

没有必要将“流”设置为 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,
        }
    }
}

【讨论】:

  • 我尝试逐字复制粘贴您的示例代码,但仍然对标准输出一无所获。 然而,当我插入logging.warn('foo') 作为第一条语句时,我确实在标准输出中得到了打印。 logging.infologging.debug 仍然不起作用。
【解决方案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

...等等。

【讨论】:

  • 谢谢,但这是我之前使用的方法。如果可能,我正在尝试做正确的事情并使用 Django 的“内置”日志记录功能。
  • 很公平。希望有人会介入并帮助您;我是原始人,使用 shell 重定向。 :)
【解决方案3】:

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

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

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

【讨论】:

    猜你喜欢
    • 2023-04-10
    • 1970-01-01
    • 1970-01-01
    • 2016-03-28
    • 2020-04-02
    • 2015-12-15
    • 2016-04-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多