ELK рдЪрд╛ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдЕрдиреБрдкреНрд░рдпреЛрдЧ. рд▓реЙрдЧрд╕реНрдЯреЕрд╢ рд╕реЗрдЯ рдХрд░рдд рдЖрд╣реЗ

рдкрд░рд┐рдЪрдп

рджреБрд╕рд░реА рдкреНрд░рдгрд╛рд▓реА рддреИрдирд╛рдд рдХрд░рддрд╛рдирд╛, рдЖрдореНрд╣рд╛рд▓рд╛ рдореЛрдареНрдпрд╛ рд╕рдВрдЦреНрдпреЗрдиреЗ рд╡реЗрдЧрд╡реЗрдЧрд│реНрдпрд╛ рд▓реЙрдЧрд╡рд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд░рдгреНрдпрд╛рдЪреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА. ELK рд╣реЗ рд╕рд╛рдзрди рдореНрд╣рдгреВрди рдирд┐рд╡рдбрд▓реЗ рдЧреЗрд▓реЗ. рд╣рд╛ рд▓реЗрдЦ рд╣рд╛ рд╕реНрдЯреЕрдХ рд╕реЗрдЯ рдХрд░рдгреНрдпрд╛рдЪреНрдпрд╛ рдЖрдордЪреНрдпрд╛ рдЕрдиреБрднрд╡рд╛рд╡рд░ рдЪрд░реНрдЪрд╛ рдХрд░реЗрд▓.

рдЖрдореНрд╣реА рддреНрдпрд╛рдЪреНрдпрд╛ рд╕рд░реНрд╡ рдХреНрд╖рдорддрд╛рдВрдЪреЗ рд╡рд░реНрдгрди рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдПрдХ рдзреНрдпреЗрдп рд╕реЗрдЯ рдХрд░рдд рдирд╛рд╣реА, рдкрд░рдВрддреБ рдЖрдореНрд╣реА рд╡рд┐рд╢реЗрд╖рдд: рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд╕рдорд╕реНрдпрд╛ рд╕реЛрдбрд╡рдгреНрдпрд╛рд╡рд░ рд▓рдХреНрд╖ рдХреЗрдВрджреНрд░рд┐рдд рдХрд░реВ рдЗрдЪреНрдЫрд┐рддреЛ. рд╣реЗ рдпрд╛ рд╡рд╕реНрддреБрд╕реНрдерд┐рддреАрдореБрд│реЗ рдЖрд╣реЗ рдХреА рдЬрд░реА рдореЛрдареНрдпрд╛ рдкреНрд░рдорд╛рдгрд╛рдд рджрд╕реНрддрдРрд╡рдЬреАрдХрд░рдг рдЖрдгрд┐ рддрдпрд╛рд░ рдкреНрд░рддрд┐рдорд╛ рдЖрд╣реЗрдд, рддрд░реАрд╣реА рддреЗрдереЗ рдмрд░реЗрдЪ рддреЛрдЯреЗ рдЖрд╣реЗрдд, рдХрдореАрддрдХрдореА рдЖрдореНрд╣рд╛рд▓рд╛ рддреЗ рд╕рд╛рдкрдбрд▓реЗ.

