ELK практикалық қолданылуы. Журнал қоймасы орнатылуда

Кіріспе

Басқа жүйені орналастыру кезінде біз әртүрлі журналдардың үлкен санын өңдеу қажеттілігіне тап болдық. Құрал ретінде ELK таңдалды. Бұл мақалада осы стек орнатудағы тәжірибеміз талқыланады.

Біз оның барлық мүмкіндіктерін сипаттауды мақсат етіп қойған жоқпыз, бірақ біз практикалық мәселелерді шешуге ерекше назар аударғымыз келеді. Бұл құжаттама мен дайын суреттердің жеткілікті үлкен көлемі болса да, көптеген қателіктер бар, кем дегенде біз оларды таптық.

Біз стекті docker-compose арқылы орналастырдық. Сонымен қатар, бізде жақсы жазылған docker-compose.yml бар еді, ол бізге стекті проблемасыз дерлік көтеруге мүмкіндік берді. Бізге жеңіс жақындап қалғандай көрінді, енді біз оны өз қажеттіліктерімізге сәйкес аздап өзгертеміз, болды.

Өкінішке орай, біздің қолданбадан журналдарды қабылдау және өңдеу үшін жүйені конфигурациялау әрекеті бірден сәтті болмады. Сондықтан біз әрбір компонентті бөлек зерттеп, содан кейін олардың байланыстарына оралу керек деп шештік.

Сонымен, біз логсташтан бастадық.

Қоршаған орта, орналастыру, контейнерде Logstash іске қосу

Орналастыру үшін біз docker-compose қолданамыз; мұнда сипатталған эксперименттер MacOS және Ubuntu 18.0.4 жүйелерінде орындалды.

Түпнұсқа docker-compose.yml сайтында тіркелген logstash кескіні - docker.elastic.co/logstash/logstash:6.3.2

Біз оны эксперименттер үшін қолданамыз.

Logstash іске қосу үшін бөлек docker-compose.yml жаздық. Әрине, кескінді пәрмен жолынан іске қосу мүмкін болды, бірақ біз белгілі бір мәселені шешіп жатырмыз, мұнда біз docker-compose-дан бастап барлығын іске қосамыз.

Конфигурация файлдары туралы қысқаша

Сипаттамадан келесідей, logstash бір арна үшін де іске қосылуы мүмкін, бұл жағдайда ол *.conf файлын немесе бірнеше арналарды өткізуі керек, бұл жағдайда ол pipelines.yml файлын өткізуі керек, бұл өз кезегінде , әр арна үшін .conf файлдарына сілтеме жасайды.
Біз екінші жолды таңдадық. Бұл бізге әмбебап және ауқымды болып көрінді. Сондықтан, біз pipelines.yml жасадық және әр арна үшін .conf файлдарын қоятын құбырлар каталогын жасадық.

Контейнердің ішінде басқа конфигурация файлы бар - logstash.yml. Біз оған тиіспейміз, сол қалпында пайдаланамыз.

Сонымен, біздің каталог құрылымы:

ELK практикалық қолданылуы. Журнал қоймасы орнатылуда

Енгізілген деректерді алу үшін қазір біз бұл 5046 портындағы tcp деп есептейміз, ал шығару үшін біз 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. Желілер мен томдар docker-compose.yml түпнұсқасынан алынды (барлық стек іске қосылған) және олар мұндағы жалпы суретке айтарлықтай әсер етпейді деп ойлаймын.
  2. Біз docker.elastic.co/logstash/logstash:6.3.2 кескінінен бір logstash қызметін(лерін) жасаймыз және оны logstash_one_channel деп атаймыз.
  3. Контейнер ішіндегі 5046 портты сол ішкі портқа жібереміз.
  4. Біз ./config/pipelines.yml құбыр конфигурация файлын контейнер ішіндегі /usr/share/logstash/config/pipelines.yml файлымен салыстырамыз, мұнда logstash оны алып, оны тек оқуға арналған етеді.
  5. Бізде арна параметрлері бар файлдар бар ./config/pipelines каталогын /usr/share/logstash/config/pipelines каталогына салыстырып, оны тек оқуға арналған етіп жасаймыз.

