ELK์˜ ์‹ค์ œ ์ ์šฉ. ๋กœ๊ทธ์Šคํƒœ์‹œ ์„ค์ •

์†Œ๊ฐœ

๋‹ค๋ฅธ ์‹œ์Šคํ…œ์„ ๋ฐฐํฌํ•˜๋Š” ๋™์•ˆ ์šฐ๋ฆฌ๋Š” ๋งŽ์€ ์ˆ˜์˜ ๋‹ค์–‘ํ•œ ๋กœ๊ทธ๋ฅผ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•˜๋Š” ํ•„์š”์„ฑ์— ์ง๋ฉดํ–ˆ์Šต๋‹ˆ๋‹ค. ELK๊ฐ€ ๋„๊ตฌ๋กœ ์„ ํƒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ธฐ์‚ฌ์—์„œ๋Š” ์ด ์Šคํƒ์„ ์„ค์ •ํ•œ ๊ฒฝํ—˜์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

๋ชจ๋“  ๊ธฐ๋Šฅ์„ ์„ค๋ช…ํ•˜๋Š” ๋ชฉํ‘œ๋ฅผ ์„ค์ •ํ•˜์ง€๋Š” ์•Š์ง€๋งŒ ์‹ค์งˆ์ ์ธ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐ ์ง‘์ค‘ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ถฉ๋ถ„ํžˆ ๋งŽ์€ ์–‘์˜ ๋ฌธ์„œ์™€ ๊ธฐ์„ฑ ์ด๋ฏธ์ง€๋กœ ์ธํ•ด ๋งŽ์€ ํ•จ์ •์ด ์žˆ๋‹ค๋Š” ์‚ฌ์‹ค ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ ์–ด๋„ ์šฐ๋ฆฌ๋Š” ๊ทธ๊ฒƒ๋“ค์„ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค.

docker-compose๋ฅผ ํ†ตํ•ด ์Šคํƒ์„ ๋ฐฐํฌํ–ˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์ž˜ ์ž‘์„ฑ๋œ docker-compose.yml์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฑฐ์˜ ๋ฌธ์ œ ์—†์ด ์Šคํƒ์„ ์˜ฌ๋ฆด ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์Šน๋ฆฌ๊ฐ€ ์ด๋ฏธ ๊ฐ€๊นŒ์›Œ์ง„ ๊ฒƒ ๊ฐ™์•˜์Šต๋‹ˆ๋‹ค. ์ด์ œ ์šฐ๋ฆฌ์˜ ํ•„์š”์— ๋งž๊ฒŒ ์•ฝ๊ฐ„ ๋น„ํ‹€๋ฉด ๊ทธ๊ฒŒ ๋‹ค์ž…๋‹ˆ๋‹ค.

์•ˆํƒ€๊น๊ฒŒ๋„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋กœ๊ทธ๋ฅผ ์ˆ˜์‹ ํ•˜๊ณ  ์ฒ˜๋ฆฌํ•˜๋„๋ก ์‹œ์Šคํ…œ์„ ์กฐ์ •ํ•˜๋ ค๋Š” ์‹œ๋„๋Š” ๋ฐ”๋กœ ์„ฑ๊ณตํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๊ฐ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๊ฐœ๋ณ„์ ์œผ๋กœ ์—ฐ๊ตฌํ•œ ๋‹ค์Œ ํ•ด๋‹น ์—ฐ๊ฒฐ๋กœ ๋Œ์•„๊ฐˆ ๊ฐ€์น˜๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด์ œ logstash๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

ํ™˜๊ฒฝ, ๋ฐฐํฌ, ์ปจํ…Œ์ด๋„ˆ์—์„œ Logstash ์‹คํ–‰

๋ฐฐํฌ๋ฅผ ์œ„ํ•ด docker-compose๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ ์—ฌ๊ธฐ์— ์„ค๋ช…๋œ ์‹คํ—˜์€ MacOS ๋ฐ Ubuntu 18.0.4์—์„œ ์ˆ˜ํ–‰๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์›๋ž˜ docker-compose.yml์— ์žˆ๋˜ logstash ์ด๋ฏธ์ง€๋Š” docker.elastic.co/logstash/logstash:6.3.2์ž…๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ๊ทธ๊ฒƒ์„ ์‹คํ—˜์— ์‚ฌ์šฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

logstash๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ๋ณ„๋„์˜ docker-compose.yml์„ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ฌผ๋ก  ๋ช…๋ น ์ค„์—์„œ ์ด๋ฏธ์ง€๋ฅผ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ์—ˆ์ง€๋งŒ ๊ฒฐ๊ตญ docker-compose์˜ ๋ชจ๋“  ๊ฒƒ์ด ์‹œ์ž‘๋˜๋Š” ํŠน์ • ์ž‘์—…์„ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ตฌ์„ฑ ํŒŒ์ผ์— ๋Œ€ํ•œ ๊ฐ„๋žตํ•œ ์„ค๋ช…

