ELK-ի գործնական կիրառում. logstash-ի կարգավորում

Ներածություն

Մեկ այլ համակարգ տեղակայելիս մենք բախվեցինք մեծ թվով տարբեր տեղեկամատյանների մշակման անհրաժեշտության հետ: Որպես գործիք ընտրվել է ELK-ը։ Այս հոդվածը կքննարկի այս բուրգը կարգավորելու մեր փորձը:

Մենք նպատակ չենք դնում նկարագրել նրա բոլոր հնարավորությունները, այլ ցանկանում ենք կենտրոնանալ գործնական խնդիրների լուծման վրա։ Դա պայմանավորված է նրանով, որ բավականաչափ մեծ քանակությամբ փաստաթղթերով և պատրաստի պատկերներով, որոգայթները շատ են, համենայնդեպս, մենք գտանք դրանք:

Մենք տեղադրեցինք ստեկը docker-compose-ի միջոցով: Ավելին, մենք ունեինք լավ գրված docker-compose.yml, որը թույլ էր տալիս մեզ բարձրացնել stack-ը գրեթե առանց խնդիրների: Եվ մեզ թվում էր, թե հաղթանակն արդեն մոտ է, հիմա մենք այն մի փոքր կշրջենք մեր կարիքներին համապատասխան և վերջ։

Ցավոք, մեր հավելվածից տեղեկամատյանները ստանալու և մշակելու համար համակարգը կարգավորելու փորձն անմիջապես չհաջողվեց: Ուստի որոշեցինք, որ արժե ուսումնասիրել յուրաքանչյուր բաղադրիչ առանձին, իսկ հետո վերադառնալ դրանց կապերին։

Այսպիսով, եկեք սկսենք logstash-ից:

Շրջակա միջավայր, տեղակայում, Logstash-ի գործարկում կոնտեյներով

Տեղակայման համար մենք օգտագործում ենք docker-compose-ը, այստեղ նկարագրված փորձերն իրականացվել են MacOS-ի և Ubuntu 18.0.4-ի վրա:

logstash պատկերը, որը մենք ունեինք մեր սկզբնական docker-compose.yml-ում, դա docker.elastic.co/logstash/logstash:6.3.2 է:

Մենք այն կօգտագործենք փորձերի համար։

Logstash-ը գործարկելու համար մենք գրել ենք առանձին docker-compose.yml: Իհարկե, հնարավոր էր պատկերը գործարկել հրամանի տողից, բայց, ի վերջո, մենք լուծեցինք կոնկրետ խնդիր, որտեղ մեզ համար գործարկվում է ամեն ինչ docker-compose-ից։

Հակիրճ կոնֆիգուրացիայի ֆայլերի մասին

Ինչպես հետևում է նկարագրությունից, logstash-ը կարող է գործարկվել ինչպես մեկ ալիքի համար, այս դեպքում այն ​​պետք է փոխանցի *.conf ֆայլը կամ մի քանի ալիքների համար, որի դեպքում պետք է փոխանցի pipelines.yml ֆայլը, որն էլ իր հերթին։ , կվերաբերի .conf ֆայլերին յուրաքանչյուր ալիքի համար:
Մենք բռնեցինք երկրորդ ճանապարհը. Այն մեզ թվում էր ավելի բազմակողմանի և մասշտաբային: Հետևաբար, մենք ստեղծեցինք pipelines.yml և պատրաստեցինք pipelines գրացուցակ, որտեղ մենք կտեղադրենք .conf ֆայլեր յուրաքանչյուր ալիքի համար:

Կոնտեյների ներսում կա մեկ այլ կազմաձևման ֆայլ՝ logstash.yml: Մենք դրան չենք դիպչում, օգտագործում ենք այնպես, ինչպես կա։

Այսպիսով, մեր գրացուցակի կառուցվածքը հետևյալն է.

ELK-ի գործնական կիրառում. logstash-ի կարգավորում

Առայժմ մենք ենթադրում ենք, որ սա tcp է 5046 նավահանգստում մուտքային տվյալներ ստանալու համար, և մենք կօգտագործենք 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. Մենք ստեղծում ենք մեկ ծառայության (ծառայությունների) logstash՝ docker.elastic.co/logstash/logstash:6.3.2 պատկերից և տալիս ենք 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-ի կարգավորում