рдЖрдореНрд╣реА рдбреЙрдХрд░-рдХрдВрдкреЛрдЬ рджреНрд╡рд╛рд░реЗ рд╕реНрдЯреЕрдХ рддреИрдирд╛рдд рдХреЗрд▓реЗ. рд╢рд┐рд╡рд╛рдп, рдЖрдордЪреНрдпрд╛рдХрдбреЗ рдПрдХ рдЪрд╛рдВрдЧрд▓реЗ рд▓рд┐рд╣рд┐рд▓реЗрд▓реЗ docker-compose.yml рд╣реЛрддреЗ, рдЬреНрдпрд╛рдореБрд│реЗ рдЖрдореНрд╣рд╛рд▓рд╛ рдЬрд╡рд│рдЬрд╡рд│ рд╕рдорд╕реНрдпрд╛рдВрд╢рд┐рд╡рд╛рдп рд╕реНрдЯреЕрдХ рд╡рд╛рдврд╡рддрд╛ рдЖрд▓рд╛. рдЖрдгрд┐ рдЖрдореНрд╣рд╛рд▓рд╛ рдЕрд╕реЗ рд╡рд╛рдЯрд▓реЗ рдХреА рд╡рд┐рдЬрдп рдЖрдзреАрдЪ рдЬрд╡рд│ рдЖрд▓рд╛ рдЖрд╣реЗ, рдЖрддрд╛ рдЖрдореНрд╣реА рдЖрдордЪреНрдпрд╛ рдЧрд░рдЬреЗрдиреБрд╕рд╛рд░ рдереЛрдбрд╛рд╕рд╛ рдмрджрд▓ рдХрд░реВ рдЖрдгрд┐ рддреЗрдЪ рдЖрд╣реЗ.

рджреБрд░реНрджреИрд╡рд╛рдиреЗ, рдЖрдордЪреНрдпрд╛ рдЕрдиреБрдкреНрд░рдпреЛрдЧрд╛рд╡рд░реВрди рд▓реЙрдЧ рдкреНрд░рд╛рдкреНрдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЖрдгрд┐ рддреНрдпрд╛рд╡рд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рд╕рд┐рд╕реНрдЯрдо рдХреЙрдиреНрдлрд┐рдЧрд░ рдХрд░рдгреНрдпрд╛рдЪрд╛ рдкреНрд░рдпрддреНрди рддреНрд╡рд░рд┐рдд рдпрд╢рд╕реНрд╡реА рдЭрд╛рд▓рд╛ рдирд╛рд╣реА. рдореНрд╣рдгреВрди, рдЖрдореНрд╣реА рдард░рд╡рд▓реЗ рдХреА рдкреНрд░рддреНрдпреЗрдХ рдШрдЯрдХрд╛рдЪрд╛ рд╕реНрд╡рддрдВрддреНрд░рдкрдгреЗ рдЕрднреНрдпрд╛рд╕ рдХрд░рдгреЗ рдЖрдгрд┐ рдирдВрддрд░ рддреНрдпрд╛рдВрдЪреНрдпрд╛ рдХрдиреЗрдХреНрд╢рдирд╡рд░ рдкрд░рдд рдЬрд╛рдгреЗ рдпреЛрдЧреНрдп рдЖрд╣реЗ.

рддрд░, рдЖрдореНрд╣реА рд▓реЙрдЧрд╕реНрдЯреЕрд╢рдиреЗ рд╕реБрд░реБрд╡рд╛рдд рдХреЗрд▓реА.

рдкрд░реНрдпрд╛рд╡рд░рдг, рдЙрдкрдпреЛрдЬрди, рдХрдВрдЯреЗрдирд░рдордзреНрдпреЗ рд▓реЙрдЧрд╕реНрдЯреЕрд╢ рдЪрд╛рд▓рд╡рдгреЗ

рддреИрдирд╛рддреАрд╕рд╛рдареА рдЖрдореНрд╣реА рдбреЙрдХрд░-рдХрдВрдкреЛрдЬ рд╡рд╛рдкрд░рддреЛ; рдпреЗрдереЗ рд╡рд░реНрдгрди рдХреЗрд▓реЗрд▓реЗ рдкреНрд░рдпреЛрдЧ MacOS рдЖрдгрд┐ Ubuntu 18.0.4 рд╡рд░ рдХреЗрд▓реЗ рдЧреЗрд▓реЗ.

