Praxis applicatio ELK. Occasus sursum logstash

introduction

Dum aliam rationem disponimus, obvium sumus cum necessitate ad magnum numerum diversorum lignorum procedendum. ELK instrumentum electum est. Hoc articulum de nostra experientia in hoc acervo constituendo disseret.

Propositum non definimus omnes eius facultates describere, sed specialiter intendi volumus ad solvendas difficultates practicas. Hoc accidit quod, licet magna copia documentorum et imaginum factarum sit, satis multa sunt scandala, at certe ea invenimus.

Nos ACERVUS per spatharium componimus. Praeterea bene scriptum habuimus docker-compose.yml, quod ACERVUM sine quaestionibus paene tollere nobis licuit. Et victoria illa iam prope nobis visa est, nunc eam paulum in nostris necessitatibus accommodabimus.

Infeliciter, conatus ad configurandum systema recipiendi et omnia ex applicatione nostra processualia statim non obtinuit. Ideo decrevimus ut singulae partes singulae cognoscerent, ac deinde ad suas necessitudines redirent.

Sic logstash coepimus.

Environment, instruere, Logstash cursus in vase

Ad instruere utimur composi- torium, experimenta quae hic exercentur in MacOS et Ubuntu 18.0.4.

Logstash imago quae in originali nostro docker-compose relatus est.yml est docker.elastic.co/logstash/logstash:6.3.2

ad experimentis ea nos adhibebimus.

Singula docker-compose.yml scripsimus ut logstash curramus. Utique, ex linea mandatorum imaginem mittere potuimus, sed certas quaestiones solvebamus, ubi omnia ex composito curriculo discurrimus.

Breviter de configuratione files

Ut ex descriptione sequitur, logstash deduci potest vel ad unum alveum, quo in casu necesse est *.conf limam transire, vel aliquot canales, quo casu necesse est fasciculum pipelines transire.yml, qui vicissim. , ad singulas canales .conf ligaturas .
Secundam viam cepimus. Videbatur nobis universalius et scalabile. Ergo pipelines.yml creavimus, et directorium fistularum in quibus .conf lima pro singulis canalibus ponemus.

In receptaculo alius fasciculus configurationis est - logstash.yml. Non tangimus, utimur.

Nostra igitur structura presul;

Praxis applicatio ELK. Occasus sursum logstash

Ad datam inputationem recipiendam, nunc enim ponimus hoc esse xcum in portu 5046, et pro output utemur stdout.

Hic simplex configuratio primae immittendi est. Quia primum opus est mittere.

Ita nos hoc docker-compose.yml . habemus

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

Quid hic videmus?

  1. Reticuli et volumina ex originali docker-compose.yml desumpta sunt (unum in quo totus acervus emittitur) et puto eos non magnopere hic imaginem altiorem afficere.
  2. Unum logstash servitii(s) ex docker.elastic.co/logstash/logstash:6.3.2 imaginem et nomen eius logstash_one_channel creamus.
  3. Portum deinceps 5046 intra continens, ad eundem portum internum.
  4. Describimus fistulam nostram configurationis fasciculi ./config/pipelines.yml ad tabellam /usr/share/logstash/config/pipelines.yml intra continentem, ubi logstash colliget et facit ut solum, modo in casu.
  5. Directorium ./config/pipelines depingimus, ubi tabellas cum uncinis canalis habemus, in directorium /usr/share/logstash/config/pipelines, et etiam illud solum legere possumus.

Praxis applicatio ELK. Occasus sursum logstash

Pipelines.yml file

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

Canalis unus cum HABR identifier et via ad eius limam configurationem hic describuntur.

Tum tabella "./config/pipelines/habr_pipeline.conf"

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

Nunc in eius descriptionem non eat, eam currere conemur:

docker-compose up

Quid videmus?

Continens incepit. Reprehendo eius operatio possumus:

echo '13123123123123123123123213123213' | nc localhost 5046

Et videmus responsionem in continente console:

Praxis applicatio ELK. Occasus sursum logstash

Sed simul etiam videmus;

