ELK හි ප්‍රායෝගික යෙදුම. ලොග්ස්ටාෂ් පිහිටුවීම

හැඳින්වීම

වෙනත් පද්ධතියක් යෙදවීමේදී, විවිධ ලඝු-සටහන් විශාල ප්‍රමාණයක් සැකසීමේ අවශ්‍යතාවයට අපට මුහුණ දීමට සිදු විය. මෙවලම ලෙස ELK තෝරා ගන්නා ලදී. මෙම ලිපිය මෙම තොගය සැකසීමේදී අපගේ අත්දැකීම් සාකච්ඡා කරනු ඇත.

එහි සියලු හැකියාවන් විස්තර කිරීමට අපි ඉලක්කයක් නොතබමු, නමුත් ප්‍රායෝගික ගැටළු විසඳීම කෙරෙහි විශේෂයෙන් අවධානය යොමු කිරීමට අපට අවශ්‍යය. මෙයට හේතුව තරමක් විශාල ප්‍රලේඛන සහ සූදානම් කළ පින්තූර තිබුණත්, අවම වශයෙන් අපට ඒවා සොයා ගැනීමට හැකි තරම් අන්තරායන් තිබීමයි.

අපි docker-compose හරහා තොගය යෙදෙව්වා. එපමනක් නොව, අප සතුව හොඳින් ලියා ඇති docker-compose.yml එකක් තිබූ අතර, එමඟින් අපට කිසිදු ගැටළුවක් නොමැතිව තොගය ඉහළ නැංවීමට හැකි විය. ජයග්‍රහණය දැනටමත් ආසන්න බව අපට පෙනුණි, දැන් අපි එය අපගේ අවශ්‍යතාවලට සරිලන පරිදි ටිකක් වෙනස් කරන්නෙමු, එපමණයි.

අවාසනාවන්ත ලෙස, අපගේ යෙදුමෙන් ලඝු-සටහන් ලබා ගැනීමට සහ සැකසීමට පද්ධතිය වින්‍යාස කිරීමට ගත් උත්සාහය ක්ෂණිකව සාර්ථක නොවීය. එමනිසා, එක් එක් සංරචක වෙන වෙනම අධ්‍යයනය කිරීම වටී යැයි අපි තීරණය කළෙමු, පසුව ඒවායේ සම්බන්ධතා වෙත ආපසු යාම.

ඉතින්, අපි logstash සමඟ ආරම්භ කළා.

පරිසරය, යෙදවීම, කන්ටේනරයක Logstash ධාවනය කිරීම

යෙදවීම සඳහා අපි docker-compose භාවිතා කරමු; මෙහි විස්තර කර ඇති අත්හදා බැලීම් MacOS සහ Ubuntu 18.0.4 මත සිදු කරන ලදී.

අපගේ මුල් docker-compose.yml හි ලියාපදිංචි කර ඇති logstash රූපය docker.elastic.co/logstash/logstash:6.3.2 වේ.

අපි එය අත්හදා බැලීම් සඳහා භාවිතා කරන්නෙමු.

අපි logstash ධාවනය කිරීමට වෙනම docker-compose.yml එකක් ලිව්වා. ඇත්ත වශයෙන්ම, විධාන රේඛාවෙන් රූපය දියත් කිරීමට හැකි විය, නමුත් අපි විශේෂිත ගැටළුවක් විසඳමින් සිටිමු, එහිදී අපි docker-compose සිට සියල්ල ධාවනය කරමු.

වින්‍යාස ගොනු ගැන කෙටියෙන්

විස්තරයෙන් පහත පරිදි, logstash එක නාලිකාවක් සඳහා ක්‍රියාත්මක කළ හැක, මෙම අවස්ථාවේදී එය *.conf ගොනුව සම්මත කිරීමට අවශ්‍ය වේ, නැතහොත් නාලිකා කිහිපයක් සඳහා, එය pipelines.yml ගොනුව සම්මත කිරීමට අවශ්‍ය වන අතර, එය අනෙක් අතට , එක් එක් නාලිකාව සඳහා ගොනු .conf වෙත සම්බන්ධ කරනු ඇත.
අපි දෙවැනි මාර්ගය ගත්තා. එය අපට වඩාත් විශ්වීය හා පරිමාණය කළ හැකි බවක් පෙනෙන්නට තිබුණි. එබැවින්, අපි pipelines.yml නිර්මාණය කර, අපි එක් එක් නාලිකාව සඳහා .conf ගොනු තබන නල මාර්ග නාමාවලියක් සෑදුවෙමු.

