ELK இன் நடைமுறை பயன்பாடு. லாக்ஸ்டாஷை அமைத்தல்

அறிமுகம்

மற்றொரு அமைப்பைப் பயன்படுத்தும்போது, ​​அதிக எண்ணிக்கையிலான பல்வேறு பதிவுகளை செயலாக்க வேண்டிய அவசியத்தை நாங்கள் எதிர்கொண்டோம். ELK கருவியாகத் தேர்ந்தெடுக்கப்பட்டது. இந்த அடுக்கை அமைப்பதில் எங்கள் அனுபவத்தை இந்தக் கட்டுரை விவாதிக்கும்.

அதன் அனைத்து திறன்களையும் விவரிக்க நாங்கள் இலக்கை அமைக்கவில்லை, ஆனால் நடைமுறை சிக்கல்களைத் தீர்ப்பதில் குறிப்பாக கவனம் செலுத்த விரும்புகிறோம். மிகப் பெரிய அளவிலான ஆவணங்கள் மற்றும் ஆயத்த படங்கள் இருந்தாலும், நிறைய ஆபத்துகள் உள்ளன, குறைந்தபட்சம் நாங்கள் அவற்றைக் கண்டுபிடித்தோம் என்பதே இதற்குக் காரணம்.

நாங்கள் டோக்கர்-கம்போஸ் மூலம் அடுக்கை பயன்படுத்தினோம். மேலும், எங்களிடம் நன்றாக எழுதப்பட்ட docker-compose.yml இருந்தது, இது எந்த பிரச்சனையும் இல்லாமல் அடுக்கை உயர்த்த அனுமதித்தது. வெற்றி ஏற்கனவே நெருங்கிவிட்டது என்று எங்களுக்குத் தோன்றியது, இப்போது அதை எங்கள் தேவைகளுக்கு ஏற்ப சிறிது மாற்றுவோம், அவ்வளவுதான்.

துரதிர்ஷ்டவசமாக, எங்கள் பயன்பாட்டிலிருந்து பதிவுகளைப் பெறுவதற்கும் செயலாக்குவதற்கும் கணினியை உள்ளமைக்கும் முயற்சி உடனடியாக வெற்றிபெறவில்லை. எனவே, ஒவ்வொரு கூறுகளையும் தனித்தனியாகப் படிப்பது மதிப்புக்குரியது என்று நாங்கள் முடிவு செய்தோம், பின்னர் அவற்றின் இணைப்புகளுக்குத் திரும்புவோம்.

எனவே, நாங்கள் logstash உடன் தொடங்கினோம்.

சூழல், வரிசைப்படுத்தல், லாக்ஸ்டாஷை ஒரு கொள்கலனில் இயக்குதல்

வரிசைப்படுத்துவதற்கு நாங்கள் docker-compose ஐப் பயன்படுத்துகிறோம்; இங்கு விவரிக்கப்பட்டுள்ள சோதனைகள் MacOS மற்றும் Ubuntu 18.0.4 இல் மேற்கொள்ளப்பட்டன.

எங்கள் அசல் docker-compose.yml இல் பதிவுசெய்யப்பட்ட logstash படம் docker.elastic.co/logstash/logstash:6.3.2

அதை பரிசோதனைகளுக்கு பயன்படுத்துவோம்.

logstash ஐ இயக்க தனி docker-compose.yml ஐ எழுதினோம். நிச்சயமாக, கட்டளை வரியிலிருந்து படத்தைத் தொடங்குவது சாத்தியம், ஆனால் நாங்கள் ஒரு குறிப்பிட்ட சிக்கலைத் தீர்க்கிறோம், அங்கு டாக்கர்-கம்போஸ் முதல் அனைத்தையும் இயக்குகிறோம்.

கட்டமைப்பு கோப்புகள் பற்றி சுருக்கமாக

