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