рдЖрдордЪреНрдпрд╛ рдореВрд│ docker-compose.yml рдордзреНрдпреЗ рдиреЛрдВрджрдгреАрдХреГрдд рд▓реЙрдЧрд╕реНрдЯреЕрд╢ рдкреНрд░рддрд┐рдорд╛ docker.elastic.co/logstash/logstash:6.3.2 рдЖрд╣реЗ

рдЖрдореНрд╣реА рддреЗ рдкреНрд░рдпреЛрдЧрд╛рдВрд╕рд╛рдареА рд╡рд╛рдкрд░реВ.

рд▓реЙрдЧрд╕реНрдЯреЕрд╢ рдЪрд╛рд▓рд╡рдгреНрдпрд╛рд╕рд╛рдареА рдЖрдореНрд╣реА рд╕реНрд╡рддрдВрддреНрд░ docker-compose.yml рд▓рд┐рд╣рд┐рд▓реЗ. рдЕрд░реНрдерд╛рдд, рдХрдорд╛рдВрдб рд▓рд╛рдЗрдирд╡рд░реВрди рдкреНрд░рддрд┐рдорд╛ рд▓рд╛рдБрдЪ рдХрд░рдгреЗ рд╢рдХреНрдп рд╣реЛрддреЗ, рдкрд░рдВрддреБ рдЖрдореНрд╣реА рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рдорд╕реНрдпрд╛ рд╕реЛрдбрд╡рдд рд╣реЛрддреЛ, рдЬрд┐рдереЗ рдЖрдореНрд╣реА рдбреЙрдХрд░-рдХрдВрдкреЛрдЬрдкрд╛рд╕реВрди рд╕рд░реНрд╡рдХрд╛рд╣реА рдЪрд╛рд▓рд╡рддреЛ.

рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рдлрд╛рдЗрд▓реНрд╕рдмрджреНрджрд▓ рдереЛрдбрдХреНрдпрд╛рдд

рд╡рд░реНрдгрдирд╛рд╡рд░реВрди рдЦрд╛рд▓реАрд▓рдкреНрд░рдорд╛рдгреЗ, рд▓реЙрдЧрд╕реНрдЯреЕрд╢ рдПрдХрддрд░ рдПрдХрд╛ рдЪреЕрдиреЗрд▓рд╕рд╛рдареА рдЪрд╛рд▓рд╡рд▓рд╛ рдЬрд╛рдК рд╢рдХрддреЛ, рдЬреНрдпрд╛ рдмрд╛рдмрддреАрдд рддреНрдпрд╛рд▓рд╛ *.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_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 рдкреЛрд╣реЛрдЪрдгреНрдпрд╛рдпреЛрдЧреНрдп рдирд╛рд╣реА: [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 рд╡рд░ рдирд╛рд╣реА. рдореЙрдирд┐рдЯрд░рд┐рдВрдЧ рд╡реИрд╢рд┐рд╖реНрдЯреНрдп рд╡рд╛рдкрд░рдгреНрдпрд╛рд╕рд╛рдареА рдХреГрдкрдпрд╛ Elasticsearch рд╡рд░ X-Pack рд╕реНрдерд╛рдкрд┐рдд рдХрд░рд╛. рдЗрддрд░ рд╡реИрд╢рд┐рд╖реНрдЯреНрдпреЗ рдЙрдкрд▓рдмреНрдз рдЕрд╕реВ рд╢рдХрддрд╛рдд.
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][WARN ][logstash.outputs.elasticsearch] рдореГрдд ES рдЙрджрд╛рд╣рд░рдгрд╛рд╢реА рдХрдиреЗрдХреНрд╢рди рдкреБрдирд░реБрддреНрдерд╛рди рдХрд░рдгреНрдпрд╛рдЪрд╛ рдкреНрд░рдпрддреНрди рдХреЗрд▓рд╛, рдкрд░рдВрддреБ рддреНрд░реБрдЯреА рдЖрд▓реА. {:url=>"рд▓рд╡рдЪрд┐рдХ:9200/", :error_type=>LogStash::Outputs::ElasticSearch::HttpClient::Pool::HostUnreachableError, :error=>"Elasticsearch рдЕрдЧрдореНрдп: [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 рдЕрдЧрдореНрдп: [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 | }

рдПрдХрд╛ рдЪреЕрдиреЗрд▓рдордзреНрдпреЗ рдХрд╛рдо рдХрд░рдд рдЖрд╣реЗ

рдореНрд╣рдгреВрди рдЖрдореНрд╣реА рд▓реЙрдиреНрдЪ рдХреЗрд▓реЗ. рдЖрддрд╛ рддреБрдореНрд╣реА рд▓реЙрдЧрд╕реНрдЯреЕрд╢ рд╕реНрд╡рддрдГрдЪ рдХреЙрдиреНрдлрд┐рдЧрд░ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рд╡реЗрд│ рдХрд╛рдвреВ рд╢рдХрддрд╛. рдЪрд▓рд╛ рд╕рдзреНрдпрд╛ 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. рд▓реЙрдЧрд╕реНрдЯреЕрд╢ рд░реАрд╕реНрдЯрд╛рд░реНрдЯ рдЭрд╛рд▓реНрдпрд╛рд╡рд░, рддреНрдпрд╛рд▓рд╛ рд╣рд╛ рдбреЗрдЯрд╛ рдкреБрдиреНрд╣рд╛ рдорд┐рд│рдгрд╛рд░ рдирд╛рд╣реА рдпрд╛рдЪреА рдЖрдореНрд╣реА рдЦрд╛рддреНрд░реА рдХрд░реВ рдЗрдЪреНрдЫрд┐рддреЛ.
  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 | }

