Сервер Django не отправляет логи в Logstash

Я использую стек ELK для централизованной регистрации с моего сервера Django. Мой стек ELK находится на удаленном сервере, и logstash.conf выглядит следующим образом:

input {
    tcp {
    port => 5959
    codec => json
  }
}
output {
  elasticsearch {
    hosts => ["xx.xx.xx.xx:9200"]
  }
}

Работают оба сервисаasticsearch и logstash (проверено с помощью docker-compose logs logstash).

В файле настроек сервера Django настроено ведение журнала, как показано ниже:

LOGGING = {
  'version': 1,
  'handlers': {
        'logstash': {
            'level': 'INFO',
            'class': 'logstash.TCPLogstashHandler',
            'host': 'xx.xx.xx.xx',
            'port': 5959, # Default value: 5959
            'version': 0, # Version of logstash event schema. Default value: 0 (for backward compatibility of the library)
            'message_type': 'django',  # 'type' field in logstash message. Default value: 'logstash'.
            'fqdn': True, # Fully qualified domain name. Default value: false.
            'tags': ['django.request'], # list of tags. Default: None.
        },
  },
  'loggers': {
        'django.request': {
            'handlers': ['logstash'],
            'level': 'DEBUG',
  },
}
}

Я запускаю свой сервер Django, и обработчик Logstash обрабатывает журналы, так как консоль не показывает журналы. Я использовал библиотеку python-logstash на сервере Django для создания вышеупомянутого conf, но журналы не отправляются на мой удаленный сервер.

Я проверил много вопросов, проверил, что службы работают и порты верны, но я понятия не имею, почему журналы не отправляются в Logstash.

Ответ 1

Глядя на конфигурацию, регистратор "django.request" установлен на уровень "DEBUG", а обработчик "logstash" установлен на уровень "INFO". Я предполагаю, что обработчик не будет обрабатывать сообщения DEBUG. Однако я не уверен.

Установите тот же уровень для регистратора и обработчика, чтобы проверить, что он работает.

Какой уровень использования зависит от того, что вы хотите от своих журналов. В этом случае, я думаю, уровень INFO будет достаточным.

Если вы еще не взгляните на запись в Django

ПРИМЕЧАНИЕ. Из комментариев, похоже, не решает проблему, но я надеюсь, что это будет полезно в любом случае.

UPDATE:

Я пробовал следующую конфигурацию, и он улавливает ошибки 404 и 500 в "debug.log".

LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'handlers': {
    'logfile': {
        'level': 'WARNING',
        'class': 'logging.FileHandler',
        'filename': os.path.join(PROJECT_DIR, 'debug.log'),
    },
},
'loggers': {
    'django.request': {
        'handlers': ['logfile'],
        'level': 'WARNING',
        'propagate': True,
    },
}}

В этой тестовой конфигурации обработчик logstash должен хотя бы получить сообщение /logrecord. Если не повезло, я предлагаю попробовать отладить logstash.TCPLogstashHandler и SocketHandler (унаследованный TCPLogstashHandler), чтобы удостовериться, что они получают испущенную запись.

Ответ 2

Ваша конфигурация логирования верна. Вы должны указать имя индекса в config-частиasticsearch в logstash conf. Обновите конфигурацию logstash до

input {
    tcp {
    port => 5959
    codec => json
  }
}
output {
  elasticsearch {
    hosts => ["xx.xx.xx.xx:9200"]
    manage_template => false
    index => "djangologs"
  }
}

Если вы используете облако Google или AWS, откройте порт/обновите правила брандмауэра.

Ответ 3

Я столкнулся с той же проблемой, но после долгих перестановок я заставил ее работать, изменив django.request на django.server. У меня возникла идея, когда я использовал только django в качестве имени регистратора в коде Python, а затем узнал фактический logger_name из данных журнала, хранящихся вasticsearch. Ниже обновленный код

LOGGING = {
  'version': 1,
  'handlers': {
        'logstash': {
            'level': 'INFO',
            'class': 'logstash.TCPLogstashHandler',
            'host': 'xx.xx.xx.xx',
            'port': 5959, # Default value: 5959
            'version': 0, # Version of logstash event schema. Default value: 0 (for backward compatibility of the library)
            'message_type': 'django',  # 'type' field in logstash message. Default value: 'logstash'.
            'fqdn': True, # Fully qualified domain name. Default value: false.
            'tags': ['django.request'], # list of tags. Default: None.
        },
  },
  'loggers': {
        'django.server': {  # Here is the change
            'handlers': ['logstash'],
            'level': 'DEBUG',
      }
  },
}

Обратитесь к этому для более подробной информации о регистрации в django.https://docs.djangoproject.com/en/1.11/topics/logging/#id3