ΠŸΡ€Π°ΠΊΡ‚ΠΈΡ‡Π΅ΡΠΊΠΎΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ELK. НастраиваСм logstash

Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅

Разворачивая ΠΎΡ‡Π΅Ρ€Π΅Π΄Π½ΡƒΡŽ систСму, ΡΡ‚ΠΎΠ»ΠΊΠ½ΡƒΠ»ΠΈΡΡŒ с Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒΡŽ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ большоС количСство Ρ€Π°Π·Π½ΠΎΠΎΠ±Ρ€Π°Π·Π½Ρ‹Ρ… Π»ΠΎΠ³ΠΎΠ². Π’ качСствС инструмСнта Π²Ρ‹Π±Ρ€Π°Π»ΠΈ ELK. Π’ Π΄Π°Π½Π½ΠΎΠΉ ΡΡ‚Π°Ρ‚ΡŒΠ΅ ΠΏΠΎΠΉΠ΄Ρ‘Ρ‚ Ρ€Π΅Ρ‡ΡŒ ΠΎ нашСм ΠΎΠΏΡ‹Ρ‚Π΅ настройки этого стСка.

НС ставим Ρ†Π΅Π»ΠΈ ΠΎΠΏΠΈΡΠ°Ρ‚ΡŒ всС Π΅Π³ΠΎ возмоТности, Π½ΠΎ Ρ…ΠΎΡ‚ΠΈΠΌ ΡΠΊΠΎΠ½Ρ†Π΅Π½Ρ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΈΠΌΠ΅Π½Π½ΠΎ Π½Π° Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΈ практичСских Π·Π°Π΄Π°Ρ‡. Π’Ρ‹Π·Π²Π°Π½ΠΎ это Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈ Π½Π°Π»ΠΈΡ‡ΠΈΠΈ достаточно большого количСства Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ ΠΈ ΡƒΠΆΠ΅ Π³ΠΎΡ‚ΠΎΠ²Ρ‹Ρ… ΠΎΠ±Ρ€Π°Π·ΠΎΠ², ΠΏΠΎΠ΄Π²ΠΎΠ΄Π½Ρ‹Ρ… ΠΊΠ°ΠΌΠ½Π΅ΠΉ достаточно ΠΌΠ½ΠΎΠ³ΠΎ, ΠΏΠΎ ΠΊΡ€Π°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅Ρ€Π΅ Ρƒ нас ΠΎΠ½ΠΈ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΠ»ΠΈΡΡŒ.

ΠœΡ‹ Ρ€Π°Π·Π²ΠΎΡ€Π°Ρ‡ΠΈΠ²Π°Π»ΠΈ стСк Ρ‡Π΅Ρ€Π΅Π· docker-compose. Π‘ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΠ³ΠΎ, Ρƒ нас Π±Ρ‹Π» Ρ…ΠΎΡ€ΠΎΡˆΠΎ написанный docker-compose.yml, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΠ» Π½Π°ΠΌ практичСски Π±Π΅Π· ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ ΠΏΠΎΠ΄Π½ΡΡ‚ΡŒ стСк. И Π½Π°ΠΌ казалось, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ±Π΅Π΄Π° ΡƒΠΆΠ΅ Π±Π»ΠΈΠ·ΠΊΠ°, сСйчас Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ Π΄ΠΎΠΊΡ€ΡƒΡ‚ΠΈΠΌ ΠΏΠΎΠ΄ свои Π½ΡƒΠΆΠ΄Ρ‹ ΠΈ всё.

К соТалСнию, ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ° Π΄ΠΎΠ½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ систСму Π½Π° ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ Π»ΠΎΠ³ΠΎΠ² ΠΎΡ‚ нашСго прилоТСния, с Ρ…ΠΎΠ΄Ρƒ Π½Π΅ ΡƒΠ²Π΅Π½Ρ‡Π°Π»Π°ΡΡŒ успСхом. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ, ΠΌΡ‹ Ρ€Π΅ΡˆΠΈΠ»ΠΈ, Ρ‡Ρ‚ΠΎ стоит ΠΈΠ·ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ, Π° ΠΏΠΎΡ‚ΠΎΠΌ ΡƒΠΆΠ΅ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒΡΡ ΠΊ ΠΈΡ… связям.

Π˜Ρ‚Π°ΠΊ, Π½Π°Ρ‡Π°Π»ΠΈ с logstash.

ΠžΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅, Ρ€Π°Π·Π²Ρ‘Ρ€Ρ‚Ρ‹Π²Π°Π½ΠΈΠ΅, запуск Logstash Π² ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π΅

Для развёртывания ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ docker-compose, описанныС здСсь экспСримСнты ΠΏΡ€ΠΎΠ²ΠΎΠ΄ΠΈΠ»ΠΈΡΡŒ Π½Π° MacOS ΠΈ Ubuntu 18.0.4.

ΠžΠ±Ρ€Π°Π· logstash, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±Ρ‹Π» прописан Ρƒ нас Π² исходном docker-compose.yml, это docker.elastic.co/logstash/logstash:6.3.2

Π•Π³ΠΎ ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для экспСримСнтов.

Для запуска logstash ΠΌΡ‹ написали ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ docker-compose.yml. МоТно ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ Π±Ρ‹Π»ΠΎ ΠΈΠ· ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки ΠΎΠ±Ρ€Π°Π· Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ, Π½ΠΎ ΠΌΡ‹ вСдь ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΡƒΡŽ Π·Π°Π΄Π°Ρ‡Ρƒ Ρ€Π΅ΡˆΠ°Π»ΠΈ, Π³Π΄Π΅ Ρƒ нас всё ΠΈΠ· docker-compose запускаСтся.

ΠšΡ€Π°Ρ‚ΠΊΠΎ ΠΏΡ€ΠΎ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹

Как слСдуСт ΠΈΠ· описания, logstash ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ ΠΊΠ°ΠΊ для ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΊΠ°Π½Π°Π»Π°, Π² этом случаС, Π΅ΠΌΡƒ Π½ΡƒΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ Ρ„Π°ΠΉΠ» *.conf ΠΈΠ»ΠΈ для Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΊΠ°Π½Π°Π»ΠΎΠ², Π² этом случаС Π΅ΠΌΡƒ Π½Π°Π΄ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ Ρ„Π°ΠΉΠ» pipelines.yml, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ, Π² свою ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ, Π±ΡƒΠ΄Π΅Ρ‚ ΡΡΡ‹Π»Π°Ρ‚ΡŒΡΡ Π½Π° Ρ„Π°ΠΉΠ»Ρ‹ .conf для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΊΠ°Π½Π°Π»Π°.
ΠœΡ‹ пошли ΠΏΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΌΡƒ ΠΏΡƒΡ‚ΠΈ. Он Π½Π°ΠΌ показался Π±ΠΎΠ»Π΅Π΅ ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½Ρ‹ΠΌ ΠΈ ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΡƒΠ΅ΠΌΡ‹ΠΌ. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ, ΠΌΡ‹ создали pipelines.yml, ΠΈ сдСлали Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡŽ pipelines, Π² ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π±ΡƒΠ΄Π΅ΠΌ ΠΊΠ»Π°ΡΡ‚ΡŒ Ρ„Π°ΠΉΠ»Ρ‹ .conf для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΊΠ°Π½Π°Π»Π°.

Π’Π½ΡƒΡ‚Ρ€ΠΈ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° Π΅ΡΡ‚ΡŒ Π΅Ρ‰Ρ‘ ΠΎΠ΄ΠΈΠ½ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» β€” logstash.yml. ΠœΡ‹ Π΅Π³ΠΎ Π½Π΅ Ρ‚Ρ€ΠΎΠ³Π°Π΅ΠΌ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ ΠΊΠ°ΠΊ Π΅ΡΡ‚ΡŒ.

Π˜Ρ‚Π°ΠΊ, структура Π½Π°ΡˆΠΈΡ… ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠ²:

ΠŸΡ€Π°ΠΊΡ‚ΠΈΡ‡Π΅ΡΠΊΠΎΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ELK. НастраиваСм logstash

Для получСния Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΠΎΠΊΠ° считаСм, Ρ‡Ρ‚ΠΎ это tcp ΠΏΠΎ ΠΏΠΎΡ€Ρ‚Ρƒ 5046, Π° для Π²Ρ‹Π²ΠΎΠ΄Π° Π±ΡƒΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ stdout.

Π’ΠΎΡ‚ такая простая конфигурация для ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ запуска. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ вСдь Π½Π°Ρ‡Π°Π»ΡŒΠ½Π°Ρ Π·Π°Π΄Π°Ρ‡Π° β€” Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ.

Π˜Ρ‚Π°ΠΊ, Ρƒ нас Π΅ΡΡ‚ΡŒ Π²ΠΎΡ‚ Ρ‚Π°ΠΊΠΎΠΉ docker-compose.yml

version: '3'

networks:
  elk:

volumes:
  elasticsearch:
    driver: local

services:

  logstash:
    container_name: logstash_one_channel
    image: docker.elastic.co/logstash/logstash:6.3.2
    networks:
      	- elk
    ports:
      	- 5046:5046
    volumes:
      	- ./config/pipelines.yml:/usr/share/logstash/config/pipelines.yml:ro
	- ./config/pipelines:/usr/share/logstash/config/pipelines:ro

Π§Ρ‚ΠΎ ΠΌΡ‹ здСсь Π²ΠΈΠ΄ΠΈΠΌ?

  1. Networks ΠΈ volumes Π±Ρ‹Π»ΠΈ взяты ΠΈΠ· исходного docker-compose.yml (Ρ‚ΠΎΡ‚ Π³Π΄Π΅ Ρ†Π΅Π»ΠΈΠΊΠΎΠΌ стСк запускаСтся) ΠΈ Π΄ΡƒΠΌΠ°ΡŽ, Ρ‡Ρ‚ΠΎ сильно здСсь Π½Π° ΠΎΠ±Ρ‰ΡƒΡŽ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π½Π΅ Π²Π»ΠΈΡΡŽΡ‚.
  2. ΠœΡ‹ создаём ΠΎΠ΄ΠΈΠ½ сСрвис (services) logstash, ΠΈΠ· ΠΎΠ±Ρ€Π°Π·Π° docker.elastic.co/logstash/logstash:6.3.2 ΠΈ присваиваСм Π΅ΠΌΡƒ имя logstash_one_channel.
  3. ΠœΡ‹ пробрасываСм Π²Π½ΡƒΡ‚Ρ€ΡŒ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° ΠΏΠΎΡ€Ρ‚ 5046, Π½Π° Ρ‚Π°ΠΊΠΎΠΉ ΠΆΠ΅ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠΉ ΠΏΠΎΡ€Ρ‚.
  4. ΠœΡ‹ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅ΠΌ наш Ρ„Π°ΠΉΠ» настройки ΠΊΠ°Π½Π°Π»ΠΎΠ² ./config/pipelines.yml Π½Π° Ρ„Π°ΠΉΠ» /usr/share/logstash/config/pipelines.yml Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°, ΠΎΡ‚ΠΊΡƒΠ΄Π° Π΅Π³ΠΎ ΠΏΠΎΠ΄Ρ…Π²Π°Ρ‚ΠΈΡ‚ logstash ΠΈ Π΄Π΅Π»Π°Π΅ΠΌ Π΅Π³ΠΎ read-only, просто Π½Π° всякий случай.
  5. ΠœΡ‹ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅ΠΌ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡŽ ./config/pipelines, Π³Π΄Π΅ Ρƒ нас Π»Π΅ΠΆΠ°Ρ‚ Ρ„Π°ΠΉΠ»Ρ‹ с настройками ΠΊΠ°Π½Π°Π»ΠΎΠ², Π² Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡŽ /usr/share/logstash/config/pipelines ΠΈ Ρ‚ΠΎΠΆΠ΅ Π΄Π΅Π»Π°Π΅ΠΌ Π΅Ρ‘ read-only.