рдЫрд╛рди! рдлрд╛рдЗрд▓ рдЙрдЪрд▓рд▓реА рдЧреЗрд▓реА, рдорд╛рд░реНрдЧ рдпреЛрдЧреНрдпрд░рд┐рддреНрдпрд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХреЗрд▓рд╛ рдЧреЗрд▓рд╛, рд╕рд░реНрд╡ рдХрд╛рд╣реА рдареАрдХ рдЖрд╣реЗ.

рд▓реЙрдЧрд╕реНрдЯреЕрд╢ рдерд╛рдВрдмрд╡рд╛ рдЖрдгрд┐ рдкреБрдиреНрд╣рд╛ рд╕реБрд░реВ рдХрд░рд╛. рдЪрд▓рд╛ рдерд╛рдВрдмреВрдпрд╛. рд╢рд╛рдВрддрддрд╛. рддреНрдпрд╛. рд╣реЗ рд░реЗрдХреЙрд░реНрдб рдЖрдореНрд╣рд╛рд▓рд╛ рдкреБрдиреНрд╣рд╛ рдорд┐рд│рдд рдирд╛рд╣реАрдд.

рдЖрдгрд┐ рдЖрддрд╛ рд╕рд░реНрд╡рд╛рдд рдзрд╛рдбрд╕реА рдкреНрд░рдпреЛрдЧ.

рд▓реЙрдЧрд╕реНрдЯреЕрд╢ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рд╛ рдЖрдгрд┐ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд░рд╛:

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

рд▓реЙрдЧрд╕реНрдЯреЕрд╢ рдкреБрдиреНрд╣рд╛ рдЪрд╛рд▓рд╡рд╛ рдЖрдгрд┐ рдкрд╣рд╛:

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_one_channel && docker rm logstash_one_channel), рдирдВрддрд░ рдХрд╛рд╣реАрд╣реА рдЙрдЪрд▓рд▓реЗ рдЬрд╛рдгрд╛рд░ рдирд╛рд╣реА. рдлрд╛рдИрд▓рдЪреА рд╕реНрдерд┐рддреА рдЬреНрдпрд╛рдкрд░реНрдпрдВрдд рддреА рд╡рд╛рдЪрд▓реА рдЧреЗрд▓реА рддреА рдХрдВрдЯреЗрдирд░рдордзреНрдпреЗ рд╕рдВрдЧреНрд░рд╣рд┐рдд рдХреЗрд▓реА рдЧреЗрд▓реА. рддреБрдореНрд╣реА рддреЗ рд╕реБрд░рд╡рд╛рддреАрдкрд╛рд╕реВрди рдЪрд╛рд▓рд╡рд▓реНрдпрд╛рд╕, рддреЗ рдлрдХреНрдд рдирд╡реАрди рдУрд│реА рд╕реНрд╡реАрдХрд╛рд░реЗрд▓.