์„ค๋ช…์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด logstash๋Š” ํ•˜๋‚˜์˜ ์ฑ„๋„์— ๋Œ€ํ•ด ์‹คํ–‰๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ด ๊ฒฝ์šฐ *.conf ํŒŒ์ผ์„ ์ „์†กํ•ด์•ผ ํ•˜๊ฑฐ๋‚˜ ์—ฌ๋Ÿฌ ์ฑ„๋„์— ๋Œ€ํ•ด ์‹คํ–‰๋  ๊ฒฝ์šฐ pipelines.yml ํŒŒ์ผ์„ ์ „์†กํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. , ๊ฐ ์ฑ„๋„์— ๋Œ€ํ•œ .conf ํŒŒ์ผ์„ ์ฐธ์กฐํ•ฉ๋‹ˆ๋‹ค.
์šฐ๋ฆฌ๋Š” ๋‘ ๋ฒˆ์งธ ๊ธธ์„ ํƒํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ์šฐ๋ฆฌ์—๊ฒŒ ๋” ๋‹ค์žฌ๋‹ค๋Šฅํ•˜๊ณ  ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์˜€์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์šฐ๋ฆฌ๋Š” pipelines.yml์„ ์ƒ์„ฑํ•˜๊ณ  ๊ฐ ์ฑ„๋„์— ๋Œ€ํ•œ .conf ํŒŒ์ผ์„ ๋„ฃ์„ ํŒŒ์ดํ”„๋ผ์ธ ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€์—๋Š” ๋˜ ๋‹ค๋ฅธ ๊ตฌ์„ฑ ํŒŒ์ผ์ธ logstash.yml์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๊ทธ๊ฒƒ์„ ๋งŒ์ง€์ง€ ์•Š๊ณ  ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ์šฐ๋ฆฌ์˜ ๋””๋ ‰ํ† ๋ฆฌ ๊ตฌ์กฐ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

ELK์˜ ์‹ค์ œ ์ ์šฉ. ๋กœ๊ทธ์Šคํƒœ์‹œ ์„ค์ •

๋‹น๋ถ„๊ฐ„ ์ž…๋ ฅ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์‹ ํ•˜๊ธฐ ์œ„ํ•ด ํฌํŠธ 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 ์ด๋ฏธ์ง€์—์„œ ํ•˜๋‚˜์˜ ์„œ๋น„์Šค(services) logstash๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์ด๋ฆ„์„ 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์˜ ์‹ค์ œ ์ ์šฉ. ๋กœ๊ทธ์Šคํƒœ์‹œ ์„ค์ •

ํŒŒ์ดํ•‘.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][์˜ค๋ฅ˜][logstash.licensechecker.licensereader] Unable to retrieve license information from license server {:message=>"Elasticsearch Unreachable: [http://elasticsearch:9200/][Manticore ::ํ•ด๊ฒฐ์‹คํŒจ]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::ResolutionFailure] ์—˜๋ผ์Šคํ‹ฑ์„œ์น˜"}
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::ResolutionFailure] ์—˜๋ผ์Šคํ‹ฑ์„œ์น˜"}

๊ทธ๋ฆฌ๊ณ  ์šฐ๋ฆฌ ๋กœ๊ทธ๋Š” ํ•ญ์ƒ ํฌ๋กค๋ง๋ฉ๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์—์„œ ํŒŒ์ดํ”„๋ผ์ธ์ด ์„ฑ๊ณต์ ์œผ๋กœ ์‹œ์ž‘๋˜์—ˆ๋‹ค๋Š” ๋ฉ”์‹œ์ง€๋ฅผ ๋…น์ƒ‰์œผ๋กœ, ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋ฅผ ๋นจ๊ฐ„์ƒ‰์œผ๋กœ, ์—ฐ๊ฒฐ ์‹œ๋„์— ๋Œ€ํ•œ ๋ฉ”์‹œ์ง€๋ฅผ ๋…ธ๋ž€์ƒ‰์œผ๋กœ ๊ฐ•์กฐ ํ‘œ์‹œํ–ˆ์Šต๋‹ˆ๋‹ค. ํƒ„์„ฑ ๊ฒ€์ƒ‰: 9200.
์ด๋Š” ์ด๋ฏธ์ง€์— ํฌํ•จ๋œ logstash.conf์— elasticsearch์˜ ๊ฐ€์šฉ์„ฑ์— ๋Œ€ํ•œ ํ™•์ธ์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๊ฒฐ๊ตญ logstash๋Š” Elk ์Šคํƒ์˜ ์ผ๋ถ€๋กœ ์ž‘๋™ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๊ณ  ๋ถ„๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค.

