使用 Django 独立脚本时如何将异常和错误记录到文件中
How to log exceptions and errors into a file when using a Django stand alone script
我在 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 将消息存储到日志文件中吗?
将 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
我在 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 将消息存储到日志文件中吗?
将 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