рд╡рд┐рджреНрдпрдорд╛рди рдлрд╛рдпрд▓реА рд╡рд╛рдЪрдд рдЖрд╣реЗ

рд╕рдордЬрд╛ рдЖрдореНрд╣реА рдкреНрд░рдердордЪ рд▓реЙрдЧрд╕реНрдЯреЕрд╢ рд▓рд╛рдБрдЪ рдХрд░рдд рдЖрд╣реЛрдд, рдкрд░рдВрддреБ рдЖрдордЪреНрдпрд╛рдХрдбреЗ рдЖрдзреАрдкрд╛рд╕реВрдирдЪ рд▓реЙрдЧ рдЖрд╣реЗрдд рдЖрдгрд┐ рдЖрдореНрд╣реА рддреНрдпрд╛рд╡рд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд░реВ рдЗрдЪреНрдЫрд┐рддреЛ.
рдЖрдореНрд╣реА рд╡рд░ рд╡рд╛рдкрд░рд▓реЗрд▓реНрдпрд╛ рдЗрдирдкреБрдЯ рд╡рд┐рднрд╛рдЧрд╛рд╕рд╣ рд▓реЙрдЧрд╕реНрдЯреЕрд╢ рдЪрд╛рд▓рд╡рд▓реНрдпрд╛рд╕, рдЖрдореНрд╣рд╛рд▓рд╛ рдХрд╛рд╣реАрд╣реА рдорд┐рд│рдгрд╛рд░ рдирд╛рд╣реА. рд▓реЙрдЧрд╕реНрдЯреЕрд╢рджреНрд╡рд╛рд░реЗ рдлрдХреНрдд рдирд╡реАрди рдУрд│реАрдВрд╡рд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗрд▓реА рдЬрд╛рдИрд▓.

рд╡рд┐рджреНрдпрдорд╛рди рдлрд╛рдЗрд▓реНрд╕рдордзреАрд▓ рдУрд│реА рд╡рд░ рдЦреЗрдЪрд▓реНрдпрд╛ рдЬрд╛рдгреНрдпрд╛рд╕рд╛рдареА, рддреБрдореНрд╣реА рдЗрдирдкреБрдЯ рд╡рд┐рднрд╛рдЧрд╛рдд рдЕрддрд┐рд░рд┐рдХреНрдд рдУрд│ рдЬреЛрдбрд▓реА рдкрд╛рд╣рд┐рдЬреЗ:

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

