Sepana pratîkî ya ELK. Sazkirina logstash

Pîrozbahiyê

Dema ku pergalek din bi cih kirin, em bi hewcedariya ku hejmareke mezin ji têketinên cihêreng bişopînin re rû bi rû man. ELK wek amûr hat hilbijartin. Ev gotar dê ezmûna me ya di sazkirina vê stakê de nîqaş bike.

Em armancek diyar nakin ku hemî şiyanên wê diyar bikin, lê em dixwazin bi taybetî li ser çareserkirina pirsgirêkên pratîkî bisekinin. Ev ji ber vê yekê ye ku her çend hejmareke pir zêde belge û wêneyên amade hene jî, bi kêmanî me ew dîtin.

Me stack bi rêya docker-compose vekir. Wekî din, me docker-compose.yml-ya xweş-nivîsandî hebû, ku hişt ku em hema hema bê pirsgirêk pileyê bilind bikin. Û ji me re xuya bû ku serkeftin jixwe nêzîk bû, naha em ê li gorî hewcedariyên xwe piçekî bişopînin û ew e.

Mixabin, hewildana me ya mîhengkirina pergalê da ku têketinên ji serîlêdana me werbigire û bişopîne tavilê bi ser neket. Ji ber vê yekê, me biryar da ku hêja ye ku her pêkhateyek ji hev cuda bixwîne, û paşê vegere girêdanên wan.

Ji ber vê yekê, me bi logstash dest pê kir.

Jîngeh, bicihkirin, xebitandina Logstash di konteynerê de

Ji bo bicîhkirinê em docker-compose bikar tînin; ceribandinên ku li vir hatine vegotin li ser MacOS û Ubuntu 18.0.4 hatine kirin.

Wêneyê logstash ku di docker-compose.yml meya orîjînal de hatî tomar kirin docker.elastic.co/logstash/logstash:6.3.2 e

Em ê ji bo ceribandinan bikar bînin.

Me docker-compose.yml cuda nivîsand ku logstash bimeşîne. Bê guman, gengaz bû ku wêneyê ji rêza fermanê were destpêkirin, lê me pirsgirêkek taybetî çareser dikir, ku em her tiştî ji docker-compose dimeşînin.

Bi kurtî li ser pelên vesazkirinê

Wekî ku ji ravekirinê tê, logstash dikare ji bo yek kanalek were xebitandin, di vê rewşê de ew hewce dike ku pelê *.conf derbas bike, an jî ji bo çend kanalan, di vê rewşê de pêdivî ye ku pelê pipelines.yml derbas bike, ku di encamê de , dê ji bo her kanalek pelên .conf girêdin.
Me rêya duyemîn girt. Ji me re gerdûnîtir û berfirehtir xuya bû. Ji ber vê yekê, me pipelines.yml ava kir, û pelrêça boriyan çêkir ku tê de em ê ji bo her kanalek pelên .conf bixin.

Di hundurê konteynerê de pelek veavakirinê ya din heye - logstash.yml. Em dest nadin wê, em wekî ku heye bikar tînin.

Ji ber vê yekê, avahiya pelrêça me:

Sepana pratîkî ya ELK. Sazkirina logstash

Ji bo wergirtina daneyên têketinê, heya niha em texmîn dikin ku ev tcp li porta 5046-ê ye, û ji bo derketinê em ê stdout bikar bînin.

Li vir ji bo destpêkirina yekem veavakirinek hêsan e. Ji ber ku peywira destpêkê destpêk e.

Ji ber vê yekê, me ev docker-compose.yml heye

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

Em li vir çi dibînin?

  1. Torgilok û cild ji orîjînal docker-compose.yml hatine girtin (ya ku tevahiya stêrk lê tê destpêkirin) û ez difikirim ku ew li vir pir bandorê li ser wêneya giştî nakin.
  2. Em ji wêneya docker.elastic.co/logstash/logstash:6.3.2 yek karûbarê logstash diafirînin û navê wê dikin logstash_one_channel.
  3. Em porta 5046 di hundurê konteynerê de, berbi heman porta hundurîn ve dişînin.
  4. Em pelê veavakirina boriyê ./config/pipelines.yml nexşeya pelê /usr/share/logstash/config/pipelines.yml di hundurê konteynerê de, li wir logstash wê hilde û bike, tenê ji bo xwendinê.
  5. Em pelrêça ./config/pipelines, ku pelên me yên bi mîhengên kanalê hene, di pelrêça /usr/share/logstash/config/pipelines de nexşe dikin û di heman demê de wê tenê xwendinê jî dikin.