piping.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=>"առաձգական որոնում:9200/", :error_type=>LogStash::Outputs::ElasticSearch::HttpClient::Pool::HostUnreachableError, :error=>"Elasticsearch անհասանելի է. 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 անհասանելի է. elasticsearch»}

Եվ մեր գերանը անընդհատ սողում է վերև։

Այստեղ ես կանաչ գույնով ընդգծեցի հաղորդագրությունը, որ խողովակաշարը հաջողությամբ սկսվել է, կարմիրով` սխալի հաղորդագրությունը և դեղինով` կապվելու փորձի մասին հաղորդագրությունը: առաձգական որոնում: 9200.
Դա տեղի է ունենում այն ​​պատճառով, որ պատկերում ներառված logstash.conf-ում ստուգվում է elasticsearch-ի առկայությունը: Ի վերջո, logstash-ը ենթադրում է, որ այն աշխատում է որպես Elk stack-ի մաս, և մենք այն առանձնացրել ենք:

Դուք կարող եք աշխատել, բայց դա հարմար չէ:

Լուծումը այս ստուգումն անջատելն է 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 ֆայլին, տեսնենք, թե ինչ կարող ենք ստանալ մեկ ալիքով աշխատելով։

Պետք է ասեմ, որ ալիքի կազմաձևման ֆայլի հետ աշխատելու ընդհանուր սկզբունքը լավ նկարագրված է պաշտոնական ձեռնարկում, այստեղ այստեղ
Եթե ​​ցանկանում եք կարդալ ռուսերեն, ապա մենք օգտագործել ենք այս մեկը հոդված(բայց հարցման շարահյուսությունն այնտեղ հին է, դուք պետք է դա հաշվի առնեք):

Հաջորդաբար անցնենք Input բաժնից։ Մենք արդեն տեսել ենք աշխատանքը tcp-ում։ Էլ ի՞նչը կարող է հետաքրքիր լինել այստեղ:

Թեստային հաղորդագրություններ՝ օգտագործելով սրտի բաբախյունը

Ավտոմատ թեստային հաղորդագրություններ ստեղծելու այսպիսի հետաքրքիր հնարավորություն կա։
Դա անելու համար անհրաժեշտ է ներածման բաժնում ներառել heartbean plugin-ը:

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

Ֆայլից տվյալներ ստանալը

Մենք նաև որոշեցինք դիտարկել ֆայլի ռեժիմը: Եթե ​​այն լավ է աշխատում ֆայլի հետ, ապա հնարավոր է, որ ոչ մի գործակալ չպահանջվի, լավ, գոնե տեղական օգտագործման համար:

Ըստ նկարագրության, գործողության ռեժիմը պետք է նման լինի պոչին -f, այսինքն. կարդում է նոր տողեր կամ, ըստ ցանկության, կարդում է ամբողջ ֆայլը:

Այսպիսով, այն, ինչ մենք ուզում ենք ստանալ.

  1. Մենք ցանկանում ենք ստանալ տողեր, որոնք կցվում են մեկ log ֆայլին:
  2. Մենք ցանկանում ենք ստանալ տվյալներ, որոնք գրված են մի քանի log ֆայլերում՝ միաժամանակ կարողանալով առանձնացնել այն, ինչ ստացվել է որտեղից:
  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 կոնտեյները հեռացվի (docker stop logstash_one_channel && docker rm logstash_one_channel), ոչինչ չի վերցվի: Ֆայլի դիրքը, մինչև այն կարդացվել է, պահվում էր տարայի ներսում: Եթե ​​դուք սկսում եք զրոյից, ապա այն կընդունի միայն նոր տողեր:

Գոյություն ունեցող ֆայլերի ընթերցում

Ենթադրենք, մենք առաջին անգամ ենք գործարկում logstash-ը, բայց մենք արդեն ունենք տեղեկամատյաններ և կցանկանայինք մշակել դրանք:
Եթե ​​մենք գործարկենք logstash-ը վերևում օգտագործված մուտքագրման բաժնում, մենք ոչինչ չենք ստանա: Միայն նոր տողերը կմշակվեն logstash-ի կողմից:

Գոյություն ունեցող ֆայլերից տողեր հանելու համար մուտքագրման բաժնում ավելացրեք լրացուցիչ տող.

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