விளக்கத்திலிருந்து பின்வருமாறு, logstash ஐ ஒரு சேனலுக்கு இயக்கலாம், இதில் *.conf கோப்பை அனுப்ப வேண்டும் அல்லது பல சேனல்களுக்கு, அது pipelines.yml கோப்பை அனுப்ப வேண்டும். , ஒவ்வொரு சேனலுக்கும் .conf கோப்புகளுடன் இணைக்கப்படும்.
நாங்கள் இரண்டாவது பாதையை எடுத்தோம். இது எங்களுக்கு மிகவும் உலகளாவியதாகவும் அளவிடக்கூடியதாகவும் தோன்றியது. எனவே, நாங்கள் pipelines.yml ஐ உருவாக்கி, பைப்லைன் கோப்பகத்தை உருவாக்கினோம், அதில் ஒவ்வொரு சேனலுக்கும் .conf கோப்புகளை வைப்போம்.

கொள்கலனுக்குள் மற்றொரு உள்ளமைவு கோப்பு உள்ளது - logstash.yml. நாங்கள் அதைத் தொடுவதில்லை, அதை அப்படியே பயன்படுத்துகிறோம்.

எனவே, எங்கள் அடைவு அமைப்பு:

ELK இன் நடைமுறை பயன்பாடு. லாக்ஸ்டாஷை அமைத்தல்