Sepana pratîkî ya ELK. Sazkirina logstash

Pelê Pipelines.yml

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

Yek kanalek bi nasnavê HABR û rêça pelê veavakirina wê li vir têne diyar kirin.

Û di dawiyê de pelê "./config/pipelines/habr_pipeline.conf"

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

Ka em niha neçin danasîna wê, em hewl bidin ku wê bimeşînin:

docker-compose up

Em çi bibînin?

Konteynir dest pê kir. Em dikarin operasyona wê kontrol bikin:

echo '13123123123123123123123213123213' | nc localhost 5046

Û em bersivê di konsolê konteynerê de dibînin:

Sepana pratîkî ya ELK. Sazkirina logstash

Lê di heman demê de, em jî dibînin:

logstash_one_channel | [2019-04-29T11:28:59,790][ERROR][logstash.licensechecker.licensereader] Nabe ku agahdariya lîsansê ji pêşkêşkara lîsansê bistîne {:message=>“Elasticsearch Nehatiye: [http://elasticsearch:9200/][Manticore ::ResolutionFailure] elasticsearch", ...

logstash_one_channel | [2019-04-29T11:28:59,894][INFO ][logstash.pipeline ] Boriya bi serkeftî dest pê kir {:pipeline_id=>".monitoring-logstash", :thread=>"# "}

logstash_one_channel | [2019-04-29T11:28:59,988][INFO ][logstash.agent ] Xetên boriyên ku dixebitin {:count=>2, :running_pipelines=>[:HABR, :".monitoring-logstash"], :non_running_pipelines=>[ ]}
logstash_one_channel | [2019-04-29T11:29:00,015][ÇEWT][logstash.inputs.metrics] X-Pack li Logstash hatiye sazkirin lê ne li ser Elasticsearch. Ji kerema xwe X-Pack li ser Elasticsearch saz bikin da ku taybetmendiya çavdêriyê bikar bînin. Dibe ku taybetmendiyên din hebin.
logstash_one_channel | [2019-04-29T11:29:00,526][INFO ][logstash.agent ] Bi serketî dest pê kir xala dawî ya Logstash API {:port=>9600}
logstash_one_channel | [2019-04-29T11:29:04,478][INFO ][logstash.outputs.elasticsearch] Kontrola tenduristiyê dimeşîne da ku bibîne ka girêdanek Elasticsearch dixebite {:healthcheck_url=>http://elasticsearch:9200/, :path=> "/"}
logstash_one_channel | [2019-04-29T11:29:04,487][HIŞYAR ][logstash.outputs.elasticsearch] Hewl da ku girêdana bi mînaka ES ya mirî vejîne, lê xeletiyek derket. {:url=>“elasticsearch:9200/", :error_type=>LogStash::Outputs::ElasticSearch::HttpClient::Pool::HostUnreachableError, :error=>"Elasticsearch Nederbasdar: [http://elasticsearch:9200/:][Resoureail:] elasticearch"}
logstash_one_channel | [2019-04-29T11:29:04,704][INFO ][logstash.licensechecker.licensereader] Kontrola tenduristiyê dimeşîne da ku bibîne ka girêdanek Elasticsearch dixebite {:healthcheck_url=>http://elasticsearch:9200/, :path=> "/"}
logstash_one_channel | [2019-04-29T11:29:04,710][HIŞYAR ][logstash.licensechecker.licensereader] Hewl da ku girêdana bi mînaka ES ya mirî vejîne, lê xeletiyek derket. {:url=>“elasticsearch:9200/", :error_type=>LogStash::Outputs::ElasticSearch::HttpClient::Pool::HostUnreachableError, :error=>"Elasticsearch Nederbasdar: [http://elasticsearch:9200/:][Resoureail:] elasticearch"}

Û loga me her dem diherike.

Li vir min bi kesk peyama ku xeta boriyê bi serfirazî dest pê kiriye, bi sor peyama xeletiyê û bi zer jî peyama li ser hewldana pêwendiyê ronî kiriye. elasticsearch: 9200.
Ev diqewime ji ber ku logstash.conf, ku di wêneyê de ye, ji bo hebûna elasticsearch kontrolek vedigire. Beriya her tiştî, logstash texmîn dike ku ew wekî beşek ji stacka Elk dixebite, lê me ew ji hev veqetand.

Kar e, lê ne rehet e.

Çareserî ev e ku meriv vê kontrolê bi guhêrbara jîngehê XPACK_MONITORING_ENABLED neçalak bike.

Ka em li docker-compose.yml guhertinekê bikin û wê dîsa bimeşînin:

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

Niha, her tişt baş e. Konteynir ji bo ceribandinan amade ye.

Em dikarin dîsa di konsolê jêrîn de binivîsin:

echo '13123123123123123123123213123213' | nc localhost 5046

Û bibînin:

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

Di yek kanalê de dixebitin

Ji ber vê yekê me dest pê kir. Naha hûn dikarin bi rastî wextê xwe bidin ku logstash bixwe mîheng bikin. Ka em niha destê xwe nedin pelê pipelines.yml, em bibînin ka em dikarin bi yek kanalê re çi bi dest bixin.

Divê ez bibêjim ku prensîba giştî ya xebata bi pelê veavakirina kanalê re di manuala fermî de, li vir, baş tête diyar kirin vir
Heke hûn dixwazin bi rûsî bixwînin, me ev yek bikar anî tişt(lê hevoksaziya pirsê ya li wir kevn e, divê em vê yekê li ber çavan bigirin).

Ka em bi rêzê ji beşa Ketinê biçin. Me berê kar li ser TCP dîtiye. Çi din dikare li vir balkêş be?

Mesajên bi karanîna lêdana dil biceribînin

Ji bo afirandina peyamên testa otomatîkî fersendek wusa balkêş heye.
Ji bo kirina vê yekê, hûn hewce ne ku pêveka dil di beşa têketinê de çalak bikin.

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

Wê vekin, deqeyek carekê dest bi wergirtinê bikin

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

Ger em dixwazin pir caran wergirin, pêdivî ye ku em pîvana navberê zêde bikin.
Bi vî rengî em ê her 10 saniyan peyamek bistînin.

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

Vegerandina daneyan ji pelê

Me jî biryar da ku em li moda pelê binêrin. Ger ew bi pelê re baş bixebite, wê hingê dibe ku tu karmend ne hewce be, bi kêmanî ji bo karanîna herêmî.

Li gorî ravekirinê, moda xebitandinê divê mîna dûvik -f be, yanî. rêzikên nû dixwîne an jî, wekî vebijark, tevahiya pelê dixwîne.

Ji ber vê yekê tiştê ku em dixwazin bistînin:

  1. Em dixwazin rêzikên ku bi pelek têketinê ve hatine zêdekirin bistînin.
  2. Em dixwazin daneyên ku li gelek pelên têketinê hatine nivîsandin bistînin, di heman demê de ku em karibin tiştê ku ji ku tê wergirtin veqetînin.
  3. Em dixwazin pê ewle bin ku gava logstash ji nû ve were destpêkirin, ew dîsa van daneyan wernagire.
  4. Em dixwazin kontrol bikin ku ger logstash were girtin, û nivîsandina daneyan li pelan berdewam bike, wê hingê gava ku em wê bimeşînin, em ê vê daneyê bistînin.

Ji bo pêkanîna ceribandinê, em rêzek din li docker-compose.yml zêde bikin, pelrêça ku em pelan tê de danîne vekin.

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

Û di habr_pipeline.conf de beşa têketinê biguherînin

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

Ka em dest pê bikin:

docker-compose up

Ji bo afirandina û nivîsandina pelên têketinê em ê fermanê bikar bînin:


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

Erê, ew dixebite!

Di heman demê de, em dibînin ku me bixweber qada rê lê zêde kiriye. Ev tê wê wateyê ku di pêşerojê de, em ê karibin tomaran li gorî wê fîlter bikin.

Ka em dîsa biceribînin:

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

Û niha li pelek din:

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

Ecêb! Pelê hate hildan, rê rast hate diyar kirin, her tişt baş e.

Logstash rawestînin û dîsa dest pê bikin. Em li bendê bin. Bêdengî. Ewan. Em careke din van qeydan nagirin.

Û niha ceribandina herî wêrek.

Logstash saz bikin û bicîh bikin:

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

Logstash dîsa bişopînin û bibînin:

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

Hooray! Her tişt hate hilanîn.

Lê divê em we li ser tiştên jêrîn hişyar bikin. Ger konteynera logstash were jêbirin (docker stop logstash_one_channel && docker rm logstash_one_channel), wê hingê tiştek nayê hilgirtin. Cihê dosyaya ku lê hat xwendin di hundurê konteynerê de hate hilanîn. Ger hûn wê ji sifirê bimeşînin, ew ê tenê xetên nû qebûl bike.

Pelên heyî dixwînin

Em bibêjin ku em cara yekem logstash didin destpêkirin, lê jixwe têketinên me hene û em dixwazin wan bişopînin.
Ger em logstash-ê bi beşa têketina ku me li jor bikar anîne bimeşînin, em ê tiştek nestînin. Tenê rêzikên nû dê ji hêla logstash ve bêne hilberandin.

Ji bo ku xêzên pelên heyî werin hilanîn, divê hûn rêzek din li beşa têketinê zêde bikin:

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

Wekî din, nuwazeyek heye: ev tenê bandorê li pelên nû dike ku logstash hîn nedîtiye. Ji bo heman pelên ku berê di qada dîtina logstash de bûn, wê berê mezinahiya wan bi bîr anî û naha dê tenê têketinên nû di wan de bigire.

Ka em li vir rawestin û beşa têketinê bixwînin. Hîn jî gelek vebijark hene, lê ji bo ceribandinên din ji bo me bes e.

Routing û Veguherîna Daneyên

Ka em hewl bidin ku pirsgirêka jêrîn çareser bikin, em bibêjin me ji yek kanalek peyam hene, hin ji wan agahdar in, û hin jî peyamên xeletiyê ne. Ew ji hêla tagê ve cûda dibin. Hin INFO, yên din ÇEWT in.

Divê em wan di derketinê de ji hev veqetînin. Ewan. Em di kanalek de peyamên agahdariyê, di kanalek din de jî peyamên xeletiyê dinivîsin.

Ji bo vê yekê, ji beşa têketinê berbi parzûn û derketinê ve biçin.

Bi karanîna beşa parzûnê, em ê peyama gihîştî parsek bikin, ji wê haş (cotên key-nirx) bistînin, ku em berê dikarin pê re bixebitin, ango. li gorî şert û mercan ji hev veqetînin. Û di beşa derketinê de, em ê peyaman hilbijêrin û her yekê ji kanala xwe re bişînin.

Parskirina peyamek bi grok

Ji bo ku hûn rêzikên nivîsê parsek bikin û komek qadan ji wan bistînin, di beşa parzûnê de pêvekek taybetî heye - grok.

Bêyî ku ez ji xwe re armanc bikim ku li vir şiroveyek berfireh bidim (ji bo vê yekê ez vedibêjim belgeyên fermî), Ez ê mînaka xwe ya hêsan bidim.

Ji bo vê yekê, hûn hewce ne ku li ser formata têlên têketinê biryar bidin. Min wan bi vî rengî hene:

1 Peyama INFO1
2 Peyama ERROR2

Ewan. Nasname pêşî tê, paşê AGAHÎ/ÇEWT, paşê hin peyv bê valahî tê.
Ew ne dijwar e, lê bes e ku meriv prensîba operasyonê fam bike.

Ji ber vê yekê, di beşa parzûnê ya pêveka grok de, divê em ji bo parkirina rêzikên xwe nimûneyek diyar bikin.

Ew ê bi vî rengî xuya bike:

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

Di bingeh de ew îfadeyek birêkûpêk e. Nimûneyên amade têne bikar anîn, wekî INT, LOGLEVEL, WORD. Danasîna wan, û hem jî qalibên din, li vir têne dîtin vir

Naha, dema ku di vê parzûnê re derbas bibe, rêzika me dê bibe haşek ji sê qadan: message_id, message_type, message_text.

Ew ê di beşa derketinê de bêne xuyang kirin.

Rêwîtkirina peyaman li beşa derketinê bi karanîna fermana heke

Di beşa derketinê de, wekî ku tê bîra me, em ê peyaman li du çeman parve bikin. Hin - ku iNFO ne, dê ji konsolê re derkevin, û bi xeletiyan re, em ê pelê derxînin.

Em van peyaman çawa ji hev veqetînin? Rewşa pirsgirêkê jixwe çareseriyek pêşniyar dike - her tişt, me berê qadek message_type ya diyarkirî heye, ku tenê dikare du nirxan bigire: INFO û ERROR. Li ser vê bingehê ye ku em ê bi karanîna îfadeya if hilbijêrin.

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

Di vê beşê de ravekirina xebata bi zevî û operatoran re tê dîtin manual fermî.

Niha, li ser encama rastîn bixwe.

Derketina konsolê, her tişt li vir zelal e - stdout {}

Lê derenca pelê - ji bîr mekin ku em van hemîyan ji konteynerek dimeşînin û ji bo ku pela ku em tê de encamê dinivîsin ji derve ve bigihîje, divê em vê pelrêça di docker-compose.yml de vekin.

Total:

Beşa encam a pelê me bi vî rengî xuya dike:


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

Di docker-compose.yml de em ji bo derketinê cildek din lê zêde dikin:

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

Em wê dest pê dikin, wê biceribînin, û dabeşkirina du çeman dibînin.

Source: www.habr.com

Add a comment