Ander
Ander

Reputation: 5644

How to log exceptions and errors into a file when using a Django stand alone script

I have created a stand alone script in Django, but although the logging seems to be correctly configured, it fails to log the stderr into a Django log file. I am using Python 3.6 with Django 2.1.

The content of the Django script 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 logging configuration in 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
        },
    },
}

Taking into account that the script must be run via python my_script.py, does somebody know how to get stderr to store messages into the log file?

Upvotes: 0

Views: 1329

Answers (1)

Ander
Ander

Reputation: 5644

Redirecting stderr to the log file would be an option, but I believe a simple try clause with a traceback is simpler and neat:

# 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

Upvotes: 1

Related Questions