உள்ளீட்டுத் தரவைப் பெற, இப்போது இது போர்ட் 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 சேவை(களை) உருவாக்கி அதற்கு logstash_one_channel என்று பெயரிடுகிறோம்.
  3. கொள்கலனுக்குள் போர்ட் 5046ஐ அதே உள் துறைமுகத்திற்கு அனுப்புகிறோம்.
  4. கன்டெய்னருக்குள் இருக்கும் /usr/share/logstash/config/pipelines.yml என்ற கோப்பில் எங்கள் குழாய் உள்ளமைவு கோப்பை ./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] ::ரெசல்யூஷன் தோல்வி] மீள் தேடல்", ...

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 இல் இல்லை. கண்காணிப்பு அம்சத்தைப் பயன்படுத்த, எலாஸ்டிக் தேடலில் எக்ஸ்-பேக்கை நிறுவவும். மற்ற அம்சங்கள் கிடைக்கலாம்.
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] எலாஸ்டிக் தேடல் இணைப்பு செயல்படுகிறதா என்பதைப் பார்க்க சுகாதாரச் சோதனையை இயக்குகிறது {:healthcheck_url=>http://elasticsearch:9200/, :path=> "/"}
logstash_one_channel | [2019-04-29T11:29:04,487][எச்சரிக்கை [logstash.outputs.elasticsearch] இறந்த ES நிகழ்விற்கான இணைப்பை மீண்டும் உயிர்ப்பிக்க முயற்சித்தது, ஆனால் பிழை ஏற்பட்டது. {:url=>"elasticsearch:9200/", :error_type=>LogStash::Outputs::ElasticSearch::HttpClient::Pool::HostUnreachableError, :error=>"எலாஸ்டிக் தேடல் அணுக முடியாதது: [http://elasticsearch:9200/][SolutionFor::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][எச்சரிக்கை [logstash.licensechecker.licensereader] இறந்த ES நிகழ்விற்கான இணைப்பை மீண்டும் உருவாக்க முயற்சித்தேன், ஆனால் பிழை ஏற்பட்டது. {:url=>"elasticsearch:9200/", :error_type=>LogStash::Outputs::ElasticSearch::HttpClient::Pool::HostUnreachableError, :error=>"எலாஸ்டிக் தேடல் அணுக முடியாதது: [http://elasticsearch:9200/][SolutionFor::il] மீள் தேடல்"}

எங்கள் பதிவு எல்லா நேரத்திலும் ஊர்ந்து கொண்டிருக்கிறது.

பைப்லைன் வெற்றிகரமாகத் தொடங்கப்பட்ட செய்தியை பச்சை நிறத்திலும், சிவப்பு நிறத்தில் பிழைச் செய்தியையும், மஞ்சள் நிறத்தில் தொடர்புகொள்ளும் முயற்சி பற்றிய செய்தியையும் இங்கே ஹைலைட் செய்துள்ளேன். elasticsearch: 9200.
படத்தில் சேர்க்கப்பட்டுள்ள logstash.conf, elasticsearch கிடைப்பதற்கான சரிபார்ப்பைக் கொண்டிருப்பதால் இது நிகழ்கிறது. எல்லாவற்றிற்கும் மேலாக, இது எல்க் ஸ்டேக்கின் ஒரு பகுதியாக வேலை செய்கிறது என்று logstash கருதுகிறது, ஆனால் நாங்கள் அதை பிரித்தோம்.

வேலை செய்வது சாத்தியம், ஆனால் அது வசதியாக இல்லை.

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 கோப்பை தொட வேண்டாம், ஒரு சேனலில் வேலை செய்தால் என்ன கிடைக்கும் என்று பார்ப்போம்.

சேனல் உள்ளமைவு கோப்புடன் பணிபுரியும் பொதுவான கொள்கை இங்கே அதிகாரப்பூர்வ கையேட்டில் நன்கு விவரிக்கப்பட்டுள்ளது என்று நான் சொல்ல வேண்டும் இங்கே
நீங்கள் ரஷ்ய மொழியில் படிக்க விரும்பினால், நாங்கள் இதைப் பயன்படுத்தினோம் கட்டுரை(ஆனால் அங்குள்ள வினவல் தொடரியல் பழையது, இதை நாம் கணக்கில் எடுத்துக்கொள்ள வேண்டும்).

உள்ளீடு பிரிவில் இருந்து வரிசையாக செல்லலாம். 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 ஐப் போலவே இருக்க வேண்டும், அதாவது. புதிய வரிகளைப் படிக்கிறது அல்லது ஒரு விருப்பமாக, முழு கோப்பையும் படிக்கிறது.

எனவே நாம் எதைப் பெற விரும்புகிறோம்:

  1. ஒரு பதிவுக் கோப்பில் இணைக்கப்பட்ட வரிகளைப் பெற விரும்புகிறோம்.
  2. பல பதிவு கோப்புகளில் எழுதப்பட்ட தரவை நாங்கள் பெற விரும்புகிறோம், அதே நேரத்தில் பெறப்பட்டதை எங்கிருந்து பிரிக்க முடியும்.
  3. logstash மறுதொடக்கம் செய்யப்படும்போது, ​​இந்தத் தரவை அது மீண்டும் பெறாது என்பதை உறுதிசெய்ய விரும்புகிறோம்.
  4. லாக்ஸ்டாஷ் அணைக்கப்பட்டு, கோப்புகளில் தரவு தொடர்ந்து எழுதப்பட்டால், அதை இயக்கும்போது, ​​இந்தத் தரவைப் பெறுவோம்.

சோதனையை நடத்த, 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 இதுவரை பார்க்காத புதிய கோப்புகளை மட்டுமே பாதிக்கிறது. லாக்ஸ்டாஷின் பார்வைத் துறையில் ஏற்கனவே இருந்த அதே கோப்புகளுக்கு, அது ஏற்கனவே அவற்றின் அளவை நினைவில் வைத்திருக்கிறது, இப்போது அவற்றில் புதிய உள்ளீடுகளை மட்டுமே எடுக்கும்.

இத்துடன் நிறுத்தி உள்ளீடு பகுதியைப் படிப்போம். இன்னும் பல விருப்பங்கள் உள்ளன, ஆனால் இப்போதைக்கு மேலும் சோதனைகளுக்கு இது போதுமானது.

ரூட்டிங் மற்றும் தரவு மாற்றம்

பின்வரும் சிக்கலைத் தீர்க்க முயற்சிப்போம், எங்களிடம் ஒரு சேனலில் இருந்து செய்திகள் உள்ளன, அவற்றில் சில தகவல் மற்றும் சில பிழை செய்திகள் என்று வைத்துக்கொள்வோம். அவை குறிச்சொல் மூலம் வேறுபடுகின்றன. சில தகவல், மற்றவை பிழை.

வெளியேறும் இடத்தில் அவற்றைப் பிரிக்க வேண்டும். அந்த. ஒரு சேனலில் தகவல் செய்திகளையும், மற்றொரு சேனலில் பிழை செய்திகளையும் எழுதுகிறோம்.

இதைச் செய்ய, உள்ளீடு பிரிவில் இருந்து வடிகட்டி மற்றும் வெளியீட்டிற்கு நகர்த்தவும்.

வடிகட்டி பிரிவைப் பயன்படுத்தி, உள்வரும் செய்தியை அலசுவோம், அதிலிருந்து ஒரு ஹாஷ் (முக்கிய மதிப்பு ஜோடிகள்) பெறுவோம், அதை நாம் ஏற்கனவே வேலை செய்யலாம், அதாவது. நிபந்தனைகளுக்கு ஏற்ப பிரிக்கவும். வெளியீடு பிரிவில், நாங்கள் செய்திகளைத் தேர்ந்தெடுத்து ஒவ்வொன்றையும் அதன் சொந்த சேனலுக்கு அனுப்புவோம்.

க்ரோக் உடன் ஒரு செய்தியை பாகுபடுத்துதல்

உரை சரங்களை அலசவும், அவற்றிலிருந்து புலங்களின் தொகுப்பைப் பெறவும், வடிகட்டி பிரிவில் ஒரு சிறப்பு செருகுநிரல் உள்ளது - grok.

அதைப்பற்றிய விரிவான விளக்கத்தை இங்கே தருவதை இலக்காகக் கொள்ளாமல் (இதற்காக நான் குறிப்பிடுகிறேன் அதிகாரப்பூர்வ ஆவணங்கள்), எனது எளிய உதாரணத்தை தருகிறேன்.

இதைச் செய்ய, உள்ளீட்டு சரங்களின் வடிவமைப்பை நீங்கள் தீர்மானிக்க வேண்டும். என்னிடம் இதுபோன்றவை உள்ளன:

1 தகவல் செய்தி1
2 பிழை செய்தி2

அந்த. அடையாளங்காட்டி முதலில் வரும், பின்னர் தகவல்/பிழை, பின்னர் இடைவெளிகள் இல்லாமல் சில வார்த்தைகள்.
இது கடினம் அல்ல, ஆனால் செயல்பாட்டின் கொள்கையைப் புரிந்து கொள்ள போதுமானது.

எனவே, க்ரோக் செருகுநிரலின் வடிகட்டி பிரிவில், நமது சரங்களை பாகுபடுத்துவதற்கான ஒரு வடிவத்தை நாம் வரையறுக்க வேண்டும்.

இது இப்படி இருக்கும்:

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

அடிப்படையில் இது ஒரு வழக்கமான வெளிப்பாடு. INT, LOGLEVEL, WORD போன்ற ஆயத்த வடிவங்கள் பயன்படுத்தப்படுகின்றன. அவற்றின் விளக்கம் மற்றும் பிற வடிவங்களை இங்கே காணலாம் இங்கே

இப்போது, ​​இந்த வடிப்பான் வழியாகச் செல்லும்போது, ​​​​எங்கள் சரம் மூன்று புலங்களின் ஹாஷாக மாறும்: செய்தி_ஐடி, செய்தி_வகை, செய்தி_உரை.

அவை வெளியீடு பிரிவில் காட்டப்படும்.

if கட்டளையைப் பயன்படுத்தி செய்திகளை வெளியீட்டுப் பகுதிக்கு அனுப்புதல்

வெளியீடு பிரிவில், நாங்கள் நினைவில் வைத்திருப்பது போல், செய்திகளை இரண்டு ஸ்ட்ரீம்களாகப் பிரிக்கப் போகிறோம். சில - iNFO, அவை கன்சோலுக்கு வெளியீடாக இருக்கும், மேலும் பிழைகள் இருந்தால், ஒரு கோப்பில் வெளியிடுவோம்.

இந்த செய்திகளை எவ்வாறு பிரிப்பது? சிக்கலின் நிலை ஏற்கனவே ஒரு தீர்வை பரிந்துரைக்கிறது - எல்லாவற்றிற்கும் மேலாக, எங்களிடம் ஏற்கனவே ஒரு பிரத்யேக செய்தி_வகை புலம் உள்ளது, இது இரண்டு மதிப்புகளை மட்டுமே எடுக்க முடியும்: 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

நாங்கள் அதைத் தொடங்குகிறோம், முயற்சி செய்கிறோம், இரண்டு ஸ்ட்ரீம்களாகப் பிரிப்பதைப் பார்க்கிறோம்.

ஆதாரம்: www.habr.com

கருத்தைச் சேர்