ELK практикалық қолданылуы. Журнал қоймасы орнатылуда

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_one_channel | [2019-04-29T11:28:59,790][ERROR][logstash.licensechecker.licensereader] Лицензия серверінен лицензия ақпаратын алу мүмкін емес {:message=>“Elasticsearch қолжетімсіз: [http://elasticsearch:9200/][Manticore ::ResolutionFailure] elasticsearch", ...

logstash_one_channel | [2019-04-29T11:28:59,894][INFO][logstash.pipeline ] Құбыр сәтті басталды {:pipeline_id=>".monitoring-logstash", :thread=>"# "}

logstash_one_channel | [2019-04-29T11:28:59,988][INFO ][logstash.agent ] Жұмыс істеп тұрған құбырлар {: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 Logstash жүйесінде орнатылған, бірақ Elasticsearch қолданбасында емес. Бақылау мүмкіндігін пайдалану үшін X-Pack бағдарламасын Elasticsearch жүйесіне орнатыңыз. Басқа мүмкіндіктер қол жетімді болуы мүмкін.
logstash_one_channel | [2019-04-29T11:29:00,526][INFO ][logstash.agent ] Logstash API соңғы нүктесі {:port=>9600} сәтті іске қосылды
logstash_one_channel | [2019-04-29T11:29:04,478][INFO ][logstash.outputs.elasticsearch] Elasticsearch қосылымының жұмыс істеп тұрғанын көру үшін денсаулықты тексеруді іске қосу {:healthcheck_url=>http://elasticsearch:9200/, :path=> "/"}
logstash_one_channel | [2019-04-29T11:29:04,487][ЕСКЕРТУ ][logstash.outputs.elasticsearch] Өлі ES данасына қосылымды қалпына келтіру әрекеті жасалды, бірақ қате пайда болды. {:url=>“эластикалық ізденіс:9200/", :error_type=>LogStash::Outputs::ElasticSearch::HttpClient::Pool::HostUnreachableError, :error=>"Elasticsearch қолжетімсіз: [http://elasticsearch:9200/:][Manticore:il] elasticsearch"}
logstash_one_channel | [2019-04-29T11:29:04,704][INFO ][logstash.licensechecker.licensereader] Elasticsearch қосылымының жұмыс істеп тұрғанын көру үшін денсаулықты тексеруді іске қосу {:healthcheck_url=>http://elasticsearch:9200/, :path=> "/"}
logstash_one_channel | [2019-04-29T11:29:04,710][ЕСКЕРТУ ][logstash.licensechecker.licensereader] Өлі ES данасына қосылымды қалпына келтіру әрекеті жасалды, бірақ қате пайда болды. {:url=>“эластикалық ізденіс:9200/", :error_type=>LogStash::Outputs::ElasticSearch::HttpClient::Pool::HostUnreachableError, :error=>"Elasticsearch қолжетімсіз: [http://elasticsearch:9200/:][Manticore:il] 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 файлына қол тигізбей-ақ қояйық, бір арнамен жұмыс істеу арқылы не алуға болатынын көрейік.

Арна конфигурациясының файлымен жұмыс істеудің жалпы принципі ресми нұсқаулықта жақсы сипатталғанын айта кету керек, мұнда осында
Егер сіз орыс тілінде оқығыңыз келсе, біз оны қолдандық мақала(бірақ сұрау синтаксисі ескі, біз мұны ескеруіміз керек).

Енгізу бөлімінен ретімен барайық. Біз TCP бойынша жұмысты көрдік. Мұнда тағы не қызықты болуы мүмкін?

Жүректің соғуын пайдаланып хабарларды сынау

Автоматты сынақ хабарламаларын жасаудың қызықты мүмкіндігі бар.
Ол үшін енгізу бөлімінде 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 | }

Егер біз жиі алғымыз келсе, интервал параметрін қосуымыз керек.
Осылайша біз әрбір 10 секунд сайын хабарлама аламыз.

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

Файлдан деректерді шығарып алу

Біз сондай-ақ файл режимін қарастыруды шештік. Егер ол файлмен жақсы жұмыс істесе, кем дегенде жергілікті пайдалану үшін агент қажет болмауы мүмкін.

Сипаттамаға сәйкес, жұмыс режимі tail -f-ге ұқсас болуы керек, яғни. жаңа жолдарды оқиды немесе опция ретінде бүкіл файлды оқиды.

Сонымен, біз не алғымыз келеді:

  1. Біз бір журнал файлына қосылған жолдарды алғымыз келеді.
  2. Қайдан алынғанын ажырата отырып, біз бірнеше журнал файлдарына жазылған деректерді алғымыз келеді.
  3. Logstash қайта іске қосылғанда бұл деректерді қайта қабылдамайтынына көз жеткізгіміз келеді.
  4. Біз журналдар өшірілген болса және деректер файлдарға жазыла берсе, оны іске қосқан кезде біз бұл деректерді алатынымызды тексергіміз келеді.

Эксперимент жүргізу үшін файлдарды орналастыратын каталогты ашып, 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

Және 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 | }

Иә, ол жұмыс істейді!

Сонымен бірге жол өрісін автоматты түрде қосқанымызды көреміз. Бұл болашақта ол бойынша жазбаларды сүзгіден өткізе алатынымызды білдіреді.

Қайталап көрейік:

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 | }

Тамаша! Файл алынды, жол дұрыс көрсетілді, бәрі жақсы.

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 контейнері жойылса (докер тоқтату logstash_one_channel && docker rm logstash_one_channel), онда ештеңе алынбайды. Оқылған файлдың орны контейнер ішінде сақталды. Егер сіз оны нөлден іске қоссаңыз, ол тек жаңа жолдарды қабылдайды.

Бар файлдарды оқу

Logstash бірінші рет іске қосылып жатыр делік, бірақ бізде журналдар бар және біз оларды өңдегіміз келеді.
Егер біз жоғарыда пайдаланған енгізу бөлімімен logstash іске қоссақ, біз ештеңе алмаймыз. Тек жаңа жолдар logstash арқылы өңделеді.

Қолданыстағы файлдардағы жолдарды шығару үшін енгізу бөліміне қосымша жолды қосу керек:

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

Сонымен қатар, бір нюанс бар: бұл тек логсташ әлі көрмеген жаңа файлдарға әсер етеді. Logstash көру өрісінде болған файлдар үшін ол олардың өлшемін есте сақтаған және енді оларда тек жаңа жазбаларды қабылдайды.

Осы жерде тоқтап, енгізу бөлімін зерттейік. Әлі де көптеген нұсқалар бар, бірақ бұл бізге әзірше эксперименттер үшін жеткілікті.

Маршрутизация және деректерді түрлендіру

Келесі мәселені шешуге тырысайық, бір арнадан хабарлар бар делік, олардың кейбіреулері ақпараттық, ал кейбіреулері қате туралы хабарлар. Олар белгі бойынша ерекшеленеді. Кейбіреулері АҚПАРАТ, басқалары ҚАТЕ.

Біз оларды шығу кезінде ажыратуымыз керек. Анау. Біз бір арнаға ақпараттық хабарламаларды, екіншісіне қате туралы хабарларды жазамыз.

Ол үшін енгізу бөлімінен сүзгіге және шығаруға өтіңіз.

Сүзгі бөлімін пайдалана отырып, біз кіріс хабарламаны талдаймыз, одан хэшті (кілт-мән жұптары) аламыз, біз онымен жұмыс істей аламыз, яғни. шарттарға сәйкес бөлшектеңіз. Ал шығыс бөлімінде біз хабарламаларды таңдап, әрқайсысын өз арнасына жібереміз.

Grok көмегімен хабарламаны талдау

Мәтін жолдарын талдау және олардан өрістер жинағын алу үшін сүзгі бөлімінде арнайы плагин бар - grok.

Бұл жерде толық сипаттама беруді мақсат етпей-ақ (бұл үшін мен сілтеме жасаймын ресми құжаттама), Мен қарапайым мысал келтіремін.

Ол үшін енгізу жолдарының пішімі туралы шешім қабылдау керек. Менде олар келесідей:

1 АҚПАРАТ хабары1
2 ҚАТЕ хабары2

Анау. Алдымен идентификатор, содан кейін INFO/ERROR, содан кейін бос орынсыз кейбір сөз келеді.
Бұл қиын емес, бірақ жұмыс принципін түсіну жеткілікті.

Сонымен, grok плагинінің сүзгі бөлімінде біз жолдарымызды талдауға арналған үлгіні анықтауымыз керек.

Ол келесідей болады:

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

Негізінде бұл тұрақты өрнек. INT, LOGLEVEL, WORD сияқты дайын үлгілер қолданылады. Олардың сипаттамасын, сондай-ақ басқа үлгілерді осы жерден табуға болады осында

Енді осы сүзгіден өтіп, біздің жолымыз үш өрістен тұратын хэшке айналады: message_id, message_type, message_text.

Олар шығыс бөлімінде көрсетіледі.

if пәрмені арқылы хабарламаларды шығыс бөліміне бағыттау

Шығару бөлімінде, есімізде, біз хабарларды екі ағынға бөлетін болдық. Кейбіреулері - iNFO болып табылады, консольге шығарылады, ал қателер болса, біз файлға шығарамыз.

Бұл хабарламаларды қалай ажыратамыз? Мәселенің шарты қазірдің өзінде шешімді ұсынады - ақыр соңында, бізде тек екі мәнді қабылдай алатын арнайы хабарлама_түрі өрісі бар: INFO және ERROR. Дәл осы негізде if операторын пайдаланып таңдау жасаймыз.

if [message_type] == "ERROR" {
        # Здесь выводим в файл
       } else
     {
      # Здесь выводим в stdout
    }

Өрістермен және операторлармен жұмыс сипаттамасын осы бөлімде табуға болады ресми нұсқаулық.

Енді нақты қорытындының өзі туралы.

Консоль шығысы, мұнда бәрі түсінікті - stdout {}

Бірақ файлдың шығуы - біз мұның барлығын контейнерден іске қосып жатқанымызды есте сақтаңыз және нәтиже жазатын файлға сырттан қол жетімді болуы үшін біз бұл каталогты docker-compose.yml ішінде ашуымыз керек.

Барлығы:

Біздің файлдың шығыс бөлімі келесідей көрінеді:


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

Біз оны іске қосамыз, сынап көреміз және екі ағынға бөлінетінін көреміз.

Ақпарат көзі: www.habr.com

пікір қалдыру