ELK практикалык колдонулушу. Logstash орнотулууда

тааныштыруу

Башка системаны жайылтууда, биз көп сандагы ар кандай журналдарды иштетүү зарылдыгына туш болдук. курал катары ELK тандалган. Бул макалада бул стекти орнотуудагы тажрыйбабыз талкууланат.

Биз анын бардык мүмкүнчүлүктөрүн сүрөттөө максатын койгон жокпуз, бирок биз практикалык маселелерди чечүүгө өзгөчө көңүл топтогубуз келет. Бул документациянын жана даяр сүрөттөрдүн жетишерлик көп көлөмү бар болсо да, тузактар ​​абдан көп, жок дегенде биз аларды таптык.

Биз стекти docker-compose аркылуу жайгаштырдык. Мындан тышкары, бизде жакшы жазылган docker-compose.yml бар болчу, бул бизге стекти дээрлик көйгөйсүз көтөрүүгө мүмкүндүк берди. Бизге жеңиш жакындап калгандай сезилди, эми биз аны муктаждыктарыбызга ылайыкташтырабыз жана бүттү.

Тилекке каршы, системаны биздин тиркемеден журналдарды кабыл алуу жана иштетүү үчүн конфигурациялоо аракети дароо ийгиликтүү болгон жок. Ошондуктан, биз ар бир компонентти өз-өзүнчө изилдеп, анан алардын байланыштарына кайтып келүүнү чечтик.

Ошентип, биз logstash менен баштадык.

Айлана-чөйрө, жайылтуу, контейнерде 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 практикалык колдонулушу. Logstash орнотулууда

Киргизилген маалыматтарды алуу үчүн, азыр биз бул 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 практикалык колдонулушу. 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] Лицензия серверинен лицензия маалыматы алынбай жатат {: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=>“ElasticSearch:9200/", :error_type=>LogStash::Outputs::ElasticSearch::HttpClient::Pool::HostUnreachableError, :error=>"Elasticsearch Unreachable: [http://elasticsearch:9200/:il][ResolutionF] 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=>“ElasticSearch:9200/", :error_type=>LogStash::Outputs::ElasticSearch::HttpClient::Pool::HostUnreachableError, :error=>"Elasticsearch Unreachable: [http://elasticsearch:9200/:il][ResolutionF] elasticsearch"}

А биздин журнал ар дайым сойлоп баратат.

Бул жерде мен жашыл түс менен түтүк ийгиликтүү ишке киргизилгендиги тууралуу билдирүүнү, кызыл менен ката жөнүндө билдирүүнү жана сары түс менен байланышууга аракет кылуу жөнүндө билдирүүнү белгиледим. 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. Биз текшерүүнү каалайбыз, эгерде 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

Жана 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_one_channel && докер rm logstash_one_channel), анда эч нерсе алынбайт. Окулган файлдын абалы контейнердин ичинде сакталган. Эгер сиз аны нөлдөн баштап иштетсеңиз, ал жаңы саптарды гана кабыл алат.

Учурдагы файлдарды окуу

Биз биринчи жолу logstash ишке киргизип жатабыз дейли, бирок бизде журналдар бар жана биз аларды иштеткибиз келет.
Эгерде биз жогоруда колдонгон киргизүү бөлүмү менен logstash иштетсек, биз эч нерсе албайбыз. Жаңы саптар гана logstash тарабынан иштетилет.

Учурдагы файлдардан сызыктар тартылышы үчүн, киргизүү бөлүмүнө кошумча сап кошуу керек:

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

Мындан тышкары, бир нюанс бар: бул logstash көрө элек жаңы файлдарга гана таасир этет. Logstash көрүү талаасында болгон ошол эле файлдар үчүн, ал алардын өлчөмүн эстеп калган жана эми аларга жаңы жазууларды гана кабыл алат.

Келгиле, бул жерде токтоп, киргизүү бөлүмүн изилдейли. Дагы көптөгөн варианттар бар, бирок бул дагы эксперименттер үчүн бизге жетиштүү.

Маршрутизация жана маалыматтарды трансформациялоо

Төмөнкү маселени чечүүгө аракет кылалы, бир каналдан келген билдирүүлөр бар дейли, алардын айрымдары маалыматтык, кээ бирлери ката билдирүүлөрү. Алар теги боюнча айырмаланат. Кээ бирлери INFO, башкалары КАТА.

Аларды чыга турган жерден бөлүп алышыбыз керек. Ошол. Бир каналга маалыматтык билдирүүлөрдү, экинчисине ката билдирүүлөрдү жазабыз.

Бул үчүн, киргизүү бөлүмүнөн чыпкалоо жана чыгарууга өтүңүз.

Чыпка бөлүмүн колдонуп, биз келген билдирүүнү талдайбыз, андан хэшти (ачкыч-маани жуптары) алабыз, биз аны менен иштей алабыз, б.а. шарттарга ылайык демонтаждоо. Ал эми чыгаруу бөлүмүндө биз билдирүүлөрдү тандап, ар бирин өз каналына жөнөтөбүз.

grok менен билдирүүнү талдоо

Текст саптарын талдоо жана алардан талаалардын топтомун алуу үчүн чыпка бөлүмүндө атайын плагин бар - grok.

Алдыга бул жерде кеңири мүнөздөмө берүүнү максат кылбастан (бул үчүн мен расмий документтер), Мен жөнөкөй мисал келтирейин.

Бул үчүн, сиз киргизүү саптарынын форматы жөнүндө чечим кабыл алышыңыз керек. Менде алар мындай:

1 INFO билдирүүсү1
2 ERROR билдирүүсү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

Биз аны ишке киргизип, сынап көрүп, эки агымга бөлүнүүнү көрөбүз.

Source: www.habr.com

Комментарий кошуу