1

这个问题是这个 4 岁的问题没有答案的简单版本Django management command doesn't show logging output from python library

我有一个命令:

class Command(BaseCommand):
  def handle(self, *args, **options):
  ...
  MyParser(data)

在 MyParser 中:

logger = logging.getLogger(__name__)

Class MyParser:
   def __init__(self, data):
       logger.info('hello')

为什么当我运行命令时记录器不显示到标准输出?打印出来没问题,但我需要一个记录器

PS:

我试过了,但它没有改变任何东西

from parser import logger
root_logger = logger
root_logger.setLevel(logging.INFO)
MyParser(data)
4

3 回答 3

5

我将基于您没有正确配置最有可能的日志记录配置这一事实。默认情况下,除了django.requests(或类似的东西)之外没有任何日志记录。

如果您希望您的日志消息出现,您需要一些东西来捕获并将您的消息转发给适当的处理程序。

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'formatters': {
        'console': {
            'format': '%(asctime)s %(name)-12s %(levelname)-8s %(message)s',
        },
    },
    'handlers': {
        'console': {
            'class': 'logging.StreamHandler',
            'formatter': 'console',
        },
    },
    'loggers': {
        '': {
            'level': 'INFO',
            'handlers': ['console'],
        },
    },
}

(我 - 无耻地 -从这篇关于 django 日志的博客文章中提取并删除了这个代码块)

于 2019-08-07T16:13:19.983 回答
2

我 90% 确定这将是一个配置问题,而不是您错误地使用了 logger。

在我看来,Django 日志记录文档并没有让生活变得更轻松。

首先,将此添加到您的设置 .py 文件中,替换任何其他LOGGING =语句:

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'handlers': {
        'console': {
            'class': 'logging.StreamHandler',
        },
    },
    'loggers': {
        'django': {
            'handlers': ['console'],
            'level': 'INFO',
        },
        '': {
            'handlers': ['console'],
            'level': 'INFO',
        },
    },
}

注意''记录器,它在那里捕获所有日志消息(而默认只捕获来自 django 本身的消息)。

如果仅此一项不起作用,请尝试在设置中设置 DEBUG=True (显然不是在生产中)。对于为什么需要这样做,文档说,“默认只在 DEBUG=True 时显示日志记录”。

于 2019-08-07T16:08:31.343 回答
0

我遇到了同样的问题,因为我忘记了我是这样定义我的 cron 工作的:

0 * * * * cd <path> && <path>/venvs/env/bin/python <path>/manage.py schedule_tasks >> cron.log 2>&1

因此,我将日志记录语句定向到文件“cron.log”!

于 2020-06-05T07:37:23.283 回答