рд╢рд┐рд╡рд╛рдп, рдПрдХ рд╕реВрдХреНрд╖реНрдорддрд╛ рдЖрд╣реЗ: рд╣реЗ рдлрдХреНрдд рдирд╡реАрди рдлрд╛рдпрд▓реАрдВрд╡рд░ рдкрд░рд┐рдгрд╛рдо рдХрд░рддреЗ рдЬреНрдпрд╛ рд▓реЙрдЧрд╕реНрдЯреЕрд╢рдиреЗ рдЕрджреНрдпрд╛рдк рдкрд╛рд╣рд┐рд▓реЗрд▓реНрдпрд╛ рдирд╛рд╣реАрдд. рд▓реЙрдЧрд╕реНрдЯреЕрд╢рдЪреНрдпрд╛ рджреГрд╢реНрдпрд╛рдЪреНрдпрд╛ рдХреНрд╖реЗрддреНрд░рд╛рдд рдЖрдзреАрдкрд╛рд╕реВрди рдЕрд╕рд▓реЗрд▓реНрдпрд╛ рд╕рдорд╛рди рдлрд╛рдпрд▓реАрдВрд╕рд╛рдареА, рддреНрдпрд╛рдВрдиреА рддреНрдпрд╛рдВрдЪрд╛ рдЖрдХрд╛рд░ рдЖрдзреАрдЪ рд▓рдХреНрд╖рд╛рдд рдареЗрд╡рд▓рд╛ рдЖрд╣реЗ рдЖрдгрд┐ рдЖрддрд╛ рддреНрдпрд╛рдордзреНрдпреЗ рдлрдХреНрдд рдирд╡реАрди рдиреЛрдВрджреА рдШреЗрддреАрд▓.

рдЪрд▓рд╛ рдЗрдереЗ рдерд╛рдВрдмреВ рдЖрдгрд┐ рдЗрдирдкреБрдЯ рд╡рд┐рднрд╛рдЧрд╛рдЪрд╛ рдЕрднреНрдпрд╛рд╕ рдХрд░реВрдпрд╛. рдЕрдЬреВрдирд╣реА рдмрд░реЗрдЪ рдкрд░реНрдпрд╛рдп рдЖрд╣реЗрдд, рдкрд░рдВрддреБ рдЖрддрд╛рдЪреНрдпрд╛ рдкреБрдвреАрд▓ рдкреНрд░рдпреЛрдЧрд╛рдВрд╕рд╛рдареА рдЖрдордЪреНрдпрд╛рд╕рд╛рдареА рддреЗ рдкреБрд░реЗрд╕реЗ рдЖрд╣реЗ.

рд░рд╛рдЙрдЯрд┐рдВрдЧ рдЖрдгрд┐ рдбреЗрдЯрд╛ рдЯреНрд░рд╛рдиреНрд╕рдлреЙрд░реНрдореЗрд╢рди

рдЪрд▓рд╛ рдЦрд╛рд▓реАрд▓ рд╕рдорд╕реНрдпреЗрдЪреЗ рдирд┐рд░рд╛рдХрд░рдг рдХрд░рдгреНрдпрд╛рдЪрд╛ рдкреНрд░рдпрддреНрди рдХрд░реВрдпрд╛, рд╕рдордЬрд╛ рдЖрдордЪреНрдпрд╛рдХрдбреЗ рдПрдХрд╛ рдЪреЕрдиреЗрд▓рдЪреЗ рд╕рдВрджреЗрд╢ рдЖрд╣реЗрдд, рддреНрдпрд╛рдкреИрдХреА рдХрд╛рд╣реА рдорд╛рд╣рд┐рддреАрдкреВрд░реНрдг рдЖрд╣реЗрдд рдЖрдгрд┐ рдХрд╛рд╣реА рддреНрд░реБрдЯреА рд╕рдВрджреЗрд╢ рдЖрд╣реЗрдд. рддреЗ рдЯреЕрдЧрдиреБрд╕рд╛рд░ рднрд┐рдиреНрди рдЖрд╣реЗрдд. рдХрд╛рд╣реА INFO рдЖрд╣реЗрдд, рддрд░ рдХрд╛рд╣реА ERROR рдЖрд╣реЗрдд.

рдмрд╛рд╣реЗрд░ рдкрдбрддрд╛рдирд╛ рдЖрдкрдг рддреНрдпрд╛рдВрдирд╛ рд╡реЗрдЧрд│реЗ рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ. рддреНрдпрд╛. рдЖрдореНрд╣реА рдПрдХрд╛ рдЪреЕрдиреЗрд▓рдордзреНрдпреЗ рдорд╛рд╣рд┐рддреА рд╕рдВрджреЗрд╢ рдЖрдгрд┐ рджреБрд╕рд░реНтАНрдпрд╛ рдЪреЕрдиреЗрд▓рдордзреНрдпреЗ рддреНрд░реБрдЯреА рд╕рдВрджреЗрд╢ рд▓рд┐рд╣рд┐рддреЛ.

