ื™ื™ืฉื•ื ืžืขืฉื™ ืฉืœ ELK. ื”ื’ื“ืจืช logstash

ืžื‘ื•ื

ื‘ื–ืžืŸ ืคืจื™ืกืช ืžืขืจื›ืช ืื—ืจืช, ืขืžื“ื ื• ื‘ืคื ื™ ื”ืฆื•ืจืš ืœืขื‘ื“ ืžืกืคืจ ืจื‘ ืฉืœ ื™ื•ืžื ื™ื ืฉื•ื ื™ื. ELK ื ื‘ื—ืจ ื›ื›ืœื™. ืžืืžืจ ื–ื” ื™ื“ื•ืŸ ื‘ื ื™ืกื™ื•ืŸ ืฉืœื ื• ื‘ื”ื’ื“ืจืช ืžื—ืกื ื™ืช ื–ื•.

ืื ื—ื ื• ืœื ืžืฆื™ื‘ื™ื ื™ืขื“ ืœืชืืจ ืืช ื›ืœ ื”ื™ื›ื•ืœื•ืช ืฉืœื•, ืื‘ืœ ืื ื—ื ื• ืจื•ืฆื™ื ืœื”ืชืจื›ื– ื‘ืžื™ื•ื—ื“ ื‘ืคืชืจื•ืŸ ื‘ืขื™ื•ืช ืžืขืฉื™ื•ืช. ื–ื” ื ื•ื‘ืข ืžื”ืขื•ื‘ื“ื” ืฉืœืžืจื•ืช ืฉื™ืฉ ื›ืžื•ืช ื“ื™ ื’ื“ื•ืœื” ืฉืœ ืชื™ืขื•ื“ ื•ืชืžื•ื ื•ืช ืžื•ื›ื ื•ืช, ื™ืฉ ื“ื™ ื”ืจื‘ื” ืžืœื›ื•ื“ื•ืช, ืœืคื—ื•ืช ืžืฆืื ื• ืื•ืชืŸ.

ืคืจืกื ื• ืืช ื”ืžื—ืกื ื™ืช ื“ืจืš docker-compose. ื™ืชืจื” ืžื›ืš, ื”ื™ื” ืœื ื• docker-compose.yml ื›ืชื•ื‘ ื”ื™ื˜ื‘, ืฉืืคืฉืจ ืœื ื• ืœื”ืขืœื•ืช ืืช ื”ืขืจื™ืžื” ื›ืžืขื˜ ืœืœื ื‘ืขื™ื•ืช. ื•ื ืจืื” ืœื ื• ืฉื”ื ื™ืฆื—ื•ืŸ ื›ื‘ืจ ืงืจื•ื‘, ืขื›ืฉื™ื• ื ืฉื ื” ืื•ืชื• ืงืฆืช ื›ื“ื™ ืฉื™ืชืื™ื ืœืฆืจื›ื™ื ืฉืœื ื• ื•ื–ื”ื•.

ืœืจื•ืข ื”ืžื–ืœ, ื”ื ื™ืกื™ื•ืŸ ืœื”ื’ื“ื™ืจ ืืช ื”ืžืขืจื›ืช ืœืงื‘ืœ ื•ืœืขื‘ื“ ื™ื•ืžื ื™ื ืžื”ืืคืœื™ืงืฆื™ื” ืฉืœื ื• ืœื ื”ืฆืœื™ื— ืžื™ื“. ืœื›ืŸ ื”ื—ืœื˜ื ื• ืฉื›ื“ืื™ ืœืœืžื•ื“ ื›ืœ ืžืจื›ื™ื‘ ื‘ื ืคืจื“, ื•ืื– ืœื—ื–ื•ืจ ืœืงืฉืจื™ื•.

ืื–, ื”ืชื—ืœื ื• ืขื logstash.

ืกื‘ื™ื‘ื”, ืคืจื™ืกื”, ื”ืคืขืœืช Logstash ื‘ืงื•ื ื˜ื™ื™ื ืจ

ืœืคืจื™ืกื” ืื ื• ืžืฉืชืžืฉื™ื ื‘-docer-compose; ื”ื ื™ืกื•ื™ื™ื ื”ืžืชื•ืืจื™ื ื›ืืŸ ื‘ื•ืฆืขื• ืขืœ MacOS ื•-Ubuntu 18.0.4.

