Applikazzjoni prattika ta 'ELK. Twaqqif ta' logstash

Introduzzjoni

Waqt l-iskjerament ta’ sistema oħra, konna ffaċċjati bil-ħtieġa li nipproċessaw numru kbir ta’ zkuk differenti. ELK intgħażel bħala l-għodda. Dan l-artikolu ser jiddiskuti l-esperjenza tagħna fit-twaqqif ta 'dan il-munzell.

Aħna ma nistabbilixxux mira li niddeskrivu l-kapaċitajiet kollha tagħha, iżda rridu nikkonċentraw speċifikament fuq is-soluzzjoni ta 'problemi prattiċi. Dan minħabba l-fatt li minkejja li hemm ammont pjuttost kbir ta’ dokumentazzjoni u immaġini lesti, hemm pjuttost ħafna nases, għall-inqas sibnahom.

Aħna skjerati l-munzell permezz ta 'docker-compose. Barra minn hekk, kellna docker-compose.yml miktub tajjeb, li ppermettilna ngħollu l-munzell kważi mingħajr problemi. U dehrilna li r-rebħa kienet diġà qrib, issa se nirranġawha ftit biex taqbel mal-bżonnijiet tagħna u hekk.

Sfortunatament, it-tentattiv biex tiġi kkonfigurata s-sistema biex tirċievi u tipproċessa zkuk mill-applikazzjoni tagħna ma rnexxiex immedjatament. Għalhekk, iddeċidejna li kien ta 'min nistudjaw kull komponent separatament, u mbagħad nerġgħu lura għall-konnessjonijiet tagħhom.

Allura, bdejna bil-logstash.

Ambjent, skjerament, tmexxija ta' Logstash f'kontenitur

Għall-iskjerament nużaw docker-compose; l-esperimenti deskritti hawn saru fuq MacOS u Ubuntu 18.0.4.

L-immaġni tal-logstash li kienet irreġistrata fid-docker-compose.yml oriġinali tagħna hija docker.elastic.co/logstash/logstash:6.3.2

Aħna se nużawha għal esperimenti.

Aħna ktibna docker-compose.yml separat biex imexxi logstash. Naturalment, kien possibbli li titnieda l-immaġni mil-linja tal-kmand, iżda konna nsolvu problema speċifika, fejn inmexxu kollox minn docker-compose.

Fil-qosor dwar il-fajls tal-konfigurazzjoni

Kif ġej mid-deskrizzjoni, logstash jista 'jitħaddem jew għal kanal wieħed, f'liema każ jeħtieġ li jgħaddi l-fajl *.conf, jew għal diversi kanali, f'liema każ jeħtieġ li jgħaddi l-fajl pipelines.yml, li, min-naħa tiegħu , se jorbtu mal-fajls .conf għal kull kanal.
Ħadna t-tieni triq. Deherna aktar universali u skalabbli. Għalhekk, ħloqna pipelines.yml, u għamilna direttorju tal-pipelines li fih se npoġġu fajls .conf għal kull kanal.

Ġewwa l-kontenitur hemm fajl ieħor ta 'konfigurazzjoni - logstash.yml. Ma nmissuhx, nużawha kif inhu.

Allura, l-istruttura tad-direttorju tagħna:

Applikazzjoni prattika ta 'ELK. Twaqqif ta' logstash

Biex tirċievi dejta tal-input, għalissa nassumu li dan huwa tcp fuq il-port 5046, u għall-output se nużaw stdout.

Hawnhekk hawn konfigurazzjoni sempliċi għall-ewwel tnedija. Minħabba li l-kompitu inizjali huwa li tniedi.

Allura, għandna dan 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

X'naraw hawn?

  1. In-netwerks u l-volumi ttieħdu mid-docker-compose.yml oriġinali (dik fejn titnieda l-munzell kollu) u naħseb li ma jaffettwawx ħafna l-istampa ġenerali hawn.
  2. Noħolqu servizz(i) ta' logstash wieħed mill-immaġni docker.elastic.co/logstash/logstash:6.3.2 u isemmuha logstash_one_channel.
  3. Nibgħatu l-port 5046 ġewwa l-kontenitur, lejn l-istess port intern.
  4. Aħna nimmappaw il-fajl tal-konfigurazzjoni tal-pajp tagħna ./config/pipelines.yml għall-fajl /usr/share/logstash/config/pipelines.yml ġewwa l-kontenitur, fejn logstash se jtellgħu u jagħmlu jinqara biss, fil-każ.
  5. Aħna nimmappaw id-direttorju ./config/pipelines, fejn għandna fajls b'settings tal-kanal, fid-direttorju /usr/share/logstash/config/pipelines u nagħmluh ukoll jinqara biss.

