AWS Elastic Beanstalk с использованием python (django)
Как вы управляете журналами приложений в эластичном бобовом стебле AWS? Я имею в виду, что вы записываете журналы приложений в какой файл?
Я использую следующую конфигурацию ведения журнала в своей среде разработки, но это не работает при развертывании в AWS.
Спасибо заранее!
DEBUG_LOG_DIR = BASE_DIR + "/django_debug.log"
LOGGING = {
'version': 1,
'disable_existing_loggers': True,
# How to format the output
'formatters': {
'standard': {
'format' : "[%(asctime)s] %(levelname)s [%(name)s:%(lineno)s] %(message)s",
'datefmt' : "%d/%b/%Y %H:%M:%S"
},
},
# Log handlers (where to go)
'handlers': {
'null': {
'level':'DEBUG',
'class':'django.utils.log.NullHandler',
},
'log_file': {
'level':'DEBUG',
'class':'logging.handlers.RotatingFileHandler',
'filename': DEBUG_LOG_DIR,
'maxBytes': 50000,
'backupCount': 2,
'formatter': 'standard',
},
'console':{
'level':'INFO',
'class':'logging.StreamHandler',
'formatter': 'standard'
},
'mail_admins': {
'level': 'ERROR',
'class': 'django.utils.log.AdminEmailHandler',
},
},
# Loggers (where does the log come from)
'loggers': {
'repackager': {
'handlers': ['console', 'log_file'],
'level': 'DEBUG',
'propagate': True,
},
'django': {
'handlers':['console'],
'propagate': True,
'level':'WARN',
},
'django.db.backends': {
'handlers': ['console', 'log_file'],
'level': 'WARN',
'propagate': False,
},
'': {
'handlers': ['console', 'log_file'],
'level': 'DEBUG',
},
}
}
Ответы
Ответ 1
Хорошо, я понял способ сделать это.
Сначала я подключился через ssh к машине ec2, затем создаю папку в /var/log под названием app_logs с пользователем root:
mkdir /var/log/app_logs
После этого я сделал следующее:
cd /var/log/
chmod g+s app_logs/
setfacl -d -m g::rw app_logs/
chown wsgi:wsgi app_logs/
Это гарантирует, что все файлы, созданные в этой папке, будут иметь wsgi как владелец и будут доступны для записи для группы, к которой принадлежит файл.
Я должен был сделать это, потому что заметил, что файл журнала, созданный приложением django, имеет root как владельца и группу владельца, но приложение запускается через пользователя wsgi.
Наконец, я сменил DEBUG_LOG_DIR на/var/log/app_logs/django_debug.log
Ответ 2
У меня была похожая проблема, но на Elastic Beanstalk, поэтому я создал файл конфигурации (например, applogs.config) в папке .ebextensions
приложения. Это создает папку app-logs, если ее там еще нет, и устанавливает права доступа к файлу и владельца, чтобы приложение могло записывать туда свои журналы.
commands:
00_create_dir:
command: mkdir -p /var/log/app-logs
01_change_permissions:
command: chmod g+s /var/log/app-logs
02_change_owner:
command: chown wsgi:wsgi /var/log/app-logs
Наконец, в ваших настройках Django:
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'handlers': {
'file': {
'level': 'DEBUG',
'class': 'logging.FileHandler',
'filename': '/var/log/app-logs/django.log',
},
},
'loggers': {
'django': {
'handlers': ['file'],
'level': 'DEBUG',
'propagate': True,
},
},
}
Кроме того, если вы хотите, чтобы ваш журнал был доступен из журналов beanstalk с помощью Интернета, добавьте его в свой файл в .ebextensions
files:
"/opt/elasticbeanstalk/tasks/taillogs.d/django.conf":
mode: "000755"
owner: root
group: root
content: |
/var/log/app-logs/django.log
Ответ 3
Есть простой способ, который не требует настройки beanstalk.
В настройках django в разделе LOGGING настроен обработчик, направленный на файл '/opt/python/log/{log_file_name}'. Затем журналы могут быть доступны через меню среды beanstalk в разделе "Журналы".
LOGGING = {
...,
'handlers': {
'logfile': {
'level': 'DEBUG',
'class': 'logging.handlers.RotatingFileHandler',
'filename': '/opt/python/log/{log_file_name}',
},
},
'loggers': {
'debugger': {
'level': 'DEBUG',
'handlers': ['logfile'],
'propagate': False,
},
}
Это место указано в документации:
https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/using-features.logging.html#health-logs-instancelocation
Ответ 4
Как начинающий с точки зрения разрешений Linux, мне потребовалось некоторое время, чтобы заставить его работать. Подводя итог приведенным выше ответам, у меня наконец получилось следующее:
logging.config
commands:
00_create_dir:
command: mkdir -p /var/log/app-logs
01_change_permissions:
command: chmod g+s /var/log/app-logs
02_change_default_owner:
command: setfacl -d -m g::rw /var/log/app-logs
03_change_owner:
command: chown wsgi:wsgi /var/log/app-logs
settings.py
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'handlers': {
'file': {
'level': 'DEBUG',
'class': 'logging.FileHandler',
'filename': '/var/log/app-logs/django.log',
},
},
'loggers': {
'django': {
'handlers': ['file'],
'level': 'DEBUG',
'propagate': True,
},
},
}
При этом я могу просматривать журналы в виде отдельного раздела, используя 'eb logs' или в среде Beanstalk, раздел "logs".
Ответ 5
По умолчанию в эластичном шланге вы можете увидеть журналы ошибок django здесь.
/var/log/httpd/error_log