ืชืžื•ื ืช ื”-logstash ืฉื ืจืฉืžื” ื‘-docker-compose.yml ื”ืžืงื•ืจื™ ืฉืœื ื• ื”ื™ื docker.elastic.co/logstash/logstash:6.3.2

ื ืฉืชืžืฉ ื‘ื• ืœื ื™ืกื•ื™ื™ื.

ื›ืชื‘ื ื• docker-compose.yml ื ืคืจื“ ืœื”ืคืขืœืช logstash. ื›ืžื•ื‘ืŸ ืฉื”ื™ื” ืืคืฉืจ ืœื”ืคืขื™ืœ ืืช ื”ืชืžื•ื ื” ืžืฉื•ืจืช ื”ืคืงื•ื“ื”, ืื‘ืœ ืคืชืจื ื• ื‘ืขื™ื” ืกืคืฆื™ืคื™ืช, ืฉื‘ื” ืื ื—ื ื• ืžืจื™ืฆื™ื ื”ื›ืœ ืž-docker-compose.

ื‘ืงืฆืจื” ืขืœ ืงื‘ืฆื™ ืชืฆื•ืจื”

ื›ื“ืœืงืžืŸ ืžื”ืชื™ืื•ืจ, ื ื™ืชืŸ ืœื”ืจื™ืฅ ืืช logstash ืขื‘ื•ืจ ืขืจื•ืฅ ืื—ื“, ื•ื‘ืžืงืจื” ื–ื” ื”ื•ื ืฆืจื™ืš ืœื”ืขื‘ื™ืจ ืืช ืงื•ื‘ืฅ *.conf, ืื• ืขื‘ื•ืจ ืžืกืคืจ ืขืจื•ืฆื™ื, ื•ื‘ืžืงืจื” ื–ื” ื”ื•ื ืฆืจื™ืš ืœื”ืขื‘ื™ืจ ืืช ื”ืงื•ื‘ืฅ pipelines.yml, ืืฉืจ ื‘ืชื•ืจื• , ื™ืงืฉืจ ืœืงื‘ืฆื™ื .conf ืขื‘ื•ืจ ื›ืœ ืขืจื•ืฅ.
ื”ืœื›ื ื• ื‘ื“ืจืš ื”ืฉื ื™ื™ื”. ื–ื” ื ืจืื” ืœื ื• ื™ื•ืชืจ ืื•ื ื™ื‘ืจืกืœื™ ื•ื ื™ืชืŸ ืœื”ืจื—ื‘ื”. ืœื›ืŸ ื™ืฆืจื ื• ืืช pipelines.yml, ื•ื™ืฆืจื ื• ืกืคืจื™ื™ืช pipelines ื‘ื” ื ื›ื ื™ืก ืงื‘ืฆื™ .conf ืœื›ืœ ืขืจื•ืฅ.

ื‘ืชื•ืš ื”ืงื•ื ื˜ื™ื™ื ืจ ื™ืฉ ืงื•ื‘ืฅ ืชืฆื•ืจื” ื ื•ืกืฃ - logstash.yml. ืื ื—ื ื• ืœื ื ื•ื’ืขื™ื ื‘ื•, ืื ื—ื ื• ืžืฉืชืžืฉื™ื ื‘ื• ื›ืคื™ ืฉื”ื•ื.

ืื–, ืžื‘ื ื” ื”ืกืคืจื™ื•ืช ืฉืœื ื•:

ื™ื™ืฉื•ื ืžืขืฉื™ ืฉืœ ELK. ื”ื’ื“ืจืช logstash

ื›ื“ื™ ืœืงื‘ืœ ื ืชื•ื ื™ ืงืœื˜, ืœืขืช ืขืชื” ืื ื• ืžื ื™ื—ื™ื ืฉื–ื”ื• tcp ื‘ื™ืฆื™ืื” 5046, ื•ืœืคืœื˜ ื ืฉืชืžืฉ ื‘-stdout.

ื”ื ื” ืชืฆื•ืจื” ืคืฉื•ื˜ื” ืขื‘ื•ืจ ื”ื”ืฉืงื” ื”ืจืืฉื•ื ื”. ื›ื™ ื”ืžืฉื™ืžื” ื”ืจืืฉื•ื ื™ืช ื”ื™ื ืœื”ืฉื™ืง.

