Django 管理命令不显示我的库的日志

Django management command does not show logs of my library

这个问题是这个 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)

我 90% 确定这将是一个配置问题,而不是您使用记录器不正确。

在我看来,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(显然不是在生产环境中)。为什么可能需要这个,docs 说,"the default only displays log records when DEBUG=True"。

我将基于您没有正确配置您的日志记录配置这一事实,这是最有可能的。默认情况下,除了 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 日志记录中提取并剥离了这个代码块 from this blog post

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

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

因此我将日志语句定向到文件 "cron.log"!