рд╣реЗ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА, рдЗрдирдкреБрдЯ рд╡рд┐рднрд╛рдЧрд╛рддреВрди рдлрд┐рд▓реНрдЯрд░ рдЖрдгрд┐ рдЖрдЙрдЯрдкреБрдЯрд╡рд░ рдЬрд╛.

рдлрд┐рд▓реНрдЯрд░ рд╡рд┐рднрд╛рдЧ рд╡рд╛рдкрд░реВрди, рдЖрдореНрд╣реА рдпреЗрдгрд╛рд░рд╛ рд╕рдВрджреЗрд╢ рдкрд╛рд░реНрд╕ рдХрд░реВ, рддреНрдпрд╛рддреВрди рд╣реЕрд╢ (рдХреА-рд╡реНрд╣реЕрд▓реНрдпреВ рдЬреЛрдбреНрдпрд╛) рдорд┐рд│рд╡реВ, рдЬреНрдпрд╛рд╡рд░ рдЖрдореНрд╣реА рдЖрдзреАрдЪ рдХрд╛рдо рдХрд░реВ рд╢рдХрддреЛ, рдЙрджрд╛. рдкрд░рд┐рд╕реНрдерд┐рддреАрдиреБрд╕рд╛рд░ рд╡реЗрдЧрд│реЗ рдХрд░рд╛. рдЖрдгрд┐ рдЖрдЙрдЯрдкреБрдЯ рд╡рд┐рднрд╛рдЧрд╛рдд, рдЖрдореНрд╣реА рд╕рдВрджреЗрд╢ рдирд┐рд╡рдбреВ рдЖрдгрд┐ рдкреНрд░рддреНрдпреЗрдХрд╛рд▓рд╛ рддреНрдпрд╛рдЪреНрдпрд╛ рд╕реНрд╡рддрдГрдЪреНрдпрд╛ рдЪреЕрдиреЗрд▓рд╡рд░ рдкрд╛рдард╡реВ.

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 рдЖрд╣реЗрдд, рдХрдиреНрд╕реЛрд▓рд╡рд░ рдЖрдЙрдЯрдкреБрдЯ рдХреЗрд▓реЗ рдЬрд╛рддреАрд▓ рдЖрдгрд┐ рддреНрд░реБрдЯреАрдВрд╕рд╣, рдЖрдореНрд╣реА рдлрд╛рдЗрд▓рдордзреНрдпреЗ рдЖрдЙрдЯрдкреБрдЯ рдХрд░реВ.

рдЖрдореНрд╣реА рд╣реЗ рд╕рдВрджреЗрд╢ рдХрд╕реЗ рд╡реЗрдЧрд│реЗ рдХрд░реВ? рд╕рдорд╕реНрдпреЗрдЪреА рд╕реНрдерд┐рддреА рдЖрдзреАрдЪ рдПрдХ рдЙрдкрд╛рдп рд╕реБрдЪрд╡рддреЗ - рд╢реЗрд╡рдЯреА, рдЖрдордЪреНрдпрд╛рдХрдбреЗ рдЖрдзреАрдкрд╛рд╕реВрдирдЪ рдПрдХ рд╕рдорд░реНрдкрд┐рдд рд╕рдВрджреЗрд╢_рдкреНрд░рдХрд╛рд░ рдлреАрд▓реНрдб рдЖрд╣реЗ, рдЬреА рдлрдХреНрдд рджреЛрди рдореВрд▓реНрдпреЗ рдШреЗрдК рд╢рдХрддреЗ: 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

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╛