ืื– ื™ืฉ ืœื ื• ืืช docker-compose.yml ื”ื–ื”

version: '3'

networks:
  elk:

volumes:
  elasticsearch:
    driver: local

services:

  logstash:
    container_name: logstash_one_channel
    image: docker.elastic.co/logstash/logstash:6.3.2
    networks:
      	- elk
    ports:
      	- 5046:5046
    volumes:
      	- ./config/pipelines.yml:/usr/share/logstash/config/pipelines.yml:ro
	- ./config/pipelines:/usr/share/logstash/config/pipelines:ro

ืžื” ืื ื—ื ื• ืจื•ืื™ื ื›ืืŸ?

  1. ืจืฉืชื•ืช ื•ื ืคื—ื™ื ื ืœืงื—ื• ืžื”ืงื•ื‘ืฅ docker-compose.yml ื”ืžืงื•ืจื™ (ื–ื” ืฉื‘ื• ื›ืœ ื”ืขืจื™ืžื” ืžื•ืฉืงืช) ื•ืื ื™ ื—ื•ืฉื‘ ืฉื”ื ืœื ืžืฉืคื™ืขื™ื ืžืื•ื“ ืขืœ ื”ืชืžื•ื ื” ื”ื›ื•ืœืœืช ื›ืืŸ.
  2. ืื ื• ื™ื•ืฆืจื™ื ืฉื™ืจื•ืช(ื™ื) ืื—ื“ ืฉืœ logstash ืžื”ืชืžื•ื ื” ืฉืœ 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. ื”ื’ื“ืจืช logstash

ืงื•ื‘ืฅ Pipelines.yml

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

ืขืจื•ืฅ ืื—ื“ ืขื ืžื–ื”ื” HABR ื•ื”ื ืชื™ื‘ ืœืงื•ื‘ืฅ ื”ืชืฆื•ืจื” ืฉืœื• ืžืชื•ืืจื™ื ื›ืืŸ.

ื•ืœื‘ืกื•ืฃ ื”ืงื•ื‘ืฅ "./config/pipelines/habr_pipeline.conf"

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

ื‘ื•ื ืœื ื ื™ื›ื ืก ืœืชื™ืื•ืจ ืฉืœื• ืœืขืช ืขืชื”, ื‘ื•ืื• ื ื ืกื” ืœื”ืคืขื™ืœ ืื•ืชื•:

docker-compose up

ืžื” ืื ื—ื ื• ืจื•ืื™ื?

ื”ืžื›ื•ืœื” ื”ืชื—ื™ืœื”. ืื ื—ื ื• ื™ื›ื•ืœื™ื ืœื‘ื“ื•ืง ืืช ืคืขื•ืœืชื•:

echo '13123123123123123123123213123213' | nc localhost 5046

ื•ืื ื—ื ื• ืจื•ืื™ื ืืช ื”ืชื’ื•ื‘ื” ื‘ืงื•ื ืกื•ืœืช ื”ืžื›ื•ืœื”:

ื™ื™ืฉื•ื ืžืขืฉื™ ืฉืœ ELK. ื”ื’ื“ืจืช logstash

ืื‘ืœ ื‘ืžืงื‘ื™ืœ, ืื ื• ืจื•ืื™ื ื’ื:

