Aplikasyon pratik nan ELK. Mete kanpe logstash

Entwodiksyon

Pandan ke deplwaye yon lòt sistèm, nou te fè fas ak bezwen nan trete yon gwo kantite mòso bwa diferan. ELK te chwazi kòm zouti a. Atik sa a pral diskite sou eksperyans nou nan mete kanpe pile sa a.

Nou pa fikse yon objektif pou dekri tout kapasite li yo, men nou vle konsantre espesyalman sou rezoud pwoblèm pratik. Sa a se akòz lefèt ke menm si gen yon kantite jistis gwo dokiman ak imaj ki pare, gen byen yon anpil nan enkonvenyans, omwen nou te jwenn yo.

Nou te deplwaye pile a atravè docker-compose. Anplis, nou te gen yon docker-compose.yml byen ekri, ki te pèmèt nou ogmante pil la prèske san pwoblèm. Epi nou te sanble ke viktwa te deja fèmen, kounye a nou pral ajiste li yon ti kras nan kostim bezwen nou yo e se li.

Malerezman, tantativ pou konfigirasyon sistèm lan pou resevwa ak trete mòso bwa nan aplikasyon nou an pa te reyisi imedyatman. Se poutèt sa, nou deside ke li te vo etidye chak eleman separeman, ak Lè sa a, retounen nan koneksyon yo.

Se konsa, nou te kòmanse ak logstash.

Anviwònman, deplwaman, kouri Logstash nan yon veso

Pou deplwaman nou itilize docker-compose; eksperyans yo dekri isit la te fèt sou MacOS ak Ubuntu 18.0.4.

Imaj logstash ki te anrejistre nan docker-compose.yml orijinal nou an se docker.elastic.co/logstash/logstash:6.3.2.

Nou pral sèvi ak li pou eksperyans.

Nou te ekri yon docker-compose.yml separe pou kouri logstash. Natirèlman, li te posib yo lanse imaj la soti nan liy lan lòd, men nou te rezoud yon pwoblèm espesifik, kote nou kouri tout bagay soti nan Docker-compose.

Yon ti tan sou dosye konfigirasyon

Kòm sa yo soti nan deskripsyon an, logstash ka kouri swa pou yon sèl kanal, nan ka sa a li bezwen pase fichye a *.conf, oswa pou plizyè chanèl, nan ka sa a li bezwen pase dosye a pipelines.yml, ki, nan vire. , pral konekte nan dosye yo .conf pou chak chanèl.
Nou pran dezyèm chemen an. Li te sanble pou nou plis inivèsèl ak évolutive. Se poutèt sa, nou te kreye pipelines.yml, epi fè yon anyè pipelines kote nou pral mete fichye .conf pou chak chanèl.

Anndan veso a gen yon lòt dosye konfigirasyon - logstash.yml. Nou pa manyen li, nou itilize li jan li ye.

Se konsa, estrikti anyè nou an:

Aplikasyon pratik nan ELK. Mete kanpe logstash

Pou resevwa done opinyon, pou kounye a nou sipoze ke sa a se tcp sou pò 5046, epi pou pwodiksyon nou pral itilize stdout.

Isit la se yon konfigirasyon senp pou premye lansman an. Paske travay inisyal la se lanse.

Se konsa, nou gen sa a 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

Kisa nou wè la a?

  1. Rezo ak komèsan yo te pran nan docker-compose.yml orijinal la (yon sèl kote chemine a tout antye te lanse) e mwen panse ke yo pa anpil afekte foto an jeneral isit la.
  2. Nou kreye yon sèvis logstash (yo) soti nan docker.elastic.co/logstash/logstash:6.3.2 imaj la epi bay non li logstash_one_channel.
  3. Nou voye pò 5046 andedan veso a, nan menm pò entèn la.
  4. Nou kat fichye konfigirasyon tiyo nou an ./config/pipelines.yml nan fichye /usr/share/logstash/config/pipelines.yml andedan veso a, kote logstash pral ranmase l epi fè li sèlman, jis nan ka.
  5. Nou kat anyè ./config/pipelines, kote nou gen fichye ak paramèt chanèl la, nan /usr/share/logstash/config/pipelines anyè epi tou fè li sèlman pou li.

