Как отправить журналы приложений из приложения NodeJS в Elastic Stack, размещенный в Кубернетес? - PullRequest
3 голосов
/ 01 ноября 2019

Я создаю приложение NodeJS и пытаюсь использовать Elastic Stack для сбора логов. Журналы, которые мне нужны:

  • Журналы ошибок
  • Журналы приложений, такие как, пользователь вошел в систему, пользователь выполнил эту задачу, система выполнила эту задачу и т. Д.

Теперь мое приложение размещено в Kubernetes, и я развернул Elastic Stack также в том же кластере GKE. Теперь я новичок в Elastic Stack. У меня есть небольшая идея, что мы должны отправить данные в logstash, и он отправляет на упругий поиск. Тогда мы можем визуализировать в Кибане. Я пытался следовать нескольким учебникам, но до сих пор не имею четкого представления о том, как это сделать. Чтобы подключить мое приложение к стеку. Итак, можно мне знать ...

  • куда в стеке (упругий поиск, logstash или filebeat) я должен отправлять журналы,
  • как отправлять журналы изПриложение NodeJS для эластичного стека, размещенного в том же кластере Kubernetes,
  • какие инструменты мне следует использовать для выполнения этой работы.

Заранее спасибо ?

Обновление:Теперь мне удалось записать логи в файл в приложении узла, используя winston. Таким образом, он создает error.log и combined.log в корневом каталоге приложения:

const logger = winston.createLogger({
  level: 'info',
  format: winston.format.json(),
  defaultMeta: { service: 'user-service' },
  transports: [
    //
    // - Write to all logs with level `info` and below to `combined.log`
    // - Write all logs error (and below) to `error.log`.
    //
    new winston.transports.File({ filename: 'error.log', level: 'error' }),
    new winston.transports.File({ filename: 'combined.log' })
  ]
});

(в соответствии с моим файлом Docker WORKDIR /usr/src/app):

FROM node:lts as build-stage

WORKDIR /usr/src/app

ENV NPM_CONFIG_LOGLEVEL warn
COPY package.json package.json
COPY yarn.lock yarn.lock
RUN yarn install

COPY . .

RUN yarn build
RUN yarn install --production

FROM node:lts

WORKDIR /usr/src/app

COPY --from=build-stage /usr/src/app /usr/src/app

CMD yarn serve
EXPOSE 8000

Теперь у меня установлен filebatно он берет все остальные журналы от Nginx и прочее, но не это. Как сказать, чтобы получить именно эти два файла?

1 Ответ

3 голосов
/ 01 ноября 2019

Отказ от ответственности: я не являюсь разработчиком DevOps, но привык работать со стеком ELK с точки зрения пользователя.

Я думаю, что вы можете начать с 3 основных компонентов:

  • Logstash (или filebeat)
  • Сам ElasticSearch
  • Kibana

Logstash должен читать журналы, которые создает NodeJS (записывает в некоторый файл), и отправлять их вElasticSearch.

Поскольку вы используете K8S, есть вероятность, что приложение Node развернуто внутри некоторого POD. В этом случае вы можете рассмотреть возможность добавления контейнера с коляской с процессом Logstash в качестве одного из возможных решений. IMO - это наиболее гибкий подход, хотя, если вы запускаете много модулей на одном компьютере (узле), процессы logstash сожрут ваши процессоры. Если это проблема, вы можете настроить некоторый том, который будет содержать журналы от модулей, и настроить выделенный модуль с LogStash, который будет отображать все журналы от всех POD на узле узла.

В любом случаеПредполагается, что Logstash отправляет данные в ElasticSearch и отслеживает то, что было отправлено до сих пор. Если у вас есть много журналов, рассмотрите возможность создания одного индекса в ES в день с некоторым временем жизни (срок хранения), например, 1 неделя. Затем ES удалит данные, автоматически удалив индекс

В случае с Kubernetes кластер ES также может быть развернут в POD, он должен предоставлять порты для доступа (по умолчанию 9200 для http и 9300 для двоичного доступа). Если у вас мало служб, возможно, 2-3 серверов будет достаточно, вы даже можете начать с одного работающего модуля, если вам не нужна высокая доступность

Теперь Kibana. Это пользовательский интерфейс, который подключается к Elastic Search и позволяет нарезать данные вашего журнала. Вы можете фильтровать по уровням, хостам, сообщениям, что угодно, ES очень хорош для поиска, поэтому этот вариант использования очень хорошо поддерживается.

Опять же, что касается K8S, вы можете развернуть Kibana в модуле с открытым портом HTTP длядоступ из браузера. Обратите внимание, что к этому HTTP-порту будет обращаться браузер, который технически не является частью вашего кластера kubernetes, поэтому определите инфраструктуру K8S соответственно.

Это базовый стек, хотя базовый по-прежнему очень гибкий и может работатьдля реальных проектов.

...