logstash_one_channel | [2019-04-29T11:28:59,790][ERROR][logstash.licensechecker.licensereader] ืœื ื ื™ืชืŸ ืœืื—ื–ืจ ืžื™ื“ืข ืจื™ืฉื™ื•ืŸ ืžืฉืจืช ื”ืจื™ืฉื™ื•ื ื•ืช {:message=>โ€œElasticsearch 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-Pack ืขืœ 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] ื”ืคืขืœืช ื‘ื“ื™ืงืช ืชืงื™ื ื•ืช ื›ื“ื™ ืœืจืื•ืช ืื ื—ื™ื‘ื•ืจ Elasticsearch ืคื•ืขืœ {:healthcheck_url=>http://elasticsearch:9200/, :path=> "/"}
logstash_one_channel | [2019-04-29T11:29:04,487][WARN ][logstash.outputs.elasticsearch] ื ื™ืกื” ืœื”ื—ื™ื•ืช ืืช ื”ื—ื™ื‘ื•ืจ ืœืžื•ืคืข ES ืžืช, ืืš ืงื™ื‘ืœ ืฉื’ื™ืื”. {:url=>โ€œืืœืกื˜ื™ืงื”:9200/", :error_type=>LogStash::Outputs::ElasticSearch::HttpClient::Pool::HostUnreachableError, :error=>"Elasticsearch Unreachable: [http://elasticsearch:9200/][Manticore::ResolutionFailure] elasticsearch"}
logstash_one_channel | [2019-04-29T11:29:04,704][INFO ][logstash.licensechecker.licensereader] ื”ืคืขืœืช ื‘ื“ื™ืงืช ืชืงื™ื ื•ืช ื›ื“ื™ ืœืจืื•ืช ืื ื—ื™ื‘ื•ืจ Elasticsearch ืคื•ืขืœ {:healthcheck_url=>http://elasticsearch:9200/, :path=> "/"}
logstash_one_channel | [2019-04-29T11:29:04,710][WARN ][logstash.licensechecker.licensereader] ื ื™ืกื” ืœื”ื—ื™ื•ืช ืืช ื”ื—ื™ื‘ื•ืจ ืœืžื•ืคืข ES ืžืช, ืืš ืงื™ื‘ืœ ืฉื’ื™ืื”. {:url=>โ€œืืœืกื˜ื™ืงื”:9200/", :error_type=>LogStash::Outputs::ElasticSearch::HttpClient::Pool::HostUnreachableError, :error=>"Elasticsearch Unreachable: [http://elasticsearch:9200/][Manticore::ResolutionFailure] 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. ืžื” ืขื•ื“ ื™ื›ื•ืœ ืœื”ื™ื•ืช ืžืขื ื™ื™ืŸ ื›ืืŸ?

ื‘ื“ื•ืง ื”ื•ื“ืขื•ืช ื‘ืืžืฆืขื•ืช ืคืขื™ืžื•ืช ืœื‘

ื™ืฉ ื”ื–ื“ืžื ื•ืช ื›ืœ ื›ืš ืžืขื ื™ื™ื ืช ืœื™ืฆื•ืจ ื”ื•ื“ืขื•ืช ื‘ื“ื™ืงื” ืื•ื˜ื•ืžื˜ื™ื•ืช.
ื›ื“ื™ ืœืขืฉื•ืช ื–ืืช, ืขืœื™ืš ืœื”ืคืขื™ืœ ืืช ืชื•ืกืฃ heartbean ื‘ืงื˜ืข ื”ืงืœื˜.

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

ืื—ื–ื•ืจ ื ืชื•ื ื™ื ืžืงื•ื‘ืฅ

ื”ื—ืœื˜ื ื• ื’ื ืœื”ืกืชื›ืœ ืขืœ ืžืฆื‘ ื”ืงื•ื‘ืฅ. ืื ื–ื” ืขื•ื‘ื“ ืžืฆื•ื™ืŸ ืขื ื”ืงื•ื‘ืฅ, ืื– ืื•ืœื™ ืื™ืŸ ืฆื•ืจืš ื‘ืกื•ื›ืŸ, ืœืคื—ื•ืช ืœืฉื™ืžื•ืฉ ืžืงื•ืžื™.

ืœืคื™ ื”ืชื™ืื•ืจ, ืžืฆื‘ ื”ืคืขื•ืœื” ืฆืจื™ืš ืœื”ื™ื•ืช ื“ื•ืžื” ืœื–ื ื‘ -f, ื›ืœื•ืžืจ. ืงื•ืจื ืฉื•ืจื•ืช ื—ื“ืฉื•ืช ืื•, ื›ืื•ืคืฆื™ื”, ืงื•ืจื ืืช ื›ืœ ื”ืงื•ื‘ืฅ.

ืื– ืžื” ืื ื—ื ื• ืจื•ืฆื™ื ืœื”ืฉื™ื’:

  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 ืขื“ื™ื™ืŸ ืœื ืจืื”. ืขื‘ื•ืจ ืื•ืชื ืงื‘ืฆื™ื ืฉื›ื‘ืจ ื”ื™ื• ื‘ืฉื“ื” ื”ืจืื™ื™ื” ืฉืœ logstash, ื”ื•ื ื›ื‘ืจ ื–ื›ืจ ืืช ื’ื•ื“ืœื ื•ื›ืขืช ื™ื™ืงื— ื‘ื”ื ืจืง ืขืจื›ื™ื ื—ื“ืฉื™ื.

ื‘ื•ืื• ื ืขืฆื•ืจ ื›ืืŸ ื•ื ืœืžื“ ืืช ืงื˜ืข ื”ืงืœื˜. ื™ืฉ ืขื“ื™ื™ืŸ ืืคืฉืจื•ื™ื•ืช ืจื‘ื•ืช, ืื‘ืœ ื–ื” ืžืกืคื™ืง ืœื ื• ืœื ื™ืกื•ื™ื™ื ื ื•ืกืคื™ื ืœืขืช ืขืชื”.

ื ื™ืชื•ื‘ ื•ืฉื™ื ื•ื™ ื ืชื•ื ื™ื

ื‘ื•ื ื ื ืกื” ืœืคืชื•ืจ ืืช ื”ื‘ืขื™ื” ื”ื‘ืื”, ื ื ื™ื— ืฉื™ืฉ ืœื ื• ื”ื•ื“ืขื•ืช ืžืขืจื•ืฅ ืื—ื“, ื—ืœืงืŸ ืื™ื ืคื•ืจืžื˜ื™ื‘ื™ื•ืช ื•ื—ืœืงืŸ ื”ื•ื“ืขื•ืช ืฉื’ื™ืื”. ื”ื ืฉื•ื ื™ื ืœืคื™ ืชื’. ื—ืœืงื ื”ื INFO, ืื—ืจื™ื ื”ื ืฉื’ื™ืื”.

ืื ื—ื ื• ืฆืจื™ื›ื™ื ืœื”ืคืจื™ื“ ืื•ืชื ื‘ื™ืฆื™ืื”. ื”ึธื”ึตืŸ. ืื ื• ื›ื•ืชื‘ื™ื ื”ื•ื“ืขื•ืช ืžื™ื“ืข ื‘ืขืจื•ืฅ ืื—ื“, ื•ื”ื•ื“ืขื•ืช ืฉื’ื™ืื” ื‘ืขืจื•ืฅ ืื—ืจ.

ื›ื“ื™ ืœืขืฉื•ืช ื–ืืช, ืขื‘ื•ืจ ืžืงื˜ืข ื”ืงืœื˜ ืœืกื™ื ื•ืŸ ื•ืคืœื˜.

ื‘ืืžืฆืขื•ืช ืงื˜ืข ื”ืกื™ื ื•ืŸ, ื ื ืชื— ืืช ื”ื”ื•ื“ืขื” ื”ื ื›ื ืกืช, ื•ื ืงื‘ืœ ืžืžื ื” hash (ืฆืžื“ื™ ืžืคืชื—-ืขืจืš), ืฉืื™ืชื• ื›ื‘ืจ ื ื•ื›ืœ ืœืขื‘ื•ื“, ื›ืœื•ืžืจ. ืœืคืจืง ืœืคื™ ื”ืชื ืื™ื. ื•ื‘ืžื“ื•ืจ ื”ืคืœื˜ ื ื‘ื—ืจ ื”ื•ื“ืขื•ืช ื•ื ืฉืœื— ื›ืœ ืื—ืช ืœืขืจื•ืฅ ืฉืœื”.

ื ื™ืชื•ื— ื”ื•ื“ืขื” ืขื ื’ืจื•ืง

ืขืœ ืžื ืช ืœื ืชื— ืžื—ืจื•ื–ื•ืช ื˜ืงืกื˜ ื•ืœืงื‘ืœ ืžื”ืŸ ืกื˜ ืฉื“ื•ืช, ื™ืฉื ื• ืชื•ืกืฃ ืžื™ื•ื—ื“ ื‘ืงื˜ืข ื”ืกื™ื ื•ืŸ - grok.

ืžื‘ืœื™ ืœื”ืฆื™ื‘ ืœืขืฆืžื™ ืœืžื˜ืจื” ืœืชืช ืชื™ืื•ืจ ืžืคื•ืจื˜ ืฉืœื• ื›ืืŸ (ื‘ืฉื‘ื™ืœ ื–ื” ืื ื™ ืžืชื™ื™ื—ืก ืชื™ืขื•ื“ ืจืฉืžื™), ืื ื™ ืืชืŸ ืืช ื”ื“ื•ื’ืžื” ื”ืคืฉื•ื˜ื” ืฉืœื™.

ื›ื“ื™ ืœืขืฉื•ืช ื–ืืช, ืขืœื™ืš ืœื”ื—ืœื™ื˜ ืขืœ ื”ืคื•ืจืžื˜ ืฉืœ ืžื—ืจื•ื–ื•ืช ื”ืงืœื˜. ื™ืฉ ืœื™ ืื•ืชื ื›ื›ื”:

ื”ื•ื“ืขืช ืžื™ื“ืข ืื—ืช 1
2 ื”ื•ื“ืขืช ืฉื’ื™ืื”2

ื”ึธื”ึตืŸ. ื”ืžื–ื”ื” ื‘ื ืงื•ื“ื, ื•ืื– INFO/ERROR, ื•ืื– ืื™ื–ื• ืžื™ืœื” ืœืœื ืจื•ื•ื—ื™ื.
ื–ื” ืœื ืงืฉื”, ืื‘ืœ ื–ื” ืžืกืคื™ืง ื›ื“ื™ ืœื”ื‘ื™ืŸ ืืช ืขืงืจื•ืŸ ื”ืคืขื•ืœื”.

ืื–, ื‘ืงื˜ืข ื”ืกื™ื ื•ืŸ ืฉืœ ืชื•ืกืฃ grok, ืขืœื™ื ื• ืœื”ื’ื“ื™ืจ ื“ืคื•ืก ืœื ื™ืชื•ื— ื”ืžื—ืจื•ื–ื•ืช ืฉืœื ื•.

ื–ื” ื™ื™ืจืื” ื›ืš:

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

ื‘ืขื™ืงืจื• ืฉืœ ื“ื‘ืจ ื–ื” ื‘ื™ื˜ื•ื™ ืจื’ื•ืœืจื™. ื ืขืฉื” ืฉื™ืžื•ืฉ ื‘ื“ืคื•ืกื™ื ืžื•ื›ื ื™ื, ื›ื’ื•ืŸ INT, LOGLEVEL, WORD. ืืช ื”ืชื™ืื•ืจ ืฉืœื”ื, ื›ืžื• ื’ื ื“ืคื•ืกื™ื ืื—ืจื™ื, ื ื™ืชืŸ ืœืžืฆื•ื ื›ืืŸ ื›ืืŸ

ื›ืขืช, ื‘ืžืขื‘ืจ ื“ืจืš ื”ืžืกื ืŸ ื”ื–ื”, ื”ืžื—ืจื•ื–ืช ืฉืœื ื• ืชื”ืคื•ืš ืœ-hash ืฉืœ ืฉืœื•ืฉื” ืฉื“ื•ืช: message_id, message_type, message_text.

ื”ื ื™ื•ืฆื’ื• ื‘ืงื˜ืข ื”ืคืœื˜.

ื ื™ืชื•ื‘ ื”ื•ื“ืขื•ืช ืœืžืงื˜ืข ื”ืคืœื˜ ื‘ืืžืฆืขื•ืช ื”ืคืงื•ื“ื” if

ื‘ืงื˜ืข ื”ืคืœื˜, ื›ื–ื›ื•ืจ, ืขืžื“ื ื• ืœืคืฆืœ ืืช ื”ื”ื•ื“ืขื•ืช ืœืฉื ื™ ื–ืจืžื™ื. ื—ืœืงื - ืฉื”ื iNFO, ื™ื™ืฆืื• ืœืงื•ื ืกื•ืœื”, ื•ืขื ืฉื’ื™ืื•ืช, ื ื•ืฆื™ื ืœืงื•ื‘ืฅ.

ืื™ืš ื ืคืจื™ื“ ื‘ื™ืŸ ื”ื”ื•ื“ืขื•ืช ื”ืœืœื•? ืžืฆื‘ ื”ื‘ืขื™ื” ื›ื‘ืจ ืžืฆื™ืข ืคืชืจื•ืŸ - ืื—ืจื™ ื”ื›ืœ, ื›ื‘ืจ ื™ืฉ ืœื ื• ืฉื“ื” message_type ื™ื™ืขื•ื“ื™, ืฉื™ื›ื•ืœ ืœืงื—ืช ืจืง ืฉื ื™ ืขืจื›ื™ื: 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

ื”ื•ืกืคืช ืชื’ื•ื‘ื”