Applikazzjoni prattika ta 'ELK. Twaqqif ta' logstash

Fajl Pipelines.yml

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

Kanal wieħed bl-identifikatur HABR u t-triq għall-fajl tal-konfigurazzjoni tiegħu huma deskritti hawn.

U finalment il-fajl “./config/pipelines/habr_pipeline.conf”

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

Ejja ma nidħlux fid-deskrizzjoni tagħha għalissa, ejja nippruvaw inħaddmu:

docker-compose up

X'naraw?

Il-kontenitur beda. Nistgħu niċċekkjaw it-tħaddim tiegħu:

echo '13123123123123123123123213123213' | nc localhost 5046

U naraw ir-rispons fil-console tal-kontenitur:

Applikazzjoni prattika ta 'ELK. Twaqqif ta' logstash

Iżda fl-istess ħin, naraw ukoll:

logstash_one_channel | [2019-04-29T11:28:59,790][ERROR][logstash.licensechecker.licensereader] Ma tistax tiġi rkuprata l-informazzjoni tal-liċenzja mis-server tal-liċenzja {:message=>“Elasticsearch Unreachable: [http://elasticsearch:9200/][Manticore ::ResolutionFailure] elasticsearch",...

logstash_one_channel | [2019-04-29T11:28:59,894][INFO ][logstash.pipeline ] Pipeline beda b'suċċess {:pipeline_id=>".monitoring-logstash", :thread =>"# "}

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 huwa installat fuq Logstash iżda mhux fuq Elasticsearch. Jekk jogħġbok installa X-Pack fuq Elasticsearch biex tuża l-karatteristika ta 'monitoraġġ. Karatteristiċi oħra jistgħu jkunu disponibbli.
logstash_one_channel | [2019-04-29T11:29:00,526][INFO ][logstash.agent ] Inbeda b'suċċess Logstash API endpoint {:port=>9600}
logstash_one_channel | [2019-04-29T11:29:04,478][INFO ][logstash.outputs.elasticsearch] Tmexxi verifika tas-saħħa biex tara jekk konnessjoni ta' Elasticsearch tkunx qed taħdem {:healthcheck_url=>http://elasticsearch:9200/, :path=> "/"}
logstash_one_channel | [2019-04-29T11:29:04,487][WARN ][logstash.outputs.elasticsearch] Ipprova jqajjem konnessjoni ma' istanza ES mejta, iżda kiseb żball. {: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] Tmexxi verifika tas-saħħa biex tara jekk konnessjoni ta' Elasticsearch tkunx qed taħdem {:healthcheck_url=>http://elasticsearch:9200/, :path=> "/"}
logstash_one_channel | [2019-04-29T11:29:04,710][WARN ][logstash.licensechecker.licensereader] Ipprova jqajjem konnessjoni ma' istanza ES mejta, iżda kiseb żball. {:url =>“elasticsearch:9200/", :error_type=>LogStash::Outputs::ElasticSearch::HttpClient::Pool::HostUnreachableError, :error=>"Elasticsearch Unreachable: [http://elasticsearch:9200/][Manticore::ResolutionFailure] elasticsearch"}

U l-ġurnal tagħna qed jitkaxkar il-ħin kollu.

Hawnhekk enfasizzajt bl-aħdar il-messaġġ li l-pipeline nieda b’suċċess, bl-aħmar il-messaġġ ta’ żball u bl-isfar il-messaġġ dwar attentat ta’ kuntatt elasticsearch: 9200.
Dan jiġri minħabba li logstash.conf, inkluż fl-immaġini, fih verifika għad-disponibbiltà elastika. Wara kollox, logstash jassumi li jaħdem bħala parti mill-munzell Elk, iżda aħna sseparajna.

Huwa possibbli li taħdem, iżda mhuwiex konvenjenti.

Is-soluzzjoni hija li tiddiżattiva dan il-kontroll permezz tal-varjabbli ambjentali XPACK_MONITORING_ENABLED.

Ejja nagħmlu bidla f'docker-compose.yml u erġa' nħaddmu:

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

Issa, kollox tajjeb. Il-kontenitur huwa lest għall-esperimenti.

Nistgħu nerġgħu nittajpja fil-console li jmiss:

echo '13123123123123123123123213123213' | nc localhost 5046

U ara:

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

Ħidma fi ħdan kanal wieħed

Għalhekk nedejna. Issa inti tista 'attwalment tieħu l-ħin biex tikkonfigura logstash innifsu. Ejja ma tmissx il-fajl pipelines.yml għalissa, ejja naraw x'nistgħu niksbu billi naħdmu ma 'kanal wieħed.

Irrid ngħid li l-prinċipju ġenerali ta 'ħidma mal-fajl tal-konfigurazzjoni tal-kanal huwa deskritt tajjeb fil-manwal uffiċjali, hawn hawn
Jekk trid taqra bir-Russu, użajna dan artikolu(iżda s-sintassi tal-mistoqsija hemm antika, irridu nqisu dan).

Ejja mmorru sekwenzjali mit-taqsima Input. Diġà rajna xogħol fuq TCP. X'iktar jista' jkun interessanti hawn?

Messaġġi tat-test bl-użu tat-taħbit tal-qalb

Hemm opportunità tant interessanti biex tiġġenera messaġġi tat-test awtomatiċi.
Biex tagħmel dan, jeħtieġ li tattiva l-plugin tal-qalb fit-taqsima tal-input.

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

Ixgħelha, ibda tirċievi darba fil-minuta

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

Jekk irridu nirċievu aktar spiss, irridu nżidu l-parametru tal-intervall.
Hekk se nirċievu messaġġ kull 10 sekondi.

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

Irkupru tad-dejta minn fajl

Iddeċidejna wkoll li nħarsu lejn il-modalità tal-fajl. Jekk taħdem sew mal-fajl, allura forsi ma jkun meħtieġ l-ebda aġent, għall-inqas għall-użu lokali.

Skont id-deskrizzjoni, il-mod operattiv għandu jkun simili għal denb -f, i.e. jaqra linji ġodda jew, bħala għażla, jaqra l-fajl kollu.

Allura dak li rridu niksbu:

  1. Irridu nirċievu linji li huma mehmuża ma 'log file wieħed.
  2. Irridu nirċievu data li tinkiteb f'diversi log files, filwaqt li nkunu nistgħu nisseparaw dak li jiġi riċevut minn fejn.
  3. Irridu niżguraw li meta logstash jerġa' jinbeda, ma jerġax jirċievi din id-dejta.
  4. Irridu niċċekkjaw li jekk logstash jintefa, u d-dejta tkompli tinkiteb fil-fajls, allura meta nħaddmuha, nirċievu din id-dejta.

Biex twettaq l-esperiment, ejja nżidu linja oħra ma 'docker-compose.yml, u tiftaħ id-direttorju li fih inpoġġu l-fajls.

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

U ibdel is-sezzjoni tal-input f'habr_pipeline.conf

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

Ejja nibdew:

docker-compose up

Biex noħolqu u niktbu log files aħna se nużaw il-kmand:


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

Yep, taħdem!

Fl-istess ħin, naraw li żidna awtomatikament il-qasam tal-passaġġ. Dan ifisser li fil-futur, inkunu nistgħu niffiltraw ir-rekords minnha.

Ejja nerġgħu nippruvaw:

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

U issa għal fajl ieħor:

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

Kbir! Il-fajl inġabar, it-triq kienet speċifikata b'mod korrett, kollox tajjeb.

Waqqaf logstash u ibda mill-ġdid. Ejja nistennew. Silenzju. Dawk. Aħna ma nirċievux dawn ir-rekords mill-ġdid.

U issa l-aktar esperiment awdaċi.

Installa logstash u esegwi:

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

Erġa' ħaddem logstash u ara:

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

Ħura! Kollox inġabar.

Imma rridu nwissuk dwar dan li ġej. Jekk il-kontenitur tal-logstash jitħassar (docker stop logstash_one_channel && docker rm logstash_one_channel), allura ma jinġabar xejn. Il-pożizzjoni tal-fajl sa fejn inqara kienet maħżuna ġewwa l-kontenitur. Jekk tmexxiha mill-bidu, taċċetta biss linji ġodda.

Qari ta 'fajls eżistenti

Ejja ngħidu li qed inniedu logstash għall-ewwel darba, iżda diġà għandna zkuk u nixtiequ nipproċessawhom.
Jekk inħaddmu logstash bit-taqsima tal-input li użajna hawn fuq, ma nġibu xejn. Linji ġodda biss se jiġu pproċessati minn logstash.

Sabiex il-linji minn fajls eżistenti jinġibdu 'l fuq, għandek iżżid linja addizzjonali mat-taqsima tal-input:

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

Barra minn hekk, hemm sfumatura: dan jaffettwa biss fajls ġodda li logstash għadu ma rax. Għall-istess fajls li kienu diġà fil-qasam tal-vista ta 'logstash, diġà ftakar id-daqs tagħhom u issa se jieħu biss daħliet ġodda fihom.

Ejja nieqfu hawn u nistudjaw it-taqsima tal-input. Għad hemm ħafna għażliet, iżda dan huwa biżżejjed għalina għal aktar esperimenti għalissa.

Rotot u Trasformazzjoni tad-Data

Ejja nippruvaw insolvu l-problema li ġejja, ejja ngħidu li għandna messaġġi minn kanal wieħed, xi wħud minnhom huma informattivi, u xi wħud huma messaġġi ta 'żball. Huma differenti minn tag. Xi wħud huma INFO, oħrajn huma ŻBALL.

Irridu nisseparawhom mal-ħruġ. Dawk. Aħna niktbu messaġġi ta 'informazzjoni f'kanal wieħed, u messaġġi ta' żball f'ieħor.

Biex tagħmel dan, imxi mit-taqsima tal-input għall-iffiltrar u l-output.

Bl-użu tas-sezzjoni tal-filtru, aħna se naħdmu l-messaġġ li jkun dieħel, billi niksbu hash (pari ewlenin-valur) minnu, li diġà nistgħu naħdmu miegħu, i.e. żarma skond il-kondizzjonijiet. U fit-taqsima tal-output, aħna se nagħżlu messaġġi u nibagħtu kull wieħed lill-kanal tiegħu stess.

Parsing messaġġ ma grok

Sabiex jiġu analizzati strings tat-test u tikseb sett ta 'oqsma minnhom, hemm plugin speċjali fit-taqsima tal-filtru - grok.

Mingħajr ma nistabbilixxi lili nnifsi l-għan li nagħti deskrizzjoni dettaljata tagħha hawn (għal dan nirreferi għalih dokumentazzjoni uffiċjali), ser nagħti l-eżempju sempliċi tiegħi.

Biex tagħmel dan, trid tiddeċiedi dwar il-format tal-kordi tal-input. Jien għandihom hekk:

1 messaġġ INFO1
2 messaġġ ta' ŻBALL2

Dawk. L-identifikatur jiġi l-ewwel, imbagħad INFO/Żball, imbagħad xi kelma mingħajr spazji.
Mhuwiex diffiċli, iżda huwa biżżejjed li tifhem il-prinċipju ta 'operazzjoni.

Allura, fit-taqsima tal-filtru tal-plugin grok, irridu niddefinixxu mudell għall-parsing tal-kordi tagħna.

Se tidher bħal din:

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

Essenzjalment hija espressjoni regolari. Jintużaw mudelli lesti, bħal INT, LOGLEVEL, WORD. Id-deskrizzjoni tagħhom, kif ukoll mudelli oħra, jistgħu jinstabu hawn hawn

Issa, meta tgħaddi minn dan il-filtru, is-sekwenza tagħna tinbidel f'hash ta' tliet oqsma: message_id, message_type, message_text.

Dawn se jintwerew fit-taqsima tal-output.

Ir-rotta tal-messaġġi lejn it-taqsima tal-output bl-użu tal-kmand if

Fit-taqsima tal-output, kif niftakru, konna se naqsmu l-messaġġi f'żewġ flussi. Xi wħud - li huma iNFO, se jiġu output għall-console, u bi żbalji, aħna se toħroġ għal fajl.

Kif nisseparaw dawn il-messaġġi? Il-kundizzjoni tal-problema diġà tissuġġerixxi soluzzjoni - wara kollox, diġà għandna qasam dedikat message_type, li jista 'jieħu biss żewġ valuri: INFO u ERROR. Huwa fuq din il-bażi li se nagħmlu għażla billi nużaw id-dikjarazzjoni if.

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

Deskrizzjoni tal-ħidma ma' oqsma u operaturi tista' tinstab f'din it-taqsima manwal uffiċjali.

Issa, dwar il-konklużjoni attwali nnifisha.

Output tal-console, kollox huwa ċar hawn - stdout {}

Iżda l-output għal fajl - ftakar li qed inħaddmu dan kollu minn kontenitur u sabiex il-fajl li fih niktbu r-riżultat ikun aċċessibbli minn barra, għandna bżonn niftħu dan id-direttorju f'docker-compose.yml.

Total:

Is-sezzjoni tal-output tal-fajl tagħna tidher bħal din:


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

F'docker-compose.yml aħna nżidu volum ieħor għall-output:

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

Innieduha, nippruvawha, u naraw diviżjoni f'żewġ flussi.

Sors: www.habr.com

Żid kumment