Агрегированное ведение журнала OpenShift: анализ журнала доступа Apache

При использовании объединенного ведения журналов OpenShift я получаю журналы, которые хорошо загружаются в elasticsearch. Однако строка, зарегистрированная apache, заканчивается полем message.

Я хотел бы создавать запросы в Kibana, где я могу получить доступ к URL-адресу, коду состояния и другим полям по отдельности. Для этого необходимо выполнить специальный анализ журнала доступа Apache.

Как я могу это сделать?

Это пример записи в кибане:

{
  "_index": "42-steinbruchsteiner-staging.3af0bedd-eebc-11e6-af4b-005056a62fa6.2017.03.29",
  "_type": "fluentd",
  "_id": "AVsY3aSK190OXhxv4GIF",
  "_score": null,
  "_source": {
    "time": "2017-03-29T07:00:25.595959397Z",
    "docker_container_id": "9f4fa85a626d2f5197f0028c05e8e42271db7a4c674cc145204b67b6578f3378",
    "kubernetes_namespace_name": "42-steinbruchsteiner-staging",
    "kubernetes_pod_id": "56c61b65-0b0e-11e7-82e9-005056a62fa6",
    "kubernetes_pod_name": "php-app-3-weice",
    "kubernetes_container_name": "php-app",
    "kubernetes_labels_deployment": "php-app-3",
    "kubernetes_labels_deploymentconfig": "php-app",
    "kubernetes_labels_name": "php-app",
    "kubernetes_host": "itsrv1564.esrv.local",
    "kubernetes_namespace_id": "3af0bedd-eebc-11e6-af4b-005056a62fa6",
    "hostname": "itsrv1564.esrv.local",
    "message": "10.1.3.1 - - [29/Mar/2017:01:59:21 +0200] "GET /kwf/status/health HTTP/1.1" 200 2 "-" "Go-http-client/1.1"\n",
    "version": "1.3.0"
  },
  "fields": {
    "time": [
      1490770825595
    ]
  },
  "sort": [
    1490770825595
  ]
}

person Niko Sams    schedule 20.03.2017    source источник
comment
Для этого необходимо выполнить специальный анализ журнала доступа Apache. Как я могу это сделать? Это ваша проблема?   -  person Sagar V    schedule 29.03.2017


Ответы (1)


Отказ от ответственности: я не проверял это в openshift. Я не знаю, какой технический стек вы используете для своего микросервиса.

Вот как я это делаю в приложении весенней загрузки (с логбэком), развернутом в Kubernetes.

1. Используйте кодировщик logstash для возврата в журнал (это будет записывать журналы в формате Json, который более удобен для стека ELK).

У меня есть зависимость gradle, чтобы включить это

compile "net.logstash.logback:logstash-logback-encoder:3.5"

Затем настройте LogstashEncoder в качестве кодировщика в приложении, в logback-spring.groovy/logback-spring.xml (или logabck.xml).

2. Наличие фильтров или библиотек для ведения журнала доступа.

Для 2. Любое использование

А. Используйте библиотеку «net.rakugakibox.springbootext:spring-boot-ext-logback-access:1.6».

(Это то, что я использую)

Это дает в хорошем формате json, как показано ниже

{  
   "@timestamp":"2017-03-29T09:43:09.536-05:00",
   "@version":1,
   "@message":"0:0:0:0:0:0:0:1 - - [2017-03-29T09:43:09.536-05:00] \"GET /orders/v1/items/42 HTTP/1.1\" 200 991",
   "@fields.method":"GET",
   "@fields.protocol":"HTTP/1.1",
   "@fields.status_code":200,
   "@fields.requested_url":"GET /orders/v1/items/42 HTTP/1.1",
   "@fields.requested_uri":"/orders/v1/items/42",
   "@fields.remote_host":"0:0:0:0:0:0:0:1",
   "@fields.HOSTNAME":"0:0:0:0:0:0:0:1",
   "@fields.content_length":991,
   "@fields.elapsed_time":48,
   "HOSTNAME":"ABCD"
}

ИЛИ

B. Используйте Tee Filter

ИЛИ

C. Spring CommonsRequestLoggingFilter (на самом деле не проверял это)

Добавить определение компонента

    @Bean
    public CommonsRequestLoggingFilter requestLoggingFilter() {
        CommonsRequestLoggingFilter crlf = new CommonsRequestLoggingFilter();
        crlf.setIncludeClientInfo(true);
        crlf.setIncludeQueryString(true);
        crlf.setIncludePayload(true);
        return crlf;
    }

Затем установите для org.springframework.web.filter.CommonsRequestLoggingFilter значение DEBUG, это можно сделать с помощью application.properties, добавив:

logging.level.org.springframework.web.filter.CommonsRequestLoggingFilter=DEBUG
person so-random-dude    schedule 29.03.2017
comment
Обнаруживает ли fluentd и анализирует сообщения журнала JSON автоматически? - person Niko Sams; 30.03.2017
comment
Так и должно быть (взять с недоверием, так как я сам не проверял). Я не понимаю, почему fluentd не будет уважать структурированный журнал. - person so-random-dude; 30.03.2017