Aplikasyon pratik nan ELK. Mete kanpe logstash

Fichye Pipelines.yml

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

Yo dekri isit la yon kanal ki gen idantifyan HABR ak chemen ki mennen nan dosye konfigirasyon li yo.

Epi finalman fichye a "./config/pipelines/habr_pipeline.conf"

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

Se pou nou pa antre nan deskripsyon li pou kounye a, se pou nou eseye kouri li:

docker-compose up

Kisa nou wè?

Veso a te kòmanse. Nou ka tcheke operasyon li yo:

echo '13123123123123123123123213123213' | nc localhost 5046

Epi nou wè repons lan nan konsole veso a:

Aplikasyon pratik nan ELK. Mete kanpe logstash

Men an menm tan, nou wè tou:

logstash_one_channel | [2019-04-29T11:28:59,790][ERROR][logstash.licensechecker.licensereader] Pa kapab rekipere enfòmasyon sou lisans nan sèvè lisans {:message=>“Elasticsearch Unreachable: [http://elasticsearch:9200/][Manticore ::ResolutionFailure] elasticsearch",...

logstash_one_channel | [2019-04-29T11:28:59,894][INFO ][logstash.pipeline ] Pipeline te kòmanse avèk siksè {:pipeline_id=>".monitoring-logstash", :thread =>"# "}

logstash_one_channel | [2019-04-29T11:28:59,988][INFO ][logstash.agent ] Pipelines kouri {: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 enstale sou Logstash men se pa sou Elasticsearch. Tanpri enstale X-Pack sou Elasticsearch pou itilize karakteristik siveyans la. Lòt karakteristik ka disponib.
logstash_one_channel | [2019-04-29T11:29:00,526][INFO ][logstash.agent ] Te kòmanse avèk siksè Logstash API endpoint {:port=>9600}
logstash_one_channel | [2019-04-29T11:29:04,478][INFO ][logstash.outputs.elasticsearch] Kouri tcheke sante pou wè si yon koneksyon Elasticsearch ap travay {:healthcheck_url=>http://elasticsearch:9200/, :path=> "/"}
logstash_one_channel | [2019-04-29T11:29:04,487][WARN ][logstash.outputs.elasticsearch] Eseye resisite koneksyon ak egzanp ES ki mouri, men li te resevwa yon erè. {:url =>"rechèch elastik yo: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] Kouri tcheke sante pou wè si yon koneksyon Elasticsearch ap travay {:healthcheck_url=>http://elasticsearch:9200/, :path=> "/"}
logstash_one_channel | [2019-04-29T11:29:04,710][WARN ][logstash.licensechecker.licensereader] Eseye resisite koneksyon ak egzanp ES ki mouri, men li te resevwa yon erè. {:url =>"rechèch elastik yo:9200/", :error_type=>LogStash::Outputs::ElasticSearch::HttpClient::Pool::HostUnreachableError, :error=>"Elasticsearch Unreachable: [http://elasticsearch:9200/][Manticore::ResolutionFailure] elasticsearch"}

Ak boutèy demi lit nou an ap trennen sou vant tout tan.

Isit la mwen te make an vèt mesaj la ke tiyo a te lanse avèk siksè, an wouj mesaj erè a ak an jòn mesaj la sou yon tantativ kontakte. rechèch elastik yo: 9200.
Sa rive paske logstash.conf, ki enkli nan imaj la, gen yon chèk pou disponiblite elastiksearch. Apre yo tout, logstash sipoze ke li travay kòm yon pati nan pil Elk la, men nou separe li.

Li posib pou travay, men li pa pratik.

Solisyon an se enfim chèk sa a atravè varyab anviwònman XPACK_MONITORING_ENABLED.

Ann fè yon chanjman nan docker-compose.yml epi kouri li ankò:

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

Koulye a, tout bagay anfòm. Veso a pare pou eksperyans.

Nou ka tape ankò nan pwochen konsole a:

echo '13123123123123123123123213123213' | nc localhost 5046

Epi gade:

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

Travay nan yon sèl chanèl

Se konsa, nou te lanse. Koulye a, ou ka aktyèlman pran tan nan konfigirasyon logstash tèt li. Se pou nou pa manyen fichye pipelines.yml la pou kounye a, ann wè sa nou ka jwenn nan travay ak yon sèl chanèl.

Mwen dwe di ke prensip jeneral nan travay ak dosye konfigirasyon chanèl la byen dekri nan manyèl ofisyèl la, isit la isit la
Si ou vle li an Ris, nou itilize yon sèl sa a atik(men sentaks rechèch la gen fin vye granmoun, nou bezwen pran sa a an kont).

Ann ale sekans soti nan seksyon an Antre. Nou te deja wè travay sou TCP. Ki lòt bagay ki ka enteresan isit la?

Tès mesaj lè l sèvi avèk batman kè

Gen yon opòtinite enteresan pou jenere mesaj tès otomatik yo.
Pou fè sa, ou bezwen pèmèt plugin heartbean nan seksyon D' a.

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

Limen li, kòmanse resevwa yon fwa pa minit

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

Si nou vle resevwa pi souvan, nou bezwen ajoute paramèt entèval la.
Men ki jan nou pral resevwa yon mesaj chak 10 segonn.

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

Rekipere done ki sòti nan yon dosye

Nou menm tou nou deside gade mòd nan dosye. Si li travay byen ak dosye a, Lè sa a, petèt pa gen okenn ajan ki nesesè, omwen pou itilizasyon lokal yo.

Dapre deskripsyon an, mòd nan fonksyone yo ta dwe menm jan ak ke -f, i.e. li nouvo liy oswa, kòm yon opsyon, li tout fichye a.

Se konsa, sa nou vle jwenn:

  1. Nou vle resevwa liy ki ajoute nan yon sèl dosye log.
  2. Nou vle resevwa done ki ekri nan plizyè fichye boutèy demi lit, pandan y ap kapab separe sa ki resevwa nan kote.
  3. Nou vle asire w ke lè logstash rekòmanse, li pa resevwa done sa yo ankò.
  4. Nou vle tcheke si logstash etenn, epi done yo kontinye ap ekri nan dosye, Lè sa a, lè nou kouri li, nou pral resevwa done sa yo.

Pou fè eksperyans la, ann ajoute yon lòt liy nan docker-compose.yml, louvri anyè a nan ki nou mete dosye yo.

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

Epi chanje seksyon opinyon nan habr_pipeline.conf

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

Ann kòmanse:

docker-compose up

Pou kreye epi ekri dosye log nou pral sèvi ak kòmandman an:


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

Wi, li travay!

An menm tan an, nou wè ke nou te otomatikman te ajoute jaden chemen an. Sa vle di ke nan lavni an, nou pral kapab filtre dosye pa li.

Ann eseye ankò:

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

Epi kounye a nan yon lòt dosye:

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

Gwo! Yo te ranmase dosye a, yo te espesifye chemen an kòrèkteman, tout bagay anfòm.

Sispann logstash epi kòmanse ankò. Ann tann. Silans. Moun sa yo. Nou pa resevwa dosye sa yo ankò.

Epi, koulye a eksperyans ki pi nana.

Enstale logstash epi egzekite:

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

Kouri logstash ankò epi wè:

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

Houra! Tout bagay te ranmase.

Men, nou dwe avèti ou sou sa ki annapre yo. Si yo efase veso ki gen logstash la (docker stop logstash_one_channel && docker rm logstash_one_channel), lè sa a pa pral pran anyen. Pozisyon fichye a jiska kote li te li a te estoke andedan veso a. Si ou kouri li nan grafouyen, li pral sèlman aksepte nouvo liy.

Lekti dosye ki egziste deja

Ann di nou ap lanse logstash pou premye fwa, men nou deja gen mòso bwa e nou ta renmen trete yo.
Si nou kouri logstash ak seksyon D' nou te itilize pi wo a, nou p'ap jwenn anyen. Se sèlman nouvo liy yo pral trete pa logstash.

Pou liy ki soti nan dosye ki egziste deja yo dwe rale moute, ou ta dwe ajoute yon liy adisyonèl nan seksyon an opinyon:

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

Anplis, gen yon nuans: sa sèlman afekte nouvo dosye ki logstash poko wè. Pou dosye yo menm ki te deja nan jaden an de vi nan logstash, li te deja sonje gwosè yo epi kounye a pral sèlman pran nouvo antre nan yo.

Ann sispann isit la epi etidye seksyon opinyon an. Genyen toujou anpil opsyon, men sa a ase pou nou pou plis eksperyans pou kounye a.

Routage ak transfòmasyon done

Ann eseye rezoud pwoblèm sa a, ann di nou gen mesaj ki soti nan yon sèl kanal, kèk nan yo se enfòmasyon, ak kèk se mesaj erè. Yo diferan pa tag. Gen kèk ki ENFO, lòt ki se ERÈ.

Nou bezwen separe yo nan sòti a. Moun sa yo. Nou ekri mesaj enfòmasyon sou yon kanal, ak mesaj erè nan yon lòt.

Pou fè sa, deplase soti nan seksyon an opinyon filtre ak pwodiksyon.

Sèvi ak seksyon filtre a, nou pral analize mesaj la fèk ap rantre, jwenn yon hash (pè kle-valè) nan men li, ki nou ka deja travay avèk, i.e. demonte selon kondisyon yo. Ak nan seksyon pwodiksyon an, nou pral chwazi mesaj epi voye chak youn nan chanèl pwòp li yo.

Analize yon mesaj ak grok

Yo nan lòd yo analize fisèl tèks epi jwenn yon seri jaden nan men yo, gen yon plugin espesyal nan seksyon an filtre - grok.

San yo pa mete tèt mwen objektif pou bay yon deskripsyon detaye sou li isit la (pou sa mwen refere a dokiman ofisyèl yo), mwen pral bay egzanp senp mwen an.

Pou fè sa, ou bezwen deside sou fòma fisèl yo opinyon. Mwen genyen yo konsa:

1 ENFO mesaj1
2 ERREUR mesaj2

Moun sa yo. Idantifyan an vini an premye, Lè sa a, ENFO/ERREUR, Lè sa a, kèk mo san espas.
Li pa difisil, men li ase yo konprann prensip la nan operasyon.

Se konsa, nan seksyon an filtre nan grok plugin a, nou dwe defini yon modèl pou analize fisèl nou yo.

Li pral sanble sa a:

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

Esansyèlman li se yon ekspresyon regilye. Yo itilize modèl ki pare yo, tankou INT, LOGLEVEL, WORD. Ou ka jwenn deskripsyon yo, ansanm ak lòt modèl yo isit la isit la

Koulye a, pase nan filtè sa a, fisèl nou an pral tounen yon hash nan twa jaden: message_id, message_type, message_text.

Yo pral parèt nan seksyon pwodiksyon an.

Wout mesaj nan seksyon pwodiksyon an lè l sèvi avèk lòd la si

Nan seksyon pwodiksyon an, jan nou sonje, nou te pral divize mesaj yo an de kouran. Gen kèk - ki se iNFO, yo pral pwodiksyon nan konsole a, epi ak erè, nou pral pwodiksyon nan yon dosye.

Ki jan nou separe mesaj sa yo? Kondisyon pwoblèm nan deja sijere yon solisyon - apre tout, nou deja gen yon jaden dedye message_type, ki ka sèlman pran de valè: ENFO ak ERÈ. Se sou baz sa a ke nou pral fè yon chwa lè l sèvi avèk deklarasyon si la.

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

Ou ka jwenn yon deskripsyon travay ak jaden ak operatè yo nan seksyon sa a manyèl ofisyèl.

Koulye a, sou konklizyon aktyèl la tèt li.

Pwodiksyon konsole, tout bagay klè isit la - stdout {}

Men, pwodiksyon an nan yon dosye - sonje ke nou ap kouri tout bagay sa a soti nan yon veso ak nan lòd pou dosye a nan ki nou ekri rezilta a yo dwe aksesib soti nan deyò a, nou bezwen louvri anyè sa a nan docker-compose.yml.

Total:

Seksyon pwodiksyon dosye nou an sanble sa a:


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

Nan docker-compose.yml nou ajoute yon lòt volim pou pwodiksyon:

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

Nou lanse li, eseye li, epi wè yon divizyon an de kouran.

Sous: www.habr.com

Add nouvo kòmantè