Ավելին, կա մի նրբերանգ, սա ազդում է միայն նոր ֆայլերի վրա, որոնք logstash-ը դեռ չի տեսել։ Նույն ֆայլերի համար, որոնք արդեն գտնվում էին logstash-ի տեսադաշտում, այն արդեն հիշել է դրանց չափը և այժմ դրանցում կվերցնի միայն նոր գրառումներ:

Սրա վրա կանգ առնենք՝ ուսումնասիրելով մուտքագրման բաժինը։ Կան շատ ավելի շատ տարբերակներ, բայց առայժմ մենք բավականաչափ ունենք հետագա փորձերի համար:

Ուղղորդում և տվյալների փոխակերպում

Փորձենք լուծել հետևյալ խնդիրը, ասենք, ունենք հաղորդագրություններ մեկ ալիքից, որոնցից մի քանիսը տեղեկատվական են, իսկ որոշները սխալի հաղորդագրություններ են։ Նրանք տարբերվում են պիտակով: Ոմանք INFO են, մյուսները՝ ERROR:

Մենք պետք է դրանք առանձնացնենք ելքի մոտ: Նրանք. Մենք գրում ենք տեղեկատվական հաղորդագրություններ մի ալիքում, իսկ սխալի հաղորդագրությունները մեկ այլ ալիքում:

Դա անելու համար մուտքագրման բաժնից անցեք զտիչ և ելք:

Օգտագործելով ֆիլտրի բաժինը՝ մենք կվերլուծենք մուտքային հաղորդագրությունը՝ դրանից ստանալով հեշ (բանալին-արժեք զույգեր), որի հետ արդեն կարող ենք աշխատել, այսինքն. վերլուծել ըստ պայմանների. Իսկ ելքային բաժնում մենք կընտրենք հաղորդագրությունները և կուղարկենք յուրաքանչյուրը իր ալիքին։

Հաղորդագրության վերլուծություն grok-ի հետ

Տեքստային տողերը վերլուծելու և դրանցից դաշտերի հավաքածու ստանալու համար զտիչ բաժնում կա հատուկ փլագին՝ grok:

Առանց ինքս ինձ նպատակ դնելու այստեղ դրա մանրամասն նկարագրությունը տալու (սրա համար ես վերաբերում եմ պաշտոնական փաստաթղթեր), ես կբերեմ իմ պարզ օրինակը.

Դա անելու համար դուք պետք է որոշեք մուտքագրման գծերի ձևաչափը: Ես ունեմ դրանք այսպիսին.

1 ՏԵՂԵԿԱՏՎԱԿԱՆ հաղորդագրություն1
2 ՍԽԱԼ հաղորդագրություն 2

Նրանք. Սկզբում նույնացուցիչ, հետո INFO/ERROR, հետո մի բառ առանց բացատների:
Դժվար չէ, բայց բավական է աշխատանքի սկզբունքը հասկանալու համար։

Այսպիսով, ֆիլտրի բաժնում, grok plugin-ում, մենք պետք է սահմանենք օրինաչափություն մեր տողերի վերլուծության համար:

Այն այսպիսի տեսք կունենա.

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

Հիմնականում դա սովորական արտահայտություն է: Օգտագործվում են պատրաստի նախշեր, ինչպիսիք են INT, LOGLEVEL, WORD: Նրանց նկարագրությունը, ինչպես նաև այլ օրինաչափություններ, կարելի է դիտել այստեղ։ այստեղ

Այժմ, անցնելով այս ֆիլտրով, մեր տողը կվերածվի երեք դաշտերի հեշի՝ message_id, message_type, message_text:

Դրանք կցուցադրվեն ելքային բաժնում:

Հաղորդագրությունների ուղղորդում ելքային բաժնում if հրամանով

Արդյունք բաժնում, ինչպես հիշում ենք, մենք պատրաստվում էինք հաղորդագրությունները բաժանել երկու հոսքի: Որոշները, որոնք iNFO-ն են, մենք կթողարկենք կոնսոլ, իսկ սխալների դեպքում մենք կթողարկենք ֆայլ:

Ինչպե՞ս կարող ենք կիսվել այս հաղորդագրություններով: Խնդրի վիճակն արդեն լուծում է հուշում. ի վերջո, մենք արդեն ունենք հատուկ message_type դաշտ, որը կարող է ընդունել ընդամենը երկու արժեք՝ 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

Добавить комментарий