ΠŸΡ€Π°ΠΊΡ‚ΠΈΡ‡Π΅ΡΠΊΠΎΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ELK. НастраиваСм logstash

Π€Π°ΠΉΠ» pipelines.yml

- pipeline.id: HABR
  pipeline.workers: 1
  pipeline.batch.size: 1
  path.config: "./config/pipelines/habr_pipeline.conf"

Π—Π΄Π΅ΡΡŒ описан ΠΎΠ΄ΠΈΠ½ ΠΊΠ°Π½Π°Π» с ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠΌ HABR ΠΈ ΠΏΡƒΡ‚ΡŒ ΠΊ Π΅Π³ΠΎ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΌΡƒ Ρ„Π°ΠΉΠ»Ρƒ.

И Π½Π°ΠΊΠΎΠ½Π΅Ρ† Ρ„Π°ΠΉΠ» Β«./config/pipelines/habr_pipeline.conf"

input {
  tcp {
    port => "5046"
   }
  }
filter {
  mutate {
    add_field => [ "habra_field", "Hello Habr" ]
    }
  }
output {
  stdout {
      
    }
  }

НС Π±ΡƒΠ΄Π΅ΠΌ ΠΏΠΎΠΊΠ° Π²Π΄Π°Π²Π°Ρ‚ΡŒΡΡ Π² Π΅Π³ΠΎ описаниС, ΠΏΡ€ΠΎΠ±ΡƒΠ΅ΠΌ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ:

docker-compose up

Π§Ρ‚ΠΎ ΠΌΡ‹ Π²ΠΈΠ΄ΠΈΠΌ?

ΠšΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ запустился. МоТСм ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ Π΅Π³ΠΎ Ρ€Π°Π±ΠΎΡ‚Ρƒ:

echo '13123123123123123123123213123213' | nc localhost 5046

И Π²ΠΈΠ΄ΠΈΠΌ Π² консоли ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° ΠΎΡ‚Π²Π΅Ρ‚:

ΠŸΡ€Π°ΠΊΡ‚ΠΈΡ‡Π΅ΡΠΊΠΎΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ELK. НастраиваСм logstash

Но ΠΏΡ€ΠΈ этом, Π²ΠΈΠ΄ΠΈΠΌ Ρ‚Π°ΠΊΠΆΠ΅:

logstash_one_channel | [2019-04-29T11:28:59,790][ERROR][logstash.licensechecker.licensereader] Unable to retrieve license information from license server {:message=>Β«Elasticsearch Unreachable: [http://elasticsearch:9200/][Manticore::ResolutionFailure] elasticsearchΒ», …

logstash_one_channel | [2019-04-29T11:28:59,894][INFO ][logstash.pipeline ] Pipeline started successfully {:pipeline_id=>".monitoring-logstash", :thread=>"#<Thread:0x119abb86 run>Β»}

logstash_one_channel | [2019-04-29T11:28:59,988][INFO ][logstash.agent ] Pipelines running {:count=>2, :running_pipelines=>[:HABR, :".monitoring-logstash"], :non_running_pipelines=>[]}
logstash_one_channel | [2019-04-29T11:29:00,015][ERROR][logstash.inputs.metrics ] X-Pack is installed on Logstash but not on Elasticsearch. Please install X-Pack on Elasticsearch to use the monitoring feature. Other features may be available.
logstash_one_channel | [2019-04-29T11:29:00,526][INFO ][logstash.agent ] Successfully started Logstash API endpoint {:port=>9600}
logstash_one_channel | [2019-04-29T11:29:04,478][INFO ][logstash.outputs.elasticsearch] Running health check to see if an Elasticsearch connection is working {:healthcheck_url=>http://elasticsearch:9200/, :path=>"/"}
logstash_one_channel | [2019-04-29T11:29:04,487][WARN ][logstash.outputs.elasticsearch] Attempted to resurrect connection to dead ES instance, but got an error. {:url=>Β«elasticsearch:9200/Β», :error_type=>LogStash::Outputs::ElasticSearch::HttpClient::Pool::HostUnreachableError, :error=>Β«Elasticsearch Unreachable: [http://elasticsearch:9200/][Manticore::ResolutionFailure] elasticsearchΒ»}
logstash_one_channel | [2019-04-29T11:29:04,704][INFO ][logstash.licensechecker.licensereader] Running health check to see if an Elasticsearch connection is working {:healthcheck_url=>http://elasticsearch:9200/, :path=>"/"}
logstash_one_channel | [2019-04-29T11:29:04,710][WARN ][logstash.licensechecker.licensereader] Attempted to resurrect connection to dead ES instance, but got an error. {:url=>Β«elasticsearch:9200/Β», :error_type=>LogStash::Outputs::ElasticSearch::HttpClient::Pool::HostUnreachableError, :error=>Β«Elasticsearch Unreachable: [http://elasticsearch:9200/][Manticore::ResolutionFailure] elasticsearchΒ»}

И наш Π»ΠΎΠ³ всё врСмя ΠΏΠΎΠ»Π·Ρ‘Ρ‚ Π²Π²Π΅Ρ€Ρ….

Π—Π΄Π΅ΡΡŒ я Π²Ρ‹Π΄Π΅Π»ΠΈΠ» Π·Π΅Π»Ρ‘Π½Ρ‹ΠΌ Ρ†Π²Π΅Ρ‚ΠΎΠΌ сообщСниС ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ pipeline ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ Π·Π°ΠΏΡƒΡΡ‚ΠΈΠ»Π°ΡΡŒ, красным β€” сообщСниС ΠΎΠ± ошибкС ΠΈ ΠΆΡ‘Π»Ρ‚Ρ‹ΠΌ β€” сообщСниС ΠΎ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ΅ ΡΠ²ΡΠ·Π°Ρ‚ΡŒΡΡ с elasticsearch:9200.
ΠŸΡ€ΠΎΠΈΡΡ…ΠΎΠ΄ΠΈΡ‚ это ΠΈΠ· Π·Π° Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ Π² logstash.conf, Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Π½ΠΎΠΌ Π² состав ΠΎΠ±Ρ€Π°Π·Π°, стоит ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π½Π° Π΄ΠΎΡΡ‚ΡƒΠΏΠ½ΠΎΡΡ‚ΡŒ elasticsearch. Π’Π΅Π΄ΡŒ logstash ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π² составС Elk стСка, Π° ΠΌΡ‹ Π΅Π³ΠΎ ΠΎΡ‚Π΄Π΅Π»ΠΈΠ»ΠΈ.

Π Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ ΠΌΠΎΠΆΠ½ΠΎ, Π½ΠΎ Π½Π΅ ΡƒΠ΄ΠΎΠ±Π½ΠΎ.

РСшСниСм являСтся ΠΎΡ‚ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ эту ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ Ρ‡Π΅Ρ€Π΅Π· ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ окруТСния XPACK_MONITORING_ENABLED.

ВнСсём ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π² docker-compose.yml ΠΈ снова запускаСм:

version: '3'

networks:
  elk:

volumes:
  elasticsearch:
    driver: local

services:

  logstash:
    container_name: logstash_one_channel
    image: docker.elastic.co/logstash/logstash:6.3.2
    networks:
      - elk
    environment:
      XPACK_MONITORING_ENABLED: "false"
    ports:
      - 5046:5046
   volumes:
      - ./config/pipelines.yml:/usr/share/logstash/config/pipelines.yml:ro
      - ./config/pipelines:/usr/share/logstash/config/pipelines:ro

Π’ΠΎΡ‚ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ, всё Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎ. ΠšΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ Π³ΠΎΡ‚ΠΎΠ² ΠΊ экспСримСнтам.

МоТСм снова Π½Π°Π±Ρ€Π°Ρ‚ΡŒ Π² сосСднСй консоли:

echo '13123123123123123123123213123213' | nc localhost 5046

И ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ:

logstash_one_channel | {
logstash_one_channel |         "message" => "13123123123123123123123213123213",
logstash_one_channel |      "@timestamp" => 2019-04-29T11:43:44.582Z,
logstash_one_channel |        "@version" => "1",
logstash_one_channel |     "habra_field" => "Hello Habr",
logstash_one_channel |            "host" => "gateway",
logstash_one_channel |            "port" => 49418
logstash_one_channel | }

Π Π°Π±ΠΎΡ‚Π° Π² Ρ€Π°ΠΌΠΊΠ°Ρ… ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΊΠ°Π½Π°Π»Π°

Π˜Ρ‚Π°ΠΊ, ΠΌΡ‹ Π·Π°ΠΏΡƒΡΡ‚ΠΈΠ»ΠΈΡΡŒ. Π’Π΅ΠΏΠ΅Ρ€ΡŒ собствСнно ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ΄Π΅Π»ΠΈΡ‚ΡŒ врСмя настройкС нСпосрСдствСнно logstash. НС Π±ΡƒΠ΄Π΅ΠΌ ΠΏΠΎΠΊΠ° Ρ‚Ρ€ΠΎΠ³Π°Ρ‚ΡŒ Ρ„Π°ΠΉΠ» pipelines.yml, посмотрим, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ, работая с ΠΎΠ΄Π½ΠΈΠΌ ΠΊΠ°Π½Π°Π»ΠΎΠΌ.

Надо ΡΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΎΠ±Ρ‰ΠΈΠΉ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Ρ„Π°ΠΉΠ»ΠΎΠΌ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΊΠ°Π½Π°Π»Π° Ρ…ΠΎΡ€ΠΎΡˆΠΎ описан Π² ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠΌ руководствС, Π²ΠΎΡ‚ здСсь
Если хочСтся ΠΏΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΠΏΠΎ-русски, Ρ‚ΠΎ ΠΌΡ‹ пользовались Π²ΠΎΡ‚ этой ΡΡ‚Π°Ρ‚ΡŒΡ‘ΠΉ(Π½ΠΎ синтаксис запросов Ρ‚Π°ΠΌ старый, Π½Π°Π΄ΠΎ это ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ).

ПойдСм ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΎΡ‚ сСкции Input. Π Π°Π±ΠΎΡ‚Ρƒ ΠΏΠΎ tcp ΠΌΡ‹ ΡƒΠΆΠ΅ Π²ΠΈΠ΄Π΅Π»ΠΈ. Π§Ρ‚ΠΎ Π΅Ρ‰Ρ‘ здСсь ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ интСрСсного?

ВСстовыС сообщСния, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ heartbeat

Π•ΡΡ‚ΡŒ такая интСрСсная Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ автоматичСскиС тСстовыС сообщСния.
Для этого Π² input ΡΠ΅ΠΊΡ†ΠΈΡŽ Π½ΡƒΠΆΠ½ΠΎ Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ ΠΏΠ»Π°Π³ΠΈΠ½ heartbean.

input {
  heartbeat {
    message => "HeartBeat!"
   }
  } 

Π’ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ, Π½Π°Ρ‡ΠΈΠ½Π°Π΅ΠΌ Ρ€Π°Π· Π² ΠΌΠΈΠ½ΡƒΡ‚Ρƒ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ

logstash_one_channel | {
logstash_one_channel |      "@timestamp" => 2019-04-29T13:52:04.567Z,
logstash_one_channel |     "habra_field" => "Hello Habr",
logstash_one_channel |         "message" => "HeartBeat!",
logstash_one_channel |        "@version" => "1",
logstash_one_channel |            "host" => "a0667e5c57ec"
logstash_one_channel | }

Π₯ΠΎΡ‚ΠΈΠΌ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ ΠΏΠΎΡ‡Π°Ρ‰Π΅, Π½Π°Π΄ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ interval.
Π’ΠΎΡ‚ Ρ‚Π°ΠΊ Π±ΡƒΠ΄Π΅ΠΌ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ Ρ€Π°Π· Π² 10 сСкунд сообщСниС.

input {
  heartbeat {
    message => "HeartBeat!"
    interval => 10
   }
  }

ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΠ· Ρ„Π°ΠΉΠ»Π°

Π•Ρ‰Ρ‘ Ρ€Π΅ΡˆΠΈΠ»ΠΈ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ€Π΅ΠΆΠΈΠΌ file. Если Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎ с Ρ„Π°ΠΉΠ»ΠΎΠΌ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚, Ρ‚ΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΠΈ Π°Π³Π΅Π½Ρ‚Π° Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ Π½Π΅ потрСбуСтся, Π½Ρƒ хотя Π±Ρ‹ для локального использования.

По описанию, Ρ€Π΅ΠΆΠΈΠΌ Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹ΠΉ tail -f, Ρ‚.Π΅. Ρ‡ΠΈΡ‚Π°Π΅Ρ‚ Π½ΠΎΠ²Ρ‹Π΅ строки ΠΈΠ»ΠΈ, ΠΊΠ°ΠΊ опция, Ρ‡ΠΈΡ‚Π°Π΅Ρ‚ вСсь Ρ„Π°ΠΉΠ».

Π˜Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ:

  1. ΠœΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ строки, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‚ΡΡ Π² ΠΎΠ΄ΠΈΠ½ Π»ΠΎΠ³ Ρ„Π°ΠΉΠ».
  2. ΠœΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π·Π°ΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‚ΡΡ Π² нСсколько Π»ΠΎΠ³ Ρ„Π°ΠΉΠ»ΠΎΠ², ΠΏΡ€ΠΈ этом, ΠΈΠΌΠ΅Ρ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚ΡŒ Ρ‡Ρ‚ΠΎ ΠΎΡ‚ΠΊΡƒΠ΄Π° ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΎ.
  3. ΠœΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈ пСрСзапускС logstash ΠΎΠ½ Π½Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ эти Π΄Π°Π½Π½Ρ‹Π΅ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ.
  4. ΠœΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Ссли logstash ΠΎΡ‚ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ, Π° Π΄Π°Π½Π½Ρ‹Π΅ Π² Ρ„Π°ΠΉΠ»Ρ‹ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°ΡŽΡ‚ ΠΏΠΈΡΠ°Ρ‚ΡŒΡΡ, Ρ‚ΠΎ, ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ Π΅Π³ΠΎ запустим, Ρ‚ΠΎ ΠΌΡ‹ эти Π΄Π°Π½Π½Ρ‹Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ.

Для провСдСния экспСримСнта Π΄ΠΎΠ±Π°Π²ΠΈΠΌ Π΅Ρ‰Ρ‘ ΠΎΠ΄Π½Ρƒ строчку Π² docker-compose.yml, ΠΎΡ‚ΠΊΡ€Ρ‹Π² Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡŽ, Π² ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΌΡ‹ ΠΊΠ»Π°Π΄Ρ‘ΠΌ Ρ„Π°ΠΉΠ»Ρ‹.

version: '3'

networks:
  elk:

volumes:
  elasticsearch:
    driver: local

services:

  logstash:
    container_name: logstash_one_channel
    image: docker.elastic.co/logstash/logstash:6.3.2
    networks:
      - elk
    environment:
      XPACK_MONITORING_ENABLED: "false"
    ports:
      - 5046:5046
   volumes:
      - ./config/pipelines.yml:/usr/share/logstash/config/pipelines.yml:ro
      - ./config/pipelines:/usr/share/logstash/config/pipelines:ro
      - ./logs:/usr/share/logstash/input

И ΠΈΠ·ΠΌΠ΅Π½ΠΈΠΌ ΡΠ΅ΠΊΡ†ΠΈΡŽ input Π² habr_pipeline.conf

input {
  file {
    path => "/usr/share/logstash/input/*.log"
   }
  }

ЗапускаСмся:

docker-compose up

Для создания ΠΈ записывания Π»ΠΎΠ³ Ρ„Π°ΠΉΠ»ΠΎΠ² Π±ΡƒΠ΄Π΅ΠΌ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ:


echo '1' >> logs/number1.log

{
logstash_one_channel |            "host" => "ac2d4e3ef70f",
logstash_one_channel |     "habra_field" => "Hello Habr",
logstash_one_channel |      "@timestamp" => 2019-04-29T14:28:53.876Z,
logstash_one_channel |        "@version" => "1",
logstash_one_channel |         "message" => "1",
logstash_one_channel |            "path" => "/usr/share/logstash/input/number1.log"
logstash_one_channel | }

Ага, Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚!

ΠŸΡ€ΠΈ этом, ΠΌΡ‹ Π²ΠΈΠ΄ΠΈΠΌ, Ρ‡Ρ‚ΠΎ Ρƒ нас автоматичСски добавилось ΠΏΠΎΠ»Π΅ path. Π—Π½Π°Ρ‡ΠΈΡ‚ Π² дальнСйшСм, ΠΌΡ‹ смоТСм ΠΏΠΎ Π½Π΅ΠΌΡƒ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ΠΎΠ²Π°Ρ‚ΡŒ записи.

ΠŸΠΎΠΏΡ€ΠΎΠ±ΡƒΠ΅ΠΌ Π΅Ρ‰Ρ‘:

echo '2' >> logs/number1.log

{
logstash_one_channel |            "host" => "ac2d4e3ef70f",
logstash_one_channel |     "habra_field" => "Hello Habr",
logstash_one_channel |      "@timestamp" => 2019-04-29T14:28:59.906Z,
logstash_one_channel |        "@version" => "1",
logstash_one_channel |         "message" => "2",
logstash_one_channel |            "path" => "/usr/share/logstash/input/number1.log"
logstash_one_channel | }

А Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π² Π΄Ρ€ΡƒΠ³ΠΎΠΉ Ρ„Π°ΠΉΠ»:

 echo '1' >> logs/number2.log

{
logstash_one_channel |            "host" => "ac2d4e3ef70f",
logstash_one_channel |     "habra_field" => "Hello Habr",
logstash_one_channel |      "@timestamp" => 2019-04-29T14:29:26.061Z,
logstash_one_channel |        "@version" => "1",
logstash_one_channel |         "message" => "1",
logstash_one_channel |            "path" => "/usr/share/logstash/input/number2.log"
logstash_one_channel | }

ΠžΡ‚Π»ΠΈΡ‡Π½ΠΎ! Π€Π°ΠΉΠ» подхватился, path указался Π²Π΅Ρ€Π½ΠΎ, всё Ρ…ΠΎΡ€ΠΎΡˆΠΎ.

ΠžΡΡ‚Π°Π½ΠΎΠ²ΠΈΠΌ logstash ΠΈ запусти Π·Π°Π½ΠΎΠ²ΠΎ. ΠŸΠΎΠ΄ΠΎΠΆΠ΄Ρ‘ΠΌ. Вишина. Π’.Π΅. ΠŸΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ ΠΌΡ‹ эти записи Π½Π΅ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ.

А Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ самый смСлый экспСримСнт.

ΠšΠ»Π°Π΄Ρ‘ΠΌ logstash ΠΈ выполняСм:

echo '3' >> logs/number2.log
echo '4' >> logs/number1.log

Π‘Π½ΠΎΠ²Π° запускаСм logstash ΠΈ Π²ΠΈΠ΄ΠΈΠΌ:

logstash_one_channel | {
logstash_one_channel |            "host" => "ac2d4e3ef70f",
logstash_one_channel |     "habra_field" => "Hello Habr",
logstash_one_channel |         "message" => "3",
logstash_one_channel |        "@version" => "1",
logstash_one_channel |            "path" => "/usr/share/logstash/input/number2.log",
logstash_one_channel |      "@timestamp" => 2019-04-29T14:48:50.589Z
logstash_one_channel | }
logstash_one_channel | {
logstash_one_channel |            "host" => "ac2d4e3ef70f",
logstash_one_channel |     "habra_field" => "Hello Habr",
logstash_one_channel |         "message" => "4",
logstash_one_channel |        "@version" => "1",
logstash_one_channel |            "path" => "/usr/share/logstash/input/number1.log",
logstash_one_channel |      "@timestamp" => 2019-04-29T14:48:50.856Z
logstash_one_channel | }

Π£Ρ€Π°! Всё ΠΏΠΎΠ΄Ρ…Π²Π°Ρ‚ΠΈΠ»ΠΎΡΡŒ.

Но, Π½Π°Π΄ΠΎ ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅Π΄ΠΈΡ‚ΡŒ ΠΎ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ. Если ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ с logstash удаляСтся (docker stop logstash_one_channel && docker rm logstash_one_channel), Ρ‚ΠΎ Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ подхватится. Π’Π½ΡƒΡ‚Ρ€ΠΈ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° Π±Ρ‹Π»Π° сохранСна позиция Ρ„Π°ΠΉΠ»Π°, Π΄ΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΎΠ½ Π±Ρ‹Π» считан. Если Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ «с нуля», Ρ‚ΠΎ ΠΎΠ½ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½ΠΎΠ²Ρ‹Π΅ строки.

Π‘Ρ‡ΠΈΡ‚Ρ‹Π²Π°Π½ΠΈΠ΅ ΡƒΠΆΠ΅ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… Ρ„Π°ΠΉΠ»ΠΎΠ²

Допустим ΠΌΡ‹ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ Ρ€Π°Π· запускаСм logstash, Π½ΠΎ Ρƒ нас ΡƒΠΆΠ΅ Π΅ΡΡ‚ΡŒ Π»ΠΎΠ³ΠΈ ΠΈ ΠΌΡ‹ Ρ…ΠΎΡ‚Π΅Π»ΠΈ Π±Ρ‹ ΠΈΡ… ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ.
Если ΠΌΡ‹ запустим logstash с Ρ‚ΠΎΠΉ сСкциСй input, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ использовали Π²Ρ‹ΡˆΠ΅, Ρ‚ΠΎ ΠΌΡ‹ Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ. Волько Π½ΠΎΠ²Ρ‹Π΅ строки Π±ΡƒΠ΄ΡƒΡ‚ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒΡΡ logstash.

Для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ΄Ρ‚ΡΠ½ΡƒΠ»ΠΈΡΡŒ строки ΠΈΠ· ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… Ρ„Π°ΠΉΠ»ΠΎΠ², слСдуСт Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π² input ΡΠ΅ΠΊΡ†ΠΈΡŽ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ строчку:

input {
  file {
    start_position => "beginning"
    path => "/usr/share/logstash/input/*.log"
   }
  }

ΠŸΡ€ΠΈΡ‡Ρ‘ΠΌ, Π΅ΡΡ‚ΡŒ нюанс, это дСйствуСт Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π° Π½ΠΎΠ²Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ logstash Π΅Ρ‰Ρ‘ Π½Π΅ Π²ΠΈΠ΄Π΅Π». Для Ρ‚Π΅Ρ… ΠΆΠ΅ Ρ„Π°ΠΉΠ»ΠΎΠ², Ρ‡Ρ‚ΠΎ ΡƒΠΆΠ΅ ΠΏΠΎΠΏΠ°Π΄Π°Π»ΠΈ Π² ΠΏΠΎΠ»Π΅ зрСния logstash, ΠΎΠ½ ΡƒΠΆΠ΅ Π·Π°ΠΏΠΎΠΌΠ½ΠΈΠ» ΠΈΡ… Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΈ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π±ΡƒΠ΄Π΅Ρ‚ Π±Ρ€Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½ΠΎΠ²Ρ‹Π΅ записи Π² Π½ΠΈΡ….

ΠžΡΡ‚Π°Π½ΠΎΠ²ΠΈΠΌΡΡ Π½Π° этом Π½Π° ΠΈΠ·ΡƒΡ‡Π΅Π½ΠΈΠΈ сСкции input. Π’Π°ΠΌ Π΅Ρ‰Ρ‘ мноТСство Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ², Π½ΠΎ Π½Π°ΠΌ, для Π΄Π°Π»ΡŒΠ½Π΅ΠΉΡˆΠΈΡ… экспСримСнтов ΠΏΠΎΠΊΠ° Ρ…Π²Π°Ρ‚ΠΈΡ‚.

ΠœΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΈΠ·Π°Ρ†ΠΈΡ ΠΈ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ…

ΠŸΠΎΠΏΡ€ΠΎΠ±ΡƒΠ΅ΠΌ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ Π·Π°Π΄Π°Ρ‡Ρƒ, допустим Ρƒ нас ΠΈΠ΄ΡƒΡ‚ сообщСния ΠΈΠ· ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΊΠ°Π½Π°Π»Π°, Ρ‡Π°ΡΡ‚ΡŒ ΠΈΠ· Π½ΠΈΡ… ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΎΠ½Π½Ρ‹Π΅, Π° Ρ‡Π°ΡΡ‚ΡŒ сообщСниС ΠΎΠ± ΠΎΡˆΠΈΠ±ΠΊΠ°Ρ…. ΠžΡ‚Π»ΠΈΡ‡Π°ΡŽΡ‚ΡΡ Ρ‚Π΅Π³ΠΎΠΌ. Одни INFO, Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ERROR.

Нам Π½ΡƒΠΆΠ½ΠΎ Π½Π° Π²Ρ‹Ρ…ΠΎΠ΄Π΅ ΠΈΡ… Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚ΡŒ. Π’.Π΅. Π˜Π½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΎΠ½Π½Ρ‹Π΅ сообщСния пишСм Π² ΠΎΠ΄ΠΈΠ½ ΠΊΠ°Π½Π°Π», Π° сообщСния ΠΎΠ± ΠΎΡˆΠΈΠ±ΠΊΠ°Ρ… Π² Π΄Ρ€ΡƒΠ³ΠΎΠΉ.

Для этого, ΠΎΡ‚ сСкции input ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΠΌ ΠΊ filter ΠΈ output.

Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ сСкции filter ΠΌΡ‹ Ρ€Π°Π·Π±Π΅Ρ€Ρ‘ΠΌ входящСС сообщСниС, ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ² ΠΈΠ· Π½Π΅Π³ΠΎ hash(ΠΏΠ°Ρ€Ρ‹ ΠΊΠ»ΡŽΡ‡-Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅), с ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ ΡƒΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ, Ρ‚.Π΅. Ρ€Π°Π·Π±ΠΈΡ€Π°Ρ‚ΡŒ ΠΏΠΎ условиям. А Π² сСкции output, ΠΎΡ‚Π±Π΅Ρ€Ρ‘ΠΌ сообщСния ΠΈ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΠΌ ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ Π² свой ΠΊΠ°Π½Π°Π».

Π Π°Π·Π±ΠΎΡ€ сообщСния с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ grok

Для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ€Π°Π·Π±ΠΈΡ€Π°Ρ‚ΡŒ тСкстовыС строки ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ ΠΈΠ· Π½ΠΈΡ… Π½Π°Π±ΠΎΡ€ ΠΏΠΎΠ»Π΅ΠΉ, Π² сСкции filter Π΅ΡΡ‚ΡŒ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΠ»Π°Π³ΠΈΠ½ β€” grok.

НС ставя сСбС Ρ†Π΅Π»ΡŒΡŽ Π΄Π°Ρ‚ΡŒ здСсь Π΅Π³ΠΎ Π΄Π΅Ρ‚Π°Π»ΡŒΠ½ΠΎΠ΅ описаниС (Π·Π° этим ΠΎΡ‚ΡΡ‹Π»Π°ΡŽ ΠΊ ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠΉ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ), ΠΏΡ€ΠΈΠ²Π΅Π΄Ρƒ свой простой ΠΏΡ€ΠΈΠΌΠ΅Ρ€.

Для этого, Π½Π°Π΄ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒΡΡ с Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΎΠΌ Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… строк. Π£ мСня ΠΎΠ½ΠΈ Ρ‚Π°ΠΊΠΈΠ΅:

1 INFO message1
2 ERROR message2

Π’.Π΅. Π˜Π΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ Π½Π° ΠΏΠ΅Ρ€Π²ΠΎΠΌ мСстС, Π·Π°Ρ‚Π΅ΠΌ INFO/ERROR, Π·Π°Ρ‚Π΅ΠΌ ΠΊΠ°ΠΊΠΎΠ΅-Ρ‚ΠΎ слово Π±Π΅Π· ΠΏΡ€ΠΎΠ±Π΅Π»ΠΎΠ².
НС слоТно, Π½ΠΎ для понимания ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ° Ρ€Π°Π±ΠΎΡ‚Ρ‹ Ρ…Π²Π°Ρ‚ΠΈΡ‚.

Π˜Ρ‚Π°ΠΊ, Π² сСкции filter, Π² ΠΏΠ»Π°Π³ΠΈΠ½Π΅ grok ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½ для Ρ€Π°Π·Π±ΠΎΡ€Π° Π½Π°ΡˆΠΈΡ… строк.

Π’Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ ΠΎΠ½ Π±ΡƒΠ΄Π΅Ρ‚ Ρ‚Π°ΠΊ:

filter {
  grok {
    match => { "message" => ["%{INT:message_id} %{LOGLEVEL:message_type} %{WORD:message_text}"] }
   }
  } 

По сути, это рСгулярноС Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ ΡƒΠΆΠ΅ Π³ΠΎΡ‚ΠΎΠ²Ρ‹Π΅ ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½Ρ‹, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ INT, LOGLEVEL, WORD. Π˜Ρ… описаниС, Π° Ρ‚Π°ΠΊΠΆΠ΅ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½Ρ‹, ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π²ΠΎΡ‚ здСсь

Π’Π΅ΠΏΠ΅Ρ€ΡŒ, проходя Ρ‡Π΅Ρ€Π΅Π· этот Ρ„ΠΈΠ»ΡŒΡ‚Ρ€, наша строка прСвратится Π² hash ΠΈΠ· Ρ‚Ρ€Ρ‘Ρ… ΠΏΠΎΠ»Π΅ΠΉ: message_id, message_type, message_text.

ИмСнно ΠΎΠ½ΠΈ Π±ΡƒΠ΄ΡƒΡ‚ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ Π² сСкции output.

ΠœΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΈΠ·Π°Ρ†ΠΈΡ сообщСний Π² сСкции output с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ if

Π’ сСкции output, ΠΊΠ°ΠΊ ΠΌΡ‹ ΠΏΠΎΠΌΠ½ΠΈΠΌ, ΠΌΡ‹ ΡΠΎΠ±ΠΈΡ€Π°Π»ΠΈΡΡŒ Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚ΡŒ сообщСния Π½Π° Π΄Π²Π° ΠΏΠΎΡ‚ΠΎΠΊΠ°. Одни β€” ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ iNFO, Π±ΡƒΠ΄Π΅ΠΌ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ΡŒ Π½Π° консоль, Π° с ошибками, Π±ΡƒΠ΄Π΅ΠΌ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ΡŒ Π² Ρ„Π°ΠΉΠ».

Как Π½Π°ΠΌ Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚ΡŒ эти сообщСния? УсловиС Π·Π°Π΄Π°Ρ‡ΠΈ ΡƒΠΆΠ΅ подсказываСт Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ β€” Ρƒ нас вСдь Π΅ΡΡ‚ΡŒ ΡƒΠΆΠ΅ Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½ΠΎΠ΅ ΠΏΠΎΠ»Π΅ message_type, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π΄Π²Π° значСния INFO ΠΈ ERROR. ИмСнно ΠΏΠΎ Π½Π΅ΠΌΡƒ ΠΈ сдСлаСм Π²Ρ‹Π±ΠΎΡ€ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° if.

if [message_type] == "ERROR" {
        # Π—Π΄Π΅ΡΡŒ Π²Ρ‹Π²ΠΎΠ΄ΠΈΠΌ Π² Ρ„Π°ΠΉΠ»
       } else
     {
      # Π—Π΄Π΅ΡΡŒ Π²Ρ‹Π²ΠΎΠ΄ΠΈΠΌ Π² stdout
    }

ОписаниС Ρ€Π°Π±ΠΎΡ‚Ρ‹ с полями ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π°ΠΌΠΈ, ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π²ΠΎΡ‚ Π² этой сСкции ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΌΠ°Π½ΡƒΠ°Π»Π°.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ, ΠΏΡ€ΠΎ собствСнно сам Π²Ρ‹Π²ΠΎΠ΄.

Π’Ρ‹Π²ΠΎΠ΄ Π² консоль, здСсь всё понятно β€” stdout {}

А Π²ΠΎΡ‚ Π²Ρ‹Π²ΠΎΠ΄ Π² Ρ„Π°ΠΉΠ» β€” вспоминаСм, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ это всё запускаСм ΠΈΠ· ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° ΠΈ Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ„Π°ΠΉΠ», Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΡ‹ пишСм Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚, Π±Ρ‹Π» доступСн снаруТи, Π½Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΡŒ эту Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡŽ Π² docker-compose.yml.

Π˜Ρ‚ΠΎΠ³ΠΎ:

БСкция output нашСго Ρ„Π°ΠΉΠ»Π° выглядит Π²ΠΎΡ‚ Ρ‚Π°ΠΊ:


output {
  if [message_type] == "ERROR" {
    file {
          path => "/usr/share/logstash/output/test.log"
          codec => line { format => "custom format: %{message}"}
         }
    } else
     {stdout {
             }
     }
  }

Π’ docker-compose.yml добавляСм Π΅Ρ‰Ρ‘ ΠΎΠ΄ΠΈΠ½ Ρ‚ΠΎΠΌ, для Π²Ρ‹Π²ΠΎΠ΄Π°:

version: '3'

networks:
  elk:

volumes:
  elasticsearch:
    driver: local

services:

  logstash:
    container_name: logstash_one_channel
    image: docker.elastic.co/logstash/logstash:6.3.2
    networks:
      - elk
    environment:
      XPACK_MONITORING_ENABLED: "false"
    ports:
      - 5046:5046
   volumes:
      - ./config/pipelines.yml:/usr/share/logstash/config/pipelines.yml:ro
      - ./config/pipelines:/usr/share/logstash/config/pipelines:ro
      - ./logs:/usr/share/logstash/input
      - ./output:/usr/share/logstash/output

ЗапускаСм, ΠΏΡ€ΠΎΠ±ΡƒΠ΅ΠΌ, Π²ΠΈΠ΄ΠΈΠΌ Ρ€Π°Π·Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π½Π° Π΄Π²Π° ΠΏΠΎΡ‚ΠΎΠΊΠ°.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com