logstash_one_channel | [2019-04-29T11:28:59,790][ERROR][logstash.licensechecker.licensereader] Licentiam recuperare nequitur notitia de licentia servo {:nuntius=>" Elasticsearch Unreachable: [http://elasticsearch:9200/][Manticore ::ResolutionFailure] elasticsearch", ...

logstash_one_channel | [2019-04-29T11:28:59,894][INFO ][ logstash.pipeline ] Pipeline incepit feliciter {:pipeline_id=>".monitoring-logstash", :thread=>"# "}

logstash_one_channel | [2019-04-29T11:28:59,988][INFO ][ logstash.agent ] Pipelines cursus {: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 in Logstash installatur, sed non in Elasticsearch. Quaeso install X-Pack in Elasticsearch uti pluma vigilantia. Alia lineamenta praesto sint.
logstash_one_channel | [2019-04-29T11:29:00,526][INFO ][ logstash.agent ] Feliciter incepit Logstash API endpoint {:port=>9600}
logstash_one_channel | [2019-04-29T11:29:04,478][INFO ][ logstash.outputs.elasticsearch] Cursor sanitatis perspicitur, an nexus elasticae inquisitionis laborat {:healthcheck_url=> http://elasticsearch:9200/, :path=> "/"}
logstash_one_channel | [2019-04-29T11:29:04,487][WARN ][logstash.outputs.elasticsearch] Conatus resurrecturus nexum cum mortuis ES exempli causa, sed errorem obtinuit. {:url=>"elasticsearch:9200/", :error_type=>LogStash::Outputs::ElasticSearch::HttpClient::Pool::HostUnreachableError, :error=>"Elasticsearch Impossibile: [http://elasticsearch:9200/][Manticore::ResolutionFailure] elasticsearch"}
logstash_one_channel | [2019-04-29T11:29:04,704][INFO ][logstash.licensechecker.licensereader] Cursor sanitatis perspiciat an nexus elastica connexio laborat {:healthcheck_url=> http://elasticsearch:9200/, :path=> "/"}
logstash_one_channel | [2019-04-29T11:29:04,710][MONEO ][logstash.licensechecker.licensereader] Conatus ES exempli gratia resurrecturus nexum mortuis, sed errorem obtinuit. {:url=>"elasticsearch:9200/", :error_type=>LogStash::Outputs::ElasticSearch::HttpClient::Pool::HostUnreachableError, :error=>"Elasticsearch Impossibile: [http://elasticsearch:9200/][Manticore::ResolutionFailure] elasticsearch"}

Subrepens tigillum nostrum omni tempore.

Hic elucidavi in ​​viridi nuntium quod pipelineo feliciter incidit, in rubro errore nuntium ac nuntium luteum de conatu contactum. elasticsearch: 9200.
Hoc accidit quod logstash.conf, in imagine comprehensum, ceptum promptitudinis elasticae inquisitionis continet. Post omnia, logstash assumit ut partem Elk acervus operatur, sed nos separavimus.

Potest operari, sed non commodum.

Solutio inactivandi hanc reprehendo per XPACK_MONITORING_ENABLED ambitus variabilis.

Mutationem faciamus ad docker-compose.yml et iterum curram;

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

Omnia autem bene. Continens experimentis parata est.

Nos iterum typus in proximo console:

echo '13123123123123123123123213123213' | nc localhost 5046

Et vide:

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

Operantes in uno alveo

Sic deducimus. Nunc actu tempus capere potes ipsum logstash configurare. Fasciculi pipelines non attingamus nunc enim, videamus quid uno canali operando consequi possumus.

Dicere oportet principium generale operandi cum file configurationis canalis bene descriptum in manuali officiali, hic hic
Si Latine legere vis, hoc uno usi sumus articulus(sed syntaxin interrogationis vetus est, hoc in ratione accipere debemus).

Sequenter abeamus a sectione Input. Iam vidimus opusculum in TCP. Quid hic aliud interest?

Test nuntiis uti pulsatio

Talis interesting occasio est nuntiis testium latis generandi.
Ad hoc facere debes ut plugin in input sectione cordis efficiat.

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

Vertere, incipit accepto semel minutam

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

Si saepius accipere velimus, inter- modulum addere oportet.
Hoc modo nuntium singulis 10 secundis accipiemus.

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

Retrieving notitia ex lima

Etiam tabellam modum intueri decrevimus. Si bene cum tabella laborat, tunc fortasse nihil agentis opus est, saltem ad usum localem.

Secundum descriptionem modus operandi debet esse similis caudae -f, i.e. novas lineas legit vel, ut bene, fasciculum totum legit.

Ita quod volumus adipisci;

  1. Lineas recipere volumus quae uni tabellae additae sunt.
  2. Notitiam recipere cupimus quae pluribus fasciculis scripta est, cum ea quae inde recepta sunt separare valemus.
  3. Facere volumus ut cum logstash restarted, hanc notitiam non iterum recipiat.
  4. Reprehendere volumus quod si logstash avertit, et data pergit scribenda ad tabulas, tunc cum curritur, notitias istas accipiemus.

Ad experimentum deducendum, aliam lineam ad docker-compose.yml addamus, aperiens indicem in qua tabellas ponimus.

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

Et mutare sectionem inputationem in habr_pipeline.conf

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

Sit scriptor committitur:

docker-compose up

Ad creare et scribere tabellas stipes utemur imperio:


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

Ita facit!

Eodem tempore videmus nos sponte addidisse campum iter. Id quod in futurum possumus, monumenta ab eo eliquare poterimus.

Conemur iterum:

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

Nunc ad alium fasciculum:

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

Magna! Tabella sublata est, semita recte designata est, omnia denique sunt.

Subsisto logstash ac rursus. Exspectemus. Silentium. Illae. Haec monumenta non recipimus iterum.

Jamque audacissimum experimentum.

Logstash install facere;

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

Logstash iterum currite et videte;

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

euge! Omnia sublata sunt.

Sed de sequentibus monendum est. Si continens cum logstash deletum est (sponsorium stop logstash_one_channel && docker rm logstash_one_channel), nihil colligetur. Positio tabellae ad quam legebatur reposita est intra continens. Si a scabere curris, tantum novas lineas accipiet.

Legere existentium files

Dicamus nos logstash primum deducimus, sed iam tigna habemus et velimus eas procedere.
Si logstash currimus cum sectione initus supra quam usi sumus, nihil obtinebimus. Solae novae lineae ab logstash procedentur.

Ut lineae ex scriniis existentibus evellendae sint, additam lineam ad sectionem initus adde:

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

Praeterea nugatio est: hoc solum afficit novas tabulas quae logstash nondum vidit. Eaedem tabulae quae iam in campo logstash erant, iam magnitudinerum suarum recordatus est et nunc tantum novas in eis introitus capiet.

Hic desinamus et sectionem inputare studeamus. Multa adhuc sunt optiones, sed hoc satis est nobis ad ulteriora experimenta pro nunc.

Profecta ac Data Transformation

Sentem problema solvere conemur, dicamus nos ab uno canali nuntios habere, quaedam earum informationes esse, quaedam mandata errori. Differunt a tag. Alii sunt INFO, alii ERROR.

Earum exitu nos separare debemus. Illae. Nuntias nuntios in uno canali scribemus, in alio nuntios erroris.

Ad hoc, move ab input sectione ad spargendum et output.

Per sectionem colum, nuntios advenientis dividemus, obtinens ex ea Nullam (paribus key-valores) quam iam operari possumus, i.e. secundum conditionibus disassemble. Et in sectione outputa nuntios eligemus et unumquemque ad suum canalem mittemus.

Parsing nuntium cum grok

Ut chordarum textui parse et ex illis agris copia accipias, speciale plugin in sectione colum-grok est.

Sine me propositum, ut accuratiorem eius descriptionem hic referam (hoc enim refero officialis documenta), Simplicem exemplum dabo.

Ad hoc faciendum, de forma input chordarum diiudicare debes. Eos sic habeo;

I INFO message1
2 ERROR message2

Illae. Identifier primum venit, deinde INFO/ERROR, deinde aliquod verbum sine spatiis.
Non difficile est, sed principium operationis intelligere satis est.

Itaque, in sectione colum plugin grok, exemplar definire debemus ad chordarum parsing.

Hoc sic erit:

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

Essential's a regular expression. Exemplaria parata adhibentur, ut INT, LOGLEVEL, VERBUM. Eorum descriptio, sicut et alia exemplaria, hic inveniuntur hic

Nunc, per hunc colum transiens, chorda nostra in Nullam trium agrorum vertet: message_id, relatum_type, relatum_text.

In sectione output patebunt.

Nuntias ad excitandas sectionem output utens si mandatum

In sectione output, ut meminimus, epistulas in duos rivos scindebamus. Quaedam - quae iNFO sunt, ad consolandum outputa, et cum erroribus, ad limam output erimus.

Quomodo has nuntios separamus? Conditio problematis solutionem iam suggerit - iam enim agri nuntius_typus dedicatus est, qui tantum duos valores accipere potest: INFO et ERROR. In hac ratione electionem faciemus utendo, si enuntiato.

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

Descriptio laboris cum agris et operariis in hac sectione inveniri potest officialis manual.

Nunc de ipsa conclusione.

Consolare output, omnia hic plana sunt - stdout {}

Sed output ad fasciculi - memento nos omnia haec e vase currere et ut tabella in qua exitum scribemus ut pateat ab extrinseco, opus est hoc directorium in docker-compose aperire.yml.

summa

Sectio output fasciculi nostri similis hoc est:


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

In docker-compose.yml aliud volumen pro output addimus:

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

Immittemus, experiamur, et videmus divisionem in duos rivos.

Source: www.habr.com

Add a comment