์ผํ•  ์ˆ˜๋Š” ์žˆ์ง€๋งŒ ํŽธ๋ฆฌํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.

ํ•ด๊ฒฐ์ฑ…์€ 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!"
   }
  } 

์ „์›์„ ์ผœ๋ฉด XNUMX๋ถ„์— ํ•œ ๋ฒˆ์”ฉ ๋ฐ›๊ธฐ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

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. 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์ด๊ณ  ๋‹ค๋ฅธ ์ผ๋ถ€๋Š” ERROR์ž…๋‹ˆ๋‹ค.

์ถœ๊ตฌ์—์„œ ๋ถ„๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ €๊ฒƒ๋“ค. ํ•œ ์ฑ„๋„์—๋Š” ์ •๋ณด ๋ฉ”์‹œ์ง€๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ๋‹ค๋ฅธ ์ฑ„๋„์—๋Š” ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋ฅผ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.

์ด๋ ‡๊ฒŒ ํ•˜๋ ค๋ฉด ์ž…๋ ฅ ์„น์…˜์—์„œ ํ•„ํ„ฐ ๋ฐ ์ถœ๋ ฅ์œผ๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.

ํ•„ํ„ฐ ์„น์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ๋“ค์–ด์˜ค๋Š” ๋ฉ”์‹œ์ง€๋ฅผ ๊ตฌ๋ฌธ ๋ถ„์„ํ•˜์—ฌ ์ด๋ฏธ ์ž‘์—…ํ•  ์ˆ˜ ์žˆ๋Š” ํ•ด์‹œ(ํ‚ค-๊ฐ’ ์Œ)๋ฅผ ์–ป์Šต๋‹ˆ๋‹ค. ์กฐ๊ฑด์— ๋”ฐ๋ผ ํŒŒ์‹ฑํ•ฉ๋‹ˆ๋‹ค. ์ถœ๋ ฅ ์„น์…˜์—์„œ ๋ฉ”์‹œ์ง€๋ฅผ ์„ ํƒํ•˜๊ณ  ๊ฐ ๋ฉ”์‹œ์ง€๋ฅผ ์ž์ฒด ์ฑ„๋„๋กœ ๋ณด๋ƒ…๋‹ˆ๋‹ค.

grok์œผ๋กœ ๋ฉ”์‹œ์ง€ ๊ตฌ๋ฌธ ๋ถ„์„

ํ…์ŠคํŠธ ๋ฌธ์ž์—ด์„ ๊ตฌ๋ฌธ ๋ถ„์„ํ•˜๊ณ  ํ•„๋“œ ์ง‘ํ•ฉ์„ ๊ฐ€์ ธ์˜ค๊ธฐ ์œ„ํ•ด ํ•„ํ„ฐ ์„น์…˜์— ํŠน์ˆ˜ ํ”Œ๋Ÿฌ๊ทธ์ธ์ธ grok๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์— ์ž์„ธํ•œ ์„ค๋ช…์„ ์ œ๊ณตํ•˜๋ ค๋Š” ๋ชฉํ‘œ๋ฅผ ์„ค์ •ํ•˜์ง€ ์•Š๊ณ (์ด์— ๋Œ€ํ•ด์„œ๋Š” ๊ณต์‹ ๋ฌธ์„œ) ๊ฐ„๋‹จํ•œ ์˜ˆ๋ฅผ ๋“ค๊ฒ ์Šต๋‹ˆ๋‹ค.

์ด๋ ‡๊ฒŒ ํ•˜๋ ค๋ฉด ์ž…๋ ฅ ๋ผ์ธ์˜ ํ˜•์‹์„ ๊ฒฐ์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ๋“ค์„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค :

1 ์ •๋ณด ๋ฉ”์‹œ์ง€1
2 ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€2

์ €๊ฒƒ๋“ค. ๋จผ์ € ์‹๋ณ„์ž, INFO/ERROR, ๊ณต๋ฐฑ ์—†๋Š” ๋‹จ์–ด.
์–ด๋ ต์ง€๋Š” ์•Š์ง€๋งŒ ์ž‘๋™ ์›๋ฆฌ๋ฅผ ์ดํ•ดํ•˜๊ธฐ์— ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ํ•„ํ„ฐ ์„น์…˜์˜ 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์˜ ๋‘ ๊ฐ’๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ „์šฉ message_type ํ•„๋“œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. 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

์šฐ๋ฆฌ๋Š” ์‹œ์ž‘ํ•˜๊ณ , ์‹œ๋„ํ•˜๊ณ , ๋‘ ํ๋ฆ„์œผ๋กœ ๋‚˜๋‰˜๋Š” ๊ฒƒ์„ ๋ด…๋‹ˆ๋‹ค.

์ถœ์ฒ˜ : habr.com

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€