Reputation: 5644
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
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