使用Django独立脚本时如何将异常和错误记录到文件中

时间:2018-09-06 13:49:51

标签: django python-3.6 django-2.1

我已经在Django中创建了一个独立的脚本,但是尽管日志记录似乎配置正确,但是它无法将 stderr 记录到Django日志文件中。我在 Django 2.1 中使用了 Python 3.6

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 :(得分:0)

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