Как записать исключения и ошибки в файл при использовании автономного скрипта Django - PullRequest
0 голосов
/ 06 сентября 2018

Я создал автономный скрипт в Django, но, хотя запись в журнал, кажется, настроена правильно, он не может записать stderr в файл журнала Django. Я использую Python 3,6 с Django 2,1 .

Содержимое скрипта Django my_script.py :

import os
import django
import logging


os.environ['DJANGO_SETTINGS_MODULE'] = 'my_project.settings'
django.setup()
logger = logging.getLogger('my_script')


def main():
    logger.debug('This message is logged')
    raise Exception('Error messages (stderr) are NOT logged!')


if __name__ == "__main__":
    main()

Моя конфигурация регистрации в my_project / settings.py:

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'formatters': {
        'verbose': {
            'format': '%(levelname)s %(asctime)s %(module)s %(process)d %(thread)d %(message)s'
        },
        'simple': {
            'format': '%(levelname)s %(message)s'
        },
    },
    'handlers': {
        'console': {
            'class': 'logging.StreamHandler',
        },
        'my_scrip_file': {
            'level':'DEBUG',
            'class':'logging.handlers.RotatingFileHandler',
            'filename': 'logs/my_script.log',
            'maxBytes': 1024*1024*5, # 5 MB
            'backupCount': 5,
            'formatter':'verbose',
        },
    },
    'loggers': {
        'my_script': {
            'handlers': ['my_scrip_file'],
            'level': os.getenv('DJANGO_LOG_LEVEL', 'DEBUG'),
            'propagate': True
        },
    },
}

Учитывая, что скрипт должен запускаться через python my_script.py, кто-нибудь знает, как получить stderr для хранения сообщений в файле журнала?

1 Ответ

0 голосов
/ 12 сентября 2018

Перенаправление stderr в файл журнала было бы вариантом, но я считаю, что простое предложение try с трассировкой проще и удобнее:

# my_script.py
import os
import django
import traceback
import logging


os.environ['DJANGO_SETTINGS_MODULE'] = 'my_project.settings'
django.setup()
logger = logging.getLogger('my_script')


def main():
    logger.debug('This message is logged')
    raise Exception('Error messages (stderr) now are also logged!')


if __name__ == "__main__":
    try:
        main()
    except Exception as e:
        logger.error(traceback.format_exc())
        raise e
...