ELK جي عملي درخواست. logstash قائم ڪرڻ

تعارف

ٻئي سسٽم کي ترتيب ڏيڻ دوران، اسان کي مختلف لاگن جي وڏي تعداد تي عمل ڪرڻ جي ضرورت هئي. ELK اوزار طور چونڊيو ويو. هي آرٽيڪل هن اسٽيڪ قائم ڪرڻ ۾ اسان جي تجربي تي بحث ڪندو.

اسان ان جي سڀني صلاحيتن کي بيان ڪرڻ لاء هڪ مقصد مقرر نه ڪندا آهيون، پر اسان خاص طور تي عملي مسئلن کي حل ڪرڻ تي ڌيان ڏيڻ چاهيندا آهيون. اهو ان حقيقت جي ڪري آهي ته جيتوڻيڪ اتي موجود دستاويزن ۽ تيار ڪيل تصويرن جو هڪ وڏو مقدار آهي، اتي ڪافي نقصان آهن، گهٽ ۾ گهٽ اسان انهن کي ڳولي لڌو.

اسان ڊاکر-ڪمپوز ذريعي اسٽيڪ کي ترتيب ڏنو. ان کان علاوه، اسان وٽ هڪ سٺو لکيل هو docker-compose.yml، جنهن اسان کي اجازت ڏني ته اسٽيڪ کي بغير ڪنهن پريشاني جي. ۽ اهو اسان کي لڳي ٿو ته فتح اڳ ۾ ئي ويجهو هئي، هاڻي اسان ان کي ٿوري ٽائيڪ ڪنداسين ته اسان جي ضرورتن مطابق ۽ بس.

بدقسمتي سان، اسان جي ايپليڪيشن مان لاگ وصول ڪرڻ ۽ پروسيس ڪرڻ لاء سسٽم کي ترتيب ڏيڻ جي ڪوشش فوري طور تي ڪامياب نه ٿي. تنهن ڪري، اسان فيصلو ڪيو ته اهو هر جزو کي الڳ الڳ مطالعو ڪرڻ جي قابل آهي، ۽ پوء انهن جي ڪنيڪشن ڏانهن موٽڻ.

تنهن ڪري، اسان logstash سان شروع ڪيو.

ماحول، مقرري، هڪ ڪنٽينر ۾ Logstash هلائڻ

مقرري لاءِ اسان استعمال ڪريون ٿا ڊڪر ڪمپوز؛ هتي بيان ڪيل تجربا MacOS ۽ Ubuntu 18.0.4 تي ڪيا ويا.

logstash تصوير جيڪا اسان جي اصل docker-compose.yml ۾ رجسٽر ڪئي وئي آهي docker.elastic.co/logstash/logstash:6.3.2

اسان ان کي تجربن لاء استعمال ڪنداسين.

اسان logstash هلائڻ لاءِ هڪ الڳ docker-compose.yml لکيو. يقينن، اهو ممڪن هو ته تصوير کي ڪمانڊ لائين مان لانچ ڪرڻ، پر اسان هڪ خاص مسئلو حل ڪري رهيا هئاسين، جتي اسان هر شي کي ڊاکر-compose کان هلائيندا آهيون.

مختصر طور تي ترتيب ڏيڻ واري فائلن بابت

جيئن هيٺ ڏنل بيان مان، لاگ اسٽاش يا ته هڪ چينل لاءِ هلائي سگهجي ٿو، جنهن صورت ۾ ان کي *.conf فائل پاس ڪرڻ جي ضرورت آهي، يا ڪيترن ئي چينلن لاءِ، ان صورت ۾ ان کي پائپ لائنز.yml فائل پاس ڪرڻ جي ضرورت آهي، جنهن جي نتيجي ۾ ، هر چينل لاءِ فائلن .conf سان ڳنڍيندو.
اسان ٻيو رستو اختيار ڪيو. اهو اسان کي وڌيڪ عالمگير ۽ اسپيبلبل لڳي ٿو. تنهن ڪري، اسان pipelines.yml ٺاهي، ۽ هڪ پائيپ لائين ڊاريڪٽري ٺاهي جنهن ۾ اسان هر چينل لاء .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. اسان docker.elastic.co/logstash/logstash:6.3.2 تصوير مان هڪ logstash خدمت(s) ٺاهي ۽ ان کي نالو ڏيو 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] elastic search "، ...

logstash_one_channel | [INFO ][logstash.pipeline] پائپ لائن ڪاميابي سان شروع ٿي وئي "}

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 تي نه. مھرباني ڪري انسٽال ڪريو ايڪس پيڪ تي Elasticsearch مانيٽرنگ فيچر استعمال ڪرڻ لاءِ. ٻيون خاصيتون دستياب ٿي سگهن ٿيون.
logstash_one_channel | [2019-04-29T11:29:00,526][INFO ][logstash.agent ] Logstash API endpoint {: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][WARN ][logstash.outputs.elasticsearch] ڪوشش ڪئي وئي ڪنيڪشن کي جيئرو ڪرڻ جي مئل ES مثال، پر غلطي ملي. {:url=>“ڳولا ڪرڻ:9200/", :error_type=>LogStash::Outputs::ElasticSearch::HttpClient::Pool::HostUnreachableError, :error=>"Elasticsearch Unreachable: [http://elasticsearch:9200/][Manticore::ResolutionFail] 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][WARN ][logstash.licensechecker.licensereader] ڪوشش ڪئي وئي بحال ڪنيڪشن کي مئل ES مثال سان، پر هڪ غلطي ملي. {:url=>“ڳولا ڪرڻ:9200/", :error_type=>LogStash::Outputs::ElasticSearch::HttpClient::Pool::HostUnreachableError, :error=>"Elasticsearch Unreachable: [http://elasticsearch:9200/][Manticore::ResolutionFail] elasticsearch"}

۽ اسان جو لاگ هر وقت چري رهيو آهي.

هتي مون سائي ۾ نمايان ڪئي آهي پيغام ته پائپ لائن ڪاميابي سان شروع ٿي وئي آهي، ڳاڙهي ۾ غلطي پيغام ۽ پيلي ۾ پيغام سان رابطو ڪرڻ جي ڪوشش بابت. ڳولا ڪرڻ: 9200.
اهو ٿي سگهي ٿو ڇاڪاڻ ته logstash.conf، تصوير ۾ شامل آهي، هڪ چيڪ تي مشتمل آهي elasticsearch جي دستيابي لاءِ. آخرڪار، لاگسٽش فرض ڪري ٿو ته اهو ايلڪ اسٽيڪ جي حصي طور ڪم ڪري ٿو، پر اسان ان کي الڳ ڪيو.

اهو ڪم ڪرڻ ممڪن آهي، پر اهو آسان ناهي.

حل اهو آهي ته هن چيڪ کي 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 پاڻ کي ترتيب ڏيڻ لاءِ. اچو ته ھاڻي پائپ لائنز.yml فائل کي ھٿ نه ھڻي، اچو ته ڏسون ته ھڪڙي چينل سان ڪم ڪرڻ سان اسان ڇا حاصل ڪري سگھون ٿا.

مون کي ضرور چوڻ گهرجي ته چينل جي ترتيب واري فائل سان ڪم ڪرڻ جو عام اصول هتي سرڪاري دستياب ۾ بيان ڪيو ويو آهي هتي
جيڪڏهن توهان روسي ۾ پڙهڻ چاهيو ٿا، اسان هن کي استعمال ڪيو مضمون(پر سوال جو نحو پراڻو آهي، اسان کي ان کي حساب ۾ رکڻو پوندو).

اچو ته ان پٽ سيڪشن مان ترتيب وار هلون. اسان اڳ ۾ ئي TCP تي ڪم ڏٺو آهي. ٻيو ڇا هتي دلچسپ ٿي سگهي ٿو؟

دل جي ڌڙڪن کي استعمال ڪندي ٽيسٽ پيغام

خودڪار ٽيسٽ پيغام پيدا ڪرڻ لاء هڪ دلچسپ موقعو آهي.
هن کي ڪرڻ لاءِ، توهان کي ان پٽ سيڪشن ۾ دل واري پلگ ان کي فعال ڪرڻ جي ضرورت آهي.

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 وانگر هجڻ گهرجي، i.e. پڙهي ٿو نيون لائينون يا، هڪ اختيار جي طور تي، پوري فائل کي پڙهي ٿو.

پوء جيڪو اسان حاصل ڪرڻ چاهيون ٿا:

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

Halo shuru kayu:

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 ڪنٽينر ڊهي ويو آهي (ڊاڪر اسٽاپ logstash_one_channel && docker rm logstash_one_channel)، پوء ڪجھ به نه ورتو ويندو. فائل جي پوزيشن جنهن تائين اهو پڙهيو ويو هو ڪنٽينر اندر ذخيرو ٿيل هو. جيڪڏهن توهان ان کي شروع کان هلائيندا آهيو، اهو صرف نئين لائين قبول ڪندو.

موجوده فائلون پڙهڻ

اچو ته چئو ته اسان پهريون ڀيرو logstash شروع ڪري رهيا آهيون، پر اسان وٽ اڳ ۾ ئي لاگز آهن ۽ اسان انهن کي پروسيس ڪرڻ چاهيندا آهيون.
جيڪڏهن اسان ان پٽ سيڪشن سان logstash هلون ٿا جيڪو اسان مٿي استعمال ڪيو آهي، اسان کي ڪجهه به نه ملندو. logstash ذريعي صرف نيون لائينون پروسيس ڪيون وينديون.

موجوده فائلن مان لڪيرون ڪڍڻ لاءِ، توھان کي ان پٽ سيڪشن ۾ اضافي لائن شامل ڪرڻ گھرجي:

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

ان کان علاوه، اتي هڪ nuance آهي: اهو صرف نئين فائلن تي اثر انداز ٿئي ٿو جيڪي logstash اڃا تائين نه ڏٺو آهي. ساڳين فائلن لاءِ جيڪي اڳ ۾ ئي logstash ڏسڻ جي ميدان ۾ هيون، ان کي اڳ ۾ ئي انهن جي سائيز ياد آهي ۽ هاڻي صرف انهن ۾ نيون داخلائون وٺنديون.

اچو ته هتي رکون ۽ ان پٽ سيڪشن جو مطالعو ڪريو. اڃا به ڪيترائي آپشن آھن، پر اھو ڪافي آھي اسان لاءِ ھاڻي وڌيڪ تجربن لاءِ.

روٽنگ ۽ ڊيٽا جي تبديلي

اچو ته هيٺ ڏنل مسئلو حل ڪرڻ جي ڪوشش ڪريون، اچو ته چئون ته اسان وٽ هڪ چينل جا پيغام آهن، انهن مان ڪجهه معلوماتي آهن، ۽ ڪجهه غلط پيغام آهن. اهي ٽيگ جي لحاظ کان مختلف آهن. ڪجھ INFO آھن، ٻيا ERROR آھن.

اسان کي نڪرڻ تي انھن کي الڳ ڪرڻ جي ضرورت آهي. اهي. اسان هڪ چينل ۾ معلوماتي پيغام لکون ٿا، ۽ ٻئي ۾ غلطي پيغام.

هن کي ڪرڻ لاء، ان پٽ سيڪشن مان فلٽر ۽ آئوٽ ڏانھن وڃو.

فلٽر سيڪشن کي استعمال ڪندي، اسان ايندڙ پيغام کي پارس ڪنداسين، ان مان هڪ هيش (ڪي-ويل جوڙو) حاصل ڪندي، جنهن سان اسان اڳ ۾ ئي ڪم ڪري سگهون ٿا، يعني. حالتن مطابق جدا ڪرڻ. ۽ آئوٽ پٽ سيڪشن ۾، اسان پيغام چونڊينداسين ۽ هر هڪ کي پنهنجي چينل ڏانهن موڪلينداسين.

گروڪ سان هڪ پيغام پارس ڪرڻ

متن جي تارن کي پارس ڪرڻ ۽ انهن مان فيلڊ جو هڪ سيٽ حاصل ڪرڻ لاءِ، فلٽر سيڪشن ۾ هڪ خاص پلگ ان آهي - grok.

ان جي تفصيلي وضاحت ڏيڻ جو مقصد مقرر ڪرڻ کان سواءِ هتي (ان لاءِ مان حوالو ڏيان ٿو سرڪاري دستاويز)، مان پنهنجو سادو مثال ڏيندس.

هن کي ڪرڻ لاء، توهان کي ان پٽ اسٽرنگ جي فارميٽ تي فيصلو ڪرڻو پوندو. مون وٽ اهي هن طرح آهن:

1 معلوماتي پيغام 1
2 غلطي جو پيغام 2

اهي. سڃاڻپ ڪندڙ پهريون اچي ٿو، پوءِ INFO/ERROR، پوءِ ڪجهه لفظ بغير جاءِ جي.
اهو ڏکيو نه آهي، پر آپريشن جي اصول کي سمجهڻ لاء ڪافي آهي.

تنهن ڪري، گروڪ پلگ ان جي فلٽر سيڪشن ۾، اسان کي اسان جي تارن کي پارس ڪرڻ لاءِ هڪ نمونو بيان ڪرڻ گهرجي.

اهو هن طرح نظر ايندو:

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 ۾ کولڻو پوندو.

Total:

اسان جي فائل جو آئوٽ سيڪشن هن طرح نظر اچي ٿو:


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

اسان ان کي لانچ ڪيو، ان کي آزمايو، ۽ ڏسو ته هڪ ڊويزن ٻن اسٽريمز ۾.

جو ذريعو: www.habr.com

تبصرو شامل ڪريو