කන්ටේනරය තුළ තවත් වින්‍යාස ගොනුවක් ඇත - logstash.yml. අපි එය ස්පර්ශ නොකරමු, අපි එය භාවිතා කරමු.

එබැවින්, අපගේ නාමාවලි ව්යුහය:

ELK හි ප්‍රායෝගික යෙදුම. ලොග්ස්ටාෂ් පිහිටුවීම

ආදාන දත්ත ලබා ගැනීම සඳහා, දැනට අපි මෙය port 5046 හි tcp යැයි උපකල්පනය කරමු, ප්‍රතිදානය සඳහා අපි 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 හි ප්‍රායෝගික යෙදුම. ලොග්ස්ටාෂ් පිහිටුවීම

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_one_channel | [2019-04-29T11:28:59,790][ERROR][logstash.licensechecker.licensereader] බලපත්‍ර සේවාදායකයෙන් බලපත්‍ර තොරතුරු ලබා ගැනීමට නොහැක {:message=>“Elasticsearch Unreachable: [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-පැක් ස්ථාපනය කරන්න. වෙනත් විශේෂාංග ලබා ගත හැක.
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=>"ප්‍රත්‍යාස්ථ සෙවීමට ළඟා විය නොහැක: [http://elasticsearch:9200/][ManticoreF:il] ඉලාස්ටික් සෙවුම්"}
logstash_one_channel | [2019-04-29T11:29:04,704][INFO ][logstash.licensechecker.licensereader] ඉලාස්ටික් සෙවුම් සම්බන්ධතාවයක් ක්‍රියා කරන්නේ දැයි බැලීමට සෞඛ්‍ය පරීක්‍ෂණය ධාවනය කරමින් {: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=>"ප්‍රත්‍යාස්ථ සෙවීමට ළඟා විය නොහැක: [http://elasticsearch:9200/][ManticoreF:il] ඉලාස්ටික් සෙවුම්"}

ඒවගේම අපේ ලොග් එක හැමදාම රිංගනවා.

නල මාර්ගය සාර්ථකව දියත් කර ඇති බවට වන පණිවිඩය මම කොළ පැහැයෙන් ද, රතු පැහැයෙන් දෝෂ පණිවිඩය සහ කහ පැහැයෙන් සම්බන්ධ වීමට ගත් උත්සාහයක් පිළිබඳ පණිවිඩය ද උද්දීපනය කළෙමි. ප්‍රත්‍යාස්ථ සෙවුම: 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 හි වැඩ දැක ඇත. මෙහි තවත් රසවත් විය හැක්කේ කුමක් ද?

හෘද ස්පන්දනය භාවිතයෙන් පණිවිඩ පරීක්ෂා කරන්න

ස්වයංක්‍රීය පරීක්ෂණ පණිවිඩ උත්පාදනය කිරීමට එවැනි රසවත් අවස්ථාවක් තිබේ.
මෙය සිදු කිරීම සඳහා, ඔබ ආදාන කොටසෙහි හෘද ස්පන්දන ප්ලගිනය සක්රිය කළ යුතුය.

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

අපට බොහෝ විට ලැබීමට අවශ්‍ය නම්, අපි interval පරාමිතිය එක් කළ යුතුය.
සෑම තත්පර 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"
   }
  }

පටන් ගමු:

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 දර්ශණ ක්ෂේත්‍රයේ තිබූ එකම ගොනු සඳහා, එය දැනටමත් ඒවායේ ප්‍රමාණය මතක තබා ගෙන ඇති අතර දැන් ඒවා තුළ නව ඇතුළත් කිරීම් පමණක් ගනු ඇත.

මෙතනින් නවත්තලා ආදාන අංශය අධ්‍යයනය කරමු. තවමත් බොහෝ විකල්ප ඇත, නමුත් දැනට වැඩිදුර අත්හදා බැලීම් සඳහා එය ප්රමාණවත් වේ.

මාර්ගගත කිරීම සහ දත්ත පරිවර්තනය

අපි පහත ගැටළුව විසඳීමට උත්සාහ කරමු, අපට එක් නාලිකාවකින් පණිවිඩ තිබේ යැයි කියමු, ඒවායින් සමහරක් තොරතුරු සහ සමහරක් දෝෂ පණිවිඩ වේ. ඒවා ටැග් අනුව වෙනස් වේ. සමහර ඒවා තොරතුරු, අනෙක් ඒවා ERROR.

අපි ඒවා පිටවීමේදී වෙන් කළ යුතුයි. එම. අපි එක් නාලිකාවක තොරතුරු පණිවිඩ ලියන අතර තවත් නාලිකාවක දෝෂ පණිවිඩ ලියන්නෙමු.

මෙය සිදු කිරීම සඳහා, ආදාන කොටසේ සිට පෙරහන සහ ප්රතිදානය වෙත යන්න.

පෙරහන් කොටස භාවිතා කරමින්, අපි එන පණිවිඩය විග්‍රහ කරන්නෙමු, එයින් හැෂ් (ප්‍රධාන වටිනාකම් යුගල) ලබා ගනිමු, එය අපට දැනටමත් වැඩ කළ හැකිය, i.e. කොන්දේසි අනුව disassemble. ප්‍රතිදාන කොටසේදී, අපි පණිවිඩ තෝරාගෙන ඒ සෑම එකක්ම තමන්ගේම නාලිකාවට යවන්නෙමු.

grok සමඟ පණිවිඩයක් විග්‍රහ කිරීම

පෙළ නූල් විග්‍රහ කර ඒවායින් ක්ෂේත්‍ර කට්ටලයක් ලබා ගැනීම සඳහා, පෙරහන් කොටසේ විශේෂ ප්ලගිනයක් ඇත - grok.

මෙහි සවිස්තරාත්මක විස්තරයක් ලබා දීමේ ඉලක්කය මා තබා නොගෙන (මේ සඳහා මම යොමු කරමි නිල ලියකියවිලි), මම මගේ සරල උදාහරණයක් දෙන්නම්.

මෙය සිදු කිරීම සඳහා, ඔබ ආදාන නූල්වල ආකෘතිය තීරණය කළ යුතුය. මට මේ වගේ ඒවා තියෙනවා:

1 තොරතුරු පණිවිඩය1
2 දෝෂ පණිවිඩය2

එම. හැඳුනුම්කාරකය පළමුව පැමිණේ, පසුව තොරතුරු/දෝෂය, පසුව හිස්තැන් නොමැතිව වචන කිහිපයක්.
එය අපහසු නැත, නමුත් එය ක්රියාත්මක කිරීමේ මූලධර්මය තේරුම් ගැනීමට ප්රමාණවත් වේ.

එබැවින්, grok ප්ලගිනයේ පෙරහන් කොටසේ, අපි අපගේ නූල් විග්‍රහ කිරීම සඳහා රටාවක් නිර්වචනය කළ යුතුය.

එය මේ ආකාරයෙන් පෙනෙනු ඇත:

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

අත්යවශ්යයෙන්ම එය නිතිපතා ප්රකාශනයකි. INT, LOGLEVEL, WORD වැනි සූදානම් කළ රටා භාවිතා වේ. ඔවුන්ගේ විස්තරය මෙන්ම අනෙකුත් රටා ද මෙහි සොයාගත හැකිය මෙහි

දැන්, මෙම පෙරහන හරහා ගමන් කරන විට, අපගේ තන්තුව ක්ෂේත්‍ර තුනක හැෂ් එකක් බවට පත්වේ: message_id, message_type, message_text.

ඒවා නිමැවුම් කොටසේ පෙන්වනු ඇත.

if විධානය භාවිතයෙන් ප්‍රතිදාන කොටස වෙත පණිවිඩ යොමු කිරීම

ප්‍රතිදාන කොටසේදී, අපට මතක ඇති පරිදි, අපි පණිවිඩ ප්‍රවාහ දෙකකට බෙදන්නෙමු. සමහරක් - iNFO වන අතර ඒවා කොන්සෝලයට ප්‍රතිදානය වනු ඇත, සහ දෝෂ සහිතව, අපි ගොනුවකට ප්‍රතිදානය කරන්නෙමු.

අපි මෙම පණිවිඩ වෙන් කරන්නේ කෙසේද? ගැටලුවේ තත්ත්වය දැනටමත් විසඳුමක් යෝජනා කරයි - සියල්ලට පසු, අපට දැනටමත් කැපවූ පණිවිඩ_වර්ග ක්ෂේත්‍රයක් ඇත, එයට අගයන් දෙකක් පමණක් ගත හැකිය: තොරතුරු සහ දෝෂය. මෙම පදනම මත අපි 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

අපි එය දියත් කර, එය උත්සාහ කර, ධාරාවන් දෙකකට බෙදීමක් දකිමු.

මූලාශ්රය: www.habr.com

අදහස් එක් කරන්න