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.

Ответ 1

вам нужно пространство имен для вашего регистратора. в настоящее время вы регистрируетесь в корневом журнале, который не улавливается вашим обработчиком, который ищет main

а не logging.debug("message"), вы хотите

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

Ответ 2

Установка "потока" на 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,
        }
    }
}

Ответ 3

Если вы регистрируете эти пользовательские команды с помощью cron, вы можете "принудительно" вести журнал, просто перенаправляя вывод в текстовый файл.

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

Это будет выполнять задание cron в 12 утра каждое утро, и все, что направлено на stdout (например, инструкции печати python), будет сбрасываться в этот текстовый файл, объединенный с любым существующим текстом в файле журнала.

Если вы не используете cron, просто создайте единую оболочку script, которая запускает все сценарии, которые нужно запустить, и вручную направьте их в нужные